【青训营】webpack知识体系

89 阅读7分钟

这是我参与「第五届青训营 」笔记创作活动的第13天

前言

为什么要学习webpack?

  1. 提高项目的开发效率:Webpack 可以自动管理你的模块依赖关系,帮助你更方便地管理项目中的资源文件。
  2. 增强项目的可维护性:Webpack 可以帮助你把代码分成不同的模块,这有助于提高代码的可维护性。
  3. 优化项目的性能:Webpack 可以帮助你对项目中的静态资源进行压缩、合并和优化,从而提高项目的性能。
  4. 支持多种前端技术:Webpack 支持多种前端技术,比如说 JavaScript、CSS、Sass、TypeScript 等,这样你就可以使用你熟悉的技术来开发项目。

总之,学习 Webpack 可以帮助你更有效地开发、管理和优化前端项目,提高项目的效率和可维护性。

什么叫webpack工程化?

Webpack 工程化体现在以下几个方面:

  1. 资源管理:Webpack 可以管理项目中的各种资源(如 JavaScript、CSS、图片、字体等),并将它们统一打包。
  2. 模块化:Webpack 支持 CommonJS 和 ECMAScript 模块化规范,可以帮助你将项目中的代码拆分成多个模块,方便维护和管理。
  3. 代码分离:Webpack 可以帮助你将项目中的代码分离成不同的块(如公共代码、第三方库代码、业务代码等),有助于提高项目的性能。
  4. 代码优化:Webpack 可以对代码进行压缩、合并、混淆等优化处理,有助于降低代码的体积和提高代码的性能。
  5. 自动化:Webpack 可以帮助你自动完成项目的构建、打包、测试、发布等任务,大大提高了项目的开发效率。

1.webpack管理文件

Webpack 可以帮助你管理项目中的文件,包括 JavaScript、CSS、图片、字体等等。当你引入这些文件的时候,Webpack 可以帮助你自动处理它们之间的依赖关系,并且可以对它们进行打包、合并和优化。

下面是一个使用 Webpack 引入文件的例子:

javascript
// 在 JavaScript 中引入 CSS 文件
import './index.css';

// 在 JavaScript 中引入图片
import logo from './logo.png';

// 使用图片
const img = new Image();
img.src = logo;
document.body.appendChild(img);

如果你在 CSS 中引入了图片,Webpack 还可以帮助你自动处理图片的引入:

css
.logo {
  background-image: url('./logo.png');
}

在 Webpack 中,你还可以使用别名来简化文件的引入:

javascript
// webpack.config.js
module.exports = {
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
};
javascript
// 使用别名引入文件
import '@/index.css';
import logo from '@/logo.png';

通过使用 Webpack,你可以方便地管理项目中的文件,避免重复引入和更好地维护项目。

2.webpack核心打包流程

  1. 解析入口文件:Webpack 会读取项目中的入口文件,并将其解析为依赖树。
  2. 处理模块依赖:Webpack 会递归处理依赖树中的每个模块,并将它们转换为可执行的 JavaScript 代码。
  3. 生成代码块:Webpack 会将处理完的模块编译为代码块,代码块可以是单独的文件,也可以是一组相关的文件。
  4. 加载器处理:Webpack 会使用加载器处理生成的代码块,加载器可以对代码块进行预处理、编译、转换等操作。
  5. 输出文件:最后,Webpack 会将代码块输出到项目的打包目录,并生成对应的资源文件,如 CSS、图片等。

3.webpack使用方法

使用 Webpack 的步骤如下:

  1. 安装:使用 npm 安装 Webpack 和 webpack-cli:npm install webpack webpack-cli --save-dev。
  2. 配置:在项目根目录下新建一个名为 webpack.config.js 的配置文件。
  3. 入口:配置 Webpack 入口文件。
  4. 输出:配置 Webpack 输出文件。
  5. 模块:配置 Webpack 模块加载器。
  6. 插件:配置 Webpack 插件。
  7. 运行:运行 Webpack 构建命令:npx webpack。

3.1webpack常见配置

以下是常用的 11 个 Webpack 配置:

  1. entry:入口文件。

entry 配置项用于指定 Webpack 的入口文件,可以是单个文件或多个文件的数组。

代码举例:

java
module.exports = {
  entry: './src/index.js',
};
  1. output:输出文件。

output 配置项用于指定 Webpack 的输出文件,可以是单个文件或多个文件的数组。

代码举例:

lua
module.exports = {
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
};
  1. module:模块加载器。

module 配置项用于配置 Webpack 的模块加载器,用于处理不同类型的模块。

代码举例:

