Webpack

以下是整合后的 Webpack 详解教程,包括详细的配置、注释、相关案例分析以及图表。

1- Webpack 详解教程

Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它能够将各种静态资源(如 JavaScript、CSS、图像等)视为模块,并生成优化过的代码。以下是对 Webpack 的详细教程,包括图表、注释和相关案例。

1- Webpack 基本概念

2- Entry(入口)

入口是 Webpack 构建内部依赖图的起点。可以指定一个或多个入口文件。

module.exports = {
  entry: './src/index.js', // 单入口
  // 多入口
  // entry: {
  //   app: './src/app.js',
  //   admin: './src/admin.js'
  // }
};

3- Output(输出)

输出属性告诉 Webpack 在哪里输出它所创建的 bundles 以及如何命名这些文件。

const path = require('path');

module.exports = {
  output: {
    filename: 'bundle.js', // 输出文件名
    path: path.resolve(__dirname, 'dist') // 输出路径
  }
};

4- Loaders(加载器)

加载器让 Webpack 能够处理那些非 JavaScript 文件。常见的加载器有 css-loaderstyle-loaderfile-loader 等。

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/, // 匹配所有的 .css 文件
        use: ['style-loader', 'css-loader'] // 使用这两个 loader 处理 CSS 文件
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i, // 匹配图片文件
        type: 'asset/resource' // 使用资源模块处理图片
      }
    ]
  }
};

5- Plugins(插件)

插件用于执行范围更广的任务,包括打包优化、资源管理和环境变量注入等。

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

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Webpack Example', // 设置生成的 HTML 文件的标题
      template: './src/index.html' // 指定模板文件
    })
  ]
};

6- Mode(模式)

Webpack 4 引入了 mode 配置选项,允许用户指定当前构建的模式(development、production 或 none)。

module.exports = {
  mode: 'development' // 开发模式
  // mode: 'production' // 生产模式
};

7- Webpack 配置示例

以下是一个完整的 Webpack 配置文件示例:

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

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.(png|svg|jpg|jpeg|gif)$/i,
        type: 'asset/resource'
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'Webpack Example',
      template: './src/index.html'
    })
  ],
  mode: 'development'
};

8- 依赖关系图

Webpack 会递归地构建一个依赖关系图(Dependency Graph),如下图所示:

graph TD;
  A[入口文件 index.js] --> B[模块1 module1.js];
  A --> C[模块2 module2.js];
  B --> D[模块3 module3.js];
  C --> E[模块4 module4.js];

9- 案例分析

9.1- 案例1:简单的 JavaScript 打包

9.1.1- 项目结构

project
├── dist
│   └── index.html
├── src
│   ├── index.js
│   └── module.js
├── package.json
└── webpack.config.js

9.1.2- 代码示例

src/index.js:

import { greet } from './module.js';

greet('Webpack');

src/module.js:

export function greet(name) {
  console.log(`Hello, ${name}!`);
}

dist/index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Webpack Example</title>
</head>
<body>
  <script src="bundle.js"></script>
</body>
</html>

9.1.3- 运行 Webpack

在项目根目录下运行以下命令:

npx webpack

生成的 dist/bundle.js 文件将包含所有模块的代码,并可以在浏览器中运行。

10- 可视化工具

使用 Webpack Bundle Analyzer 可以生成一个图表,帮助可视化了解项目的依赖关系、模块大小及耗时等。

npm install --save-dev webpack-bundle-analyzer

在 Webpack 配置文件中添加插件:

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');

module.exports = {
  // 其他配置
  plugins: [
    new BundleAnalyzerPlugin()
  ]
};

运行 Webpack 后,将生成一个可视化报告,帮助分析打包性能瓶颈。

11- 可视化图表示例

以下是使用 Webpack Bundle Analyzer 生成的可视化图表示例:

graph TD;
  A[入口文件 index.js] --> B[模块1 module1.js];
  A --> C[模块2 module2.js];
  B --> D[模块3 module3.js];
  C --> E[模块4 module4.js];