首页 > 其他分享 >30分钟掌握 Webpack

30分钟掌握 Webpack

时间:2022-09-26 23:36:23浏览次数:78  
标签:文件 dist 30 webpack js loader Webpack 分钟 打包

本文基于:峰华前端工程师--30分钟掌握Webpack

为什么使用 Webpack

在我们进行传统网页开发中,会在 index.html 中引入大量的 jscss 文件,不仅可能会导致命名冲突,还会使页面体积变大,因为如果引用了第三方库,需要加载所有的代码。而在 node.js 出现后,javascript 项目支持通过 require 支持模块化开发了,并且支出 npm 方便地管理依赖。
借着 node.js 和浏览器js 的一致性,前端项目开始在 node.js 下开发,完成之后把代码构建成浏览器支持的形式。对于 reactvue 这种组件化的开发方式,因为有很多分散的文件,那么久特别需要这样的构建操作。
Webpack 就是进行这一步构建操作的,把 node.js 模块化的代码转化为浏览器可执行的代码。它提供了 importexport ES6模块化语法的支持,然后通过分析代码中 import 导入的依赖,把需要的代码加载进来。在 Webpack 中,任何文件都可以通过 import 导入,只要有对应的 loader 就可以了。在打包过程中,还可以通过插件来干预打包过程,例如剔除不必要的代码,形成体积更小的项目。

创建项目

  • 打开命令行工具,我们在这里创建一个名为 blog 的博客项目:

    mkdir blog
    cd blog
    yarn init -y
      (或者npm init)
    
  • 添加 webpack 依赖:

    yarn add webpack webpack-cli --dev
    
  • 使用 VSCode 打开项目:

    code .
    

初出茅庐

  • blog 项目下新建 src 文件下,创建 index.js

    console.log("Hello World");
    

    我们先只做一个简单的输出.

  • blog 项目下新建 index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <h1>Hello World</h1>
      <script src="./dist/index.js"></script>
    </body>
    </html>
    
  • 使用 LiveServer 查看刚刚所编写的 html页面:

    可以看到浏览器成功显示了 "Hello World",并且控制台也能够成功输出.

  • 尝试使用 webpack 打包

    打开控制台,输入 npx webpack

npx 能够直接运行 node_modules 下面安装的库的自带的命令行,而不用写 node_modules 下一串的绝对路径。

打包完成后可以看到项目里面生成了一个 dist 目录,里面有一个 main.js 文件,其内部的内容和我们刚刚所编写的 index.js 的文件一模一样,这是因为我们并没有使用任何 import 来导入其他的依赖。

使用 import 导入依赖

  • src 下新建一个 data.js 文件:

    export function getBlogPosts() {
      return ["博客1", "博客2", "博客3"];
    }
    
  • index.js 中导入 data.js 中的函数并调用:

    import { getBlogPosts } from "./data";
    
    console.log(getBlogPosts());
    
  • 重新使用 webpack 打包以下,查看结果:

    npx webpack
    

    现在进入 /dist/main.js 中看一下,代码被简化成了直接输出刚才我们所编写的数组的语句,说明 webpack 自动判断了我们所编写代码的逻辑,并通过 import 语句得到了我们所引入的代码,分析后生成新的 js 文件.

  • 在网页中查看下结果:

    成功地输出了数组.

Webpack 配置文件

webpack 的配置文件可以说是 webpack 最核心的部分了,我们可以在配置文件中修改入口和出口文件、通过 loader 加载不同类型的文件和使用 plugins 对代码做其他的操作。

尝试修改打包后生成文件的名称

  • 在项目中新建 webpack.config.js 文件:

    const path = require("path");
    
    module.export = {
      mode: "development",
      // 设置为开发模式,方便调试
      entry: "./src/index.js",
      output: {
        filename: "dist.js",
        path: path.resolve(__dirname, "dist"),
        // 设置文件名和目录
      }
    }
    
  • 执行 npx webpack 命令打包

    可以看到 dist 文件夹下多了个 dist.js 文件.

使用模块化语法

  • 修改 /index.htmlscript 标签:

    <script src="./dist/dist.js"></script>
    

    main.js 修改成为我们刚刚使用 webpack 打包生成的 dist.js

  • 修改 /src/index.js 文件,将之前编写的数组变成 ul 元素插入页面中:

    const blogs = getBlogPosts();
    
    const ul = document.createElement("ul");
    blogs.forEach(blog => {
      const li = document.createElement("li");
      li.innerText = blog;
      ul.appendChild(li);
    })
    
    document.body.appendChild(ul);
    
  • npx webpack

    列表成功插入到了页面.