javascript
module.exports = {
  module: {
    rules: [
      {
        test: /.(js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader'],
      },
      {
        test: /.css$/,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
};
  1. plugins:插件。

plugins 配置项用于配置 Webpack 的插件,用于扩展 Webpack 的功能。

代码举例:

javascript
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
  ],
};
  1. devServer:开发服务器。

devServer 配置项用于配置 Webpack 开发服务器,用于提供一个方便的开发环境。

代码举例:

java
module.exports = {
  devServer: {
    contentBase: './dist',
    hot: true,
  },
};
  1. mode:构建模式。

mode 配置项用于配置 Webpack 构建的模式,可以是 "development"、"production" 或 "none"。

代码举例:

java
module.exports = {
  mode: 'development',
};
  1. optimization:优化。

optimization 配置项用于配置 Webpack 的优化选项,用于提高构建效率。

代码举例:

java
module.exports = {
  optimization: {
    minimize: true,
  },
};
  1. externals:外部依赖。

externals 配置项用于配置 Webpack 构建时不需要打包的外部依赖。

代码举例:

java
module.exports = {
  externals: {
    react: 'React',
    'react-dom': 'ReactDOM',
  },
};
  1. performance:性能。

performance 配置项用于配置 Webpack 的性能选项,用于限制文件的大小。

代码举例:

yaml
module.exports = {
  performance: {
    hints: 'warning',
    maxAssetSize: 1024000,
    maxEntrypointSize: 1024000,
  },
};
  1. resolve 配置: 用来配置 Webpack 如何寻找模块所对应的文件。通过设置 extensions 可以指定查找文件的后缀名,例如上面的配置可以支持 .js 和 .jsx 两种文件类型。通过设置 alias 可以给模块定义别名,在代码中引用模块时可以直接使用别名。
java
module.exports = {
  resolve: {
    extensions: ['.js', '.jsx'],
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
};
  1. devtool 配置: 用来配置 Source Map。Source Map 可以方便地将打包后的代码映射到源代码上,便于调试。通过设置 devtool 为 'inline-source-map' 可以在打包后的文件中内嵌 Source Map,便于调试。
java
module.exports = {
  devtool: 'inline-source-map',
};

补充:

1.tree-shaking 是一种静态分析技术,它可以通过分析代码中的引用关系,去除掉没有使用到的模块。这样可以减小代码体积,提高代码的加载速度。

Webpack 在打包过程中可以支持 tree-shaking,并且对于 ES6 的模块语法,它能够自动检测到没有使用到的模块,并且在打包时去除掉它们。因此,开发者无需额外的操作,只需写出规范的模块代码即可。

要注意的是,tree-shaking 仅能在开发者使用了 ES6 的模块语法时生效,对于其他的模块语法(如 CommonJS)需要额外的配置。

4.理解loader

Loader 是 webpack 中一种重要的概念,它可以让你对各种不同类型的文件,例如图片、字体、样式文件等进行处理。这些文件被称为资源文件,它们不能直接被打包和使用,需要先经过处理才能被正确地引入到代码中。

使用 Loader 可以实现对资源文件的处理,例如转换格式,提取源代码中的图片,编译 SCSS 文件等。 Loader 可以让你按照自己的需求配置处理规则,使你的代码开发和维护更加简单高效。

使用 Loader 的方法非常简单,首先,你需要安装相关的 Loader,然后在 webpack 配置文件中的 module.rules 字段中进行配置。在配置中,你需要指定 Loader 的名称,并且指定处理的文件类型。

以下是一个使用 Loader 转换 SCSS 文件的代码示例:

lua
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
  module: {
    rules: [
      {
        test: /.scss$/,
        use: [
          'style-loader',
          'css-loader',
          'sass-loader',
        ],
      },
    ],
  },
};

上述代码示例中,我们为 webpack 配置了一个 module.rules 数组,这个数组用于定义对于不同文件类型,使用哪些 loader 进行处理。

每一个配置规则都包含了一个 test 属性,它表示这个规则将会匹配哪些文件;一个 use 属性,它表示对于匹配到的文件,使用哪些 loader 进行处理。

比如:

javascript
{
  test: /.css$/,
  use: ['style-loader', 'css-loader']
}

这个配置规则表示对于所有以 .css 结尾的文件,使用 style-loadercss-loader 两个 loader 进行处理。

通过使用不同的 loader,我们可以将不同类型的文件转换为可以在浏览器中使用的代码,比如将 .css 文件转换为 JavaScript 模块。这样,我们可以轻松地处理各种不同类型的文件,并且方便地维护和更新代码。