目的:

  • 能够将散落的模块打包到一起;
  • 能够编译代码中的新特性;
  • 能够支持不同种类的前端资源模块。

目前,前端领域最为主流打包工具就是 Webpack、Parcel 和 Rollup;

  • Webpack 作为一个模块打包工具,本身就可以解决模块化代码打包的问题,将零散的 JavaScript 代码打包到一个 JS 文件中。
  • 对于有环境兼容问题的代码,Webpack 可以在打包过程中通过 Loader 机制对其实现编译转换,然后再进行打包。
  • 对于不同类型的前端模块类型,Webpack 支持在 JavaScript 中以模块化的方式载入任意类型的资源文件,例如,我们可以通过 Webpack 实现在 JavaScript 中加载 CSS 文件,被加载的 CSS 文件将会通过 style 标签的方式工作

Webpack 还具备代码拆分的能力,它能够将应用中所有的模块按照我们的需要分块打包;这样一来,就不用担心全部代码打包到一起,产生单个文件过大,导致加载慢的问题。我们可以把应用初次加载所必需的模块打包到一起,其他的模块再单独打包,等到应用工作过程中实际需要用到某个模块,再异步加载该模块,实现增量加载,或者叫作渐进式加载,非常适合现代化的大型 Web 应用。

webpack 打包 官网

由于 Webpack 是一个 npm 工具模块,所以我们先初始化一个 package.json 文件,用来管理 npm 依赖版本,完成之后,再来安装 Webpack 的核心模块以及它的 CLI 模块,

  1. npm init --yes || yarn init --yes
  2. npm install webpack webpack-cli || yarn add webpack webpack-cli

webpack 是 Webpack 的核心模块,webpack-cli 是 Webpack 的 CLI 程序,用来在命令行中调用 Webpack,可根据 npx webpack --version 查看webpack版本, npx webpack 是执行打包的命令

image.png

  • 新建一个main.js和index.html文件
    1. // main.js
    2. const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    3. // 在html中引入了lodash
    4. const newArray = _.chunk(array, 2);
    5. console.log(newArray); // [[1, 2] [3, 4], [5, 6], [7, 8], [9, 10]]
    1. <!--index.html-->
    2. <!DOCTYPE html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>webpack bundle</title>
    8. </head>
    9. <body>
    10. <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>
    11. <script type="module" src="./main.js"></script>
    12. </body>
    13. </html>
    然后用浏览器打开这个文件,控制台可查看
    image.png
    所以以上我们环境和代码是可行的,下面来使用webpack打包,首先介绍几个属性:
    • entry: 指定webpack打包的入口文件路径
    • output: 设置输出文件的位置。output 属性的值必须是一个对象,通过这个对象的 filename 指定输出文件的文件名称,path 指定输出的目录
      • filename
      • path
    • mode: 编译模式,如果未设置,则webpack设置productionmode的默认值。
      • development 启动内置优化插件,自动优化打包结果,打包速度偏慢
      • production 自动优化打包速度,添加一些调试过程中的辅助插件
      • none 运行最原始的打包,不做任何额外处理。

新建目录如下:

  1. webpack
  2. ├── src
  3. ├── index.html
  4. └── main.js
  5. ├── package.json
  6. ├── webpack.config.js
  7. └── yarn.lock
  1. // webpack.config.js
  2. const path = require("path")
  3. module.exports = {
  4. entry: "./src/main.js", // entry指定webpack打包的入口文件路径
  5. mode: "none", // development production none 如果未设置,则webpack设置production为的默认值mode。
  6. output: {
  7. // output 属性设置输出文件的位置。output 属性的值必须是一个对象,通过这个对象的 filename 指定输出文件的文件名称,path 指定输出的目录
  8. filename: "bundle.js",
  9. path: path.join(__dirname, "dist"),
  10. },
  11. }

然后将package.json文件的修改成如下:

安装了 lodash 快速整合功能

  1. // package.json
  2. {
  3. "name": "bundle",
  4. "version": "1.0.0",
  5. "private": true,
  6. "license": "MIT",
  7. "scripts": {
  8. "dev": "npx webpack"
  9. },
  10. "dependencies": {
  11. "lodash": "^4.17.20",
  12. "webpack": "^5.14.0",
  13. "webpack-cli": "^4.3.1"
  14. }
  15. }

在index.html中添加内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>webpack bundle</title>
  7. </head>
  8. <body>
  9. <script src="../dist/bundle.js"></script>
  10. </body>
  11. </html>

main.js内容如下:

  1. import _ from "lodash";
  2. function component() {
  3. let element = document.createElement("div");
  4. element.innerHTML = _.join(["Hello", "webpack"], " ");
  5. return element;
  6. }
  7. document.body.appendChild(component());

然后再控制台中执行命令:

  1. yarn dev

执行命令后会在项目的根目录生成dist文件夹(也就是打包编译后的文件夹)。
查看浏览器如图内容:
image.png