引入 css

  • src 下新建 style.css 文件:

    h1 {
      color: blueviolet;
    }
    

    这里只是简单地改变 h1 标签的颜色.

  • /src/index.js 中引入 css 文件:

    import "./style.css";
    
  • 安装 loader

    打开控制台,输入:

    yarn add --dev style-loader css-loader
    
  • webpack.config.js 中配置 loader

    module.exports = {
      mode: "development",
      output: {...},
      ...
    
      module: {
        rules: [{
          test: /\.css$/i,
          use: ["style-loader", "css-loader"],
        }]
      }
    }
    

    module -> rules -> test 内是一个正则表达式,表示以 .css 结尾的文件.
    use 属性下是所使用的 loader

  • 再次使用 npx webpack 打包:

    可以看到,刚才写的样式生效了.

加载图片

  • webpack 原生支持图片等静态文件,但是需要在 webpack.config.js 中编写配置:

    module.exports = {
      ...
      module: {
        rules: [
        ...
        {
          test: /\.(png|svg|jpg|jpeg|gif)$/i,
          type: "assets/resource",
        }]
      }
    }
    
  • src 下载新建 assets/ 文件夹,放入一张图片:

  • index.js 中引入图片:

    import AbcImage from "./assets/abc.png"
    
    ...
    
    const image = document.createElement("img");
    image.src = AbcImage;
    
    document.body.prepend(image);
    
  • npx webpack

自动生成 HTML

上述的例子中,我们只是使用 webpack 来打包 jscss 文件,并手动的导入编写好的 html 中,使用下面的插件,就可以自动为我们生成 HTML 文件。

  • 安装插件:

    yarn add html-webpack-plugin --dev
    
  • 使用插件:

    const HtmlWebpackPlugin = require("html-webpack-plugin");
    ...
    
    plugins: [new HtmlWebpackPlugin({
      title: "博客列表",
      // 这里可以自定义网页的标题
    })],
    
  • npx webpack

    可以看到生成了和刚才相同的页面

使用 webpack 打包出来的网页没有显示 <h1>Hello World</h1> 的原因是 这个标签是我们自己写的

标签:文件,dist,30,webpack,js,loader,Webpack,分钟,打包
From: https://www.cnblogs.com/hhsk/p/16732955.html

相关文章

  • 已知A矩阵为: 4 20 12 8 3 15 0 40 8 22 12 36 11 30 18 46
    已知A矩阵为: 4  20 12 8 3  15  0 40 8  22 12 36 11 30 18 46 将A中元素能被3整除的,全部置0  要求输出4200......
  • 已知A矩阵为: 4 20 12 8 3 15 0 40 8 22 12 36 11 30 18 46
    已知A矩阵为: 4  20 12 8 3  15  0 40 8  22 12 36 11 30 18 46 将A中元素大于10且小于25的数找出来,并输出该值在矩阵中的坐标......
  • 已知A矩阵为: 4 20 12 8 3 15 0 40 8 22 12 36 11 30 18 46 将A中
    已知A矩阵为:4  20 12 83  15  0 408  22 12 3611 30 18 46将A中元素小于等于12全部置0要求输出02000015040......
  • CF1730
    感觉这场的题目出得很好啊,让人忍不住想记录下来!赛时通过ABCD,rank\(76\)。A把每一种数的出现次数和\(c\)取个\(\min\)再求和即可。B记\(l=\min_i\{a_i-t......
  • 【前端必会】webpack loader 到底是什么
    概述webpack的使用中我们会遇到各种各样的插件、loader。webpack的功力主要体现在能理解各个插件、loader的数量上。理解的越多功力越深loader是什么呢?背景了解load......
  • 计算0-30,0-50,90-1000之间的奇数之和。
    function sum(min,max){    varsum=0;    for(i=min;i<=max;i++){if(i%2!=0){sum+=i;}}returnsum;}sum(0,30);sum(0,50);sum(9,1......
  • 花2个月面过华为测开岗,拿个30K不过分吧?
    背景介绍美本计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三暑假回国的时间比......
  • Webpack之抽离压缩css
    使用 mini-css-extract-plugin插件的内置loader替换style-loader使用 terser-webpack-plugin插件压缩js代码使用 optimize-css-assets-webpack-plugin插件压缩cs......
  • Webpack之拆分/合并配置
    使用webpack-merge 合并配置然后对应script为:build:devwebpack--configwebpack.dev.config.jsbuild webpack--configwebpack.prod.config.js//webpack.base.c......
  • 你需要知道的webpack高频面试题
    谈谈你对webpack的看法webpack是一个模块打包工具,可以使用它管理项目中的模块依赖,并编译输出模块所需的静态文件。它可以很好地管理、打包开发中所用到的HTML,CSS,JavaScr......