{T}

二、核心概念一:入口(Entry)

2.1 概念理解

定义:

入口是 Webpack 构建依赖图的起点,Webpack 从入口文件开始,递归解析所有依赖的模块。

工作原理:

code
入口文件 (entry.js)
    ↓
解析 import/require
    ↓
构建模块依赖图 (Dependency Graph)
    ↓
安排不同 Loader 处理各类型文件
    ↓
输出最终 Bundle

2.2 为什么需要入口?

Webpack 本身只能理解:

  • JavaScript 文件
  • JSON 文件

无法直接处理的文件:

code
 .sass/.scss - CSS 预处理器
 .vue        - Vue 单文件组件
 .jsx/.tsx   - React/Vue JSX 语法
 .jpg/.png   - 图片资源
 .woff/.ttf  - 字体文件

解决方案:

code
入口文件 → 依赖分析 → Loader 转换 → 输出 Bundle

2.3 入口配置语法

方式一:单入口(字符串)

javascript
// webpack.config.js
module.exports = {
  entry: './src/index.js'
};

适用场景:

  • 单页应用(SPA)
  • 简单项目

方式二:多入口(数组)

javascript
module.exports = {
  entry: ['./src/a.js', './src/b.js']
};

特点:

  • 多个入口文件打包到一个 Bundle
  • 适用场景:需要合并多个文件的场景

方式三:多入口(对象)

javascript
module.exports = {
  entry: {
    main: './src/index.js',
    admin: './src/admin.js'
  }
};

输出结果:

code
dist/
├── main.js
└── admin.js

适用场景:

  • 多页应用(MPA)
  • 按功能模块分离打包

方式四:高级配置(依赖共享)

javascript
module.exports = {
  entry: {
    // 主应用入口
    app: {
      import: './src/app.js',
      dependOn: 'react-vendors',  // 依赖共享模块
    },
    // React 相关库单独打包
    'react-vendors': {
      import: ['react', 'react-dom', 'prop-types'],
    },
    // 另一个入口,依赖共享模块
    testApp: {
      import: './src/testApp.js',
      dependOn: ['react-vendors', 'moment-vendors'],
    },
    // Moment.js 单独打包
    'moment-vendors': {
      import: 'moment',
    },
  }
};

关键属性说明:

属性说明
import入口文件路径
dependOn依赖的共享模块
runtime运行时 Chunk 名称(可选)
filename指定输出文件名(可选)

runtime 属性详解:

javascript
entry: {
  testApp: {
    import: './src/testApp.js',
    dependOn: ['react-vendors'],
    runtime: 'runtime'  // 创建独立的运行时 Chunk
  }
}

作用:

  • 创建独立的运行时 Chunk
  • 方便多个入口共享同一份运行时代码
  • Webpack 5.43.0+ 可设为 false 避免创建新运行时 Chunk

2.4 学习技巧

遇到看不懂的配置?

code
步骤 1:复制配置代码
    ↓
步骤 2:创建 webpack.config.js
    ↓
步骤 3:修改为本地文件路径
    ↓
步骤 4:执行 npx webpack
    ↓
步骤 5:查看打包结果,理解配置效果

三、核心概念二:输出(Output)

3.1 概念理解

定义:

告诉 Webpack 在哪里输出构建完成的 Bundle,以及如何命名这些文件。

3.2 默认配置

javascript
// 不配置 output 时的默认值
module.exports = {
  output: {
    path: path.resolve(__dirname, 'dist'),  // 输出目录
    filename: '[name].js',                   // 输出文件名
  }
};

3.3 常用配置属性

javascript
module.exports = {
  output: {
    // 输出目录(绝对路径)
    path: path.resolve(__dirname, 'dist'),
    
    // 输出文件名
    filename: 'bundle.js',
    // 或使用占位符
    filename: '[name].[contenthash].js',
    
    // 公共路径
    publicPath: 'auto',
    
    // 库文件配置
    library: {
      name: 'MyLibrary',
      type: 'umd',
    },
    
    // 清理旧文件(Webpack 5+)
    clean: true,
  }
};

占位符说明:

占位符说明示例
[name]入口名称main.js
[contenthash]内容哈希main.abc123.js
[id]Chunk ID1.js
[chunkhash]Chunk 哈希main.def456.js

3.4 library 配置详解

使用场景: 打包一个库(Library)供其他项目使用

javascript
output: {
  library: {
    name: 'MyLibrary',    // 库名称
    type: 'umd',          // 输出格式
    export: 'default',    // 指定导出项
  }
}

type 支持的模块规范:

javascript
type 可选值:
┌─────────────────────────────────────────┐
│ 模块规范         │ 说明                 │
├─────────────────────────────────────────┤
│ 'var'           │ 全局变量             │
│ 'assign'        │ 全局变量赋值         │
│ 'this'          │ this 对象属性        │
│ 'window'        │ window 对象属性      │
│ 'self'          │ self 对象属性        │
│ 'global'        │ global 对象属性      │
│ 'commonjs'      │ CommonJS 规范        │
│ 'commonjs2'     │ CommonJS2 规范       │
│ 'amd'           │ AMD 规范             │
│ 'umd'           │ UMD 规范(通用)     │
│ 'module'        │ ES Module 规范       │
│ 'commonjs-module' │ CommonJS 模块      │
│ 'jsonp'         │ JSONP 加载           │
└─────────────────────────────────────────┘

从 type 值看出 Webpack 生态之丰富:

几乎涵盖了前端发展历程中所有的模块规范,这就是 Webpack 作为老大哥的实力。

3.5 publicPath 配置

作用: 设置资源的公共路径前缀

javascript
output: {
  publicPath: 'auto',      // 自动推断
  publicPath: '/',         // 根路径
  publicPath: '/assets/',  // 指定路径
  publicPath: 'https://cdn.example.com/', // CDN 路径
}

使用场景:

  • 静态资源部署到 CDN
  • 资源路径需要前缀

四、核心概念三:Loader

4.1 概念理解

定义:

Webpack 只能理解 JavaScript 和 JSON 文件。Loader 让 Webpack 能够处理其他类型的文件,将它们转换为有效模块。

4.2 Loader 的作用

code
源文件类型          Webpack 是否识别        Loader 转换
──────────────────────────────────────────────────────
.js                 直接识别             不需要
.json               直接识别             不需要
.ts/.tsx            不识别               ts-loader
.jsx/.tsx           不识别               babel-loader
.vue                不识别               vue-loader
.sass/.scss         不识别               sass-loader
.less               不识别               less-loader
.css                部分识别             css-loader
.jpg/.png/.gif      不识别               asset/resource
.svg                不识别               @svgr/webpack

4.3 配置语法

javascript
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,           // 匹配文件
        use: ['style-loader', 'css-loader'],  // 使用的 Loader
        include: path.resolve(__dirname, 'src'),  // 包含范围
        exclude: /node_modules/,  // 排除范围
      }
    ]
  }
};

核心属性:

属性类型说明
testRegExp匹配文件的正则表达式
useArray/Object使用的 Loader
includeString/Array/RegExp包含的文件范围
excludeString/Array/RegExp排除的文件范围
loaderString单个 Loader 的简写

4.4 如何找到合适的 Loader?

方法一:npm 搜索

bash
# 搜索 TypeScript Loader
npm search webpack typescript loader

# 搜索 SVG Loader
npm search webpack svg loader

# 搜索 Sass Loader
npm search sass loader

常用 Loader:

文件类型Loader说明
TypeScriptts-loaderTS 编译
TypeScriptbabel-loader + @babel/preset-typescriptBabel 编译 TS
JSXbabel-loaderReact/Vue JSX
Vuevue-loaderVue SFC
Sasssass-loaderSass/Scss 编译
Lessless-loaderLess 编译
CSScss-loader + style-loaderCSS 处理
图片asset/resource图片资源(Webpack 5 内置)
SVG@svgr/webpackSVG 转 React 组件

方法二:Webpack Awesome

code
https://github.com/webpack-contrib/awesome-webpack

方法三:官方文档

在配置文档中搜索文件类型,查看推荐的 Loader。

4.5 Loader 执行顺序

重要规则:Loader 从右往左执行,从下往上执行

javascript
// 数组形式:从右往左
use: ['style-loader', 'css-loader', 'sass-loader']

执行顺序:
sass-loader → css-loader → style-loader
    ↓              ↓              ↓
编译 Sass      转换 CSS      注入到页面
javascript
// 对象形式:从下往上
use: [
  { loader: 'style-loader' },
  { loader: 'css-loader' },
  { loader: 'sass-loader' }
]

执行顺序:
sass-loader(最后)
    ↓
css-loader
    ↓
style-loader(最先)

为什么是这个顺序?

code
源文件: style.scss
    ↓
sass-loader: 编译 Sass → CSS
    ↓
css-loader: 解析 CSS 中的 @import、url() 等
    ↓
style-loader: 将 CSS 注入到页面 <style> 标签

4.6 最佳实践

javascript
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        //  推荐使用 include
        include: path.resolve(__dirname, 'src'),
        //  不推荐使用 exclude(范围太大)
        // exclude: /node_modules/,
        
        //  推荐使用绝对路径
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
};

最佳实践要点:

要点说明
使用 include 而非 exclude更精确的范围控制
使用绝对路径避免路径歧义
正则交给 AIAI 工具可快速生成正则

五、核心概念四:插件(Plugin)

5.1 概念理解

定义:

插件可以干预整个 Webpack 构建流程,实现 Loader 无法完成的任务。

5.2 Plugin 与 Loader 的区别

code
┌─────────────────────────────────────────────────────┐
│                 Loader                              │
├─────────────────────────────────────────────────────┤
│ 针对对象:单一类型文件                               │
│ 作用范围:文件内容转换                               │
│ 工作方式:从源文件转换为目标格式                      │
│ 示例:vue-loader 处理 .vue 文件                     │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│                 Plugin                              │
├─────────────────────────────────────────────────────┤
│ 针对对象:整个构建流程                               │
│ 作用范围:流程干预、优化、资源管理等                  │
│ 工作方式:监听构建生命周期钩子                        │
│ 示例:HtmlWebpackPlugin 生成 HTML 文件              │
└─────────────────────────────────────────────────────┘

5.3 Plugin 的作用

能做什么?

  • 打包优化(代码压缩、Tree Shaking)
  • 资源管理(生成 HTML、复制文件)
  • 环境变量注入
  • 构建流程干预

5.4 常用插件

javascript
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const webpack = require('webpack');

module.exports = {
  plugins: [
    // 生成 HTML 文件,自动引入 JS
    new HtmlWebpackPlugin({
      template: './public/index.html',
      filename: 'index.html'
    }),
    
    // 清理 dist 目录
    new CleanWebpackPlugin(),
    
    // 提取 CSS 到单独文件
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css'
    }),
    
    // 定义环境变量
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('production')
    }),
    
    // 添加版权注释
    new webpack.BannerPlugin({
      banner: 'Copyright © 2024 MyCompany'
    }),
  ]
};

常用插件列表:

插件作用
html-webpack-plugin生成 HTML 文件,自动引入资源
clean-webpack-plugin清理构建目录
mini-css-extract-plugin提取 CSS 到单独文件
css-minimizer-webpack-plugin压缩 CSS
terser-webpack-plugin压缩 JavaScript
webpack.DefinePlugin定义环境变量
webpack.BannerPlugin添加版权注释
webpack.ProvidePlugin自动加载模块
copy-webpack-plugin复制静态资源

5.5 官方插件列表

code
https://webpack.js.org/plugins/

六、核心概念五:模式(Mode)

6.1 概念理解

定义:

模式告诉 Webpack 使用相应的内置优化,不同模式绑定不同的环境变量和插件。

6.2 三种模式

javascript
module.exports = {
  mode: 'development' | 'production' | 'none'
};
模式说明默认行为
development开发模式开启开发工具,不压缩代码
production生产模式开启优化,压缩代码,Tree Shaking
none无模式不使用任何默认优化

6.3 模式的差异

development 模式:

javascript
// 默认开启的优化
{
  devtool: 'eval',                    // Source Map
  cache: { type: 'memory' },          // 内存缓存
  optimization: {
    minimize: false,                   // 不压缩
  }
}

// 环境变量
process.env.NODE_ENV = 'development'

production 模式:

javascript
// 默认开启的优化
{
  devtool: 'source-map',              // Source Map
  optimization: {
    minimize: true,                    // 压缩代码
    minimizer: [                       // 默认压缩器
      new TerserPlugin(),
      new CssMinimizerPlugin()
    ],
    splitChunks: {                     // 代码分割
      chunks: 'all'
    },
    usedExports: true,                 // Tree Shaking
  }
}

// 环境变量
process.env.NODE_ENV = 'production'

6.4 为什么需要 Mode?

Webpack 的痛点:

配置项太多,上手困难,很多人不喜欢读配置文件。

Mode 的价值:

预设了生产环境常用的插件和优化配置,开箱即用,降低配置门槛。


七、概念与配置对照总结

7.1 对照关系表

概念配置项说明
入口entry构建依赖图的起点
输出output输出位置和文件名
Loadermodule.rules文件转换规则
插件plugins构建流程干预
模式mode预设优化策略

7.2 完整配置示例

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

module.exports = {
  // 模式
  mode: 'development',
  
  // 入口
  entry: './src/index.js',
  
  // 输出
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js',
    clean: true,
  },
  
  // Loader
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        }
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      {
        test: /\.(png|jpg|gif)$/,
        type: 'asset/resource'
      }
    ]
  },
  
  // 插件
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html'
    })
  ],
  
  // 其他配置
  devtool: 'source-map',
  devServer: {
    static: './dist',
    hot: true,
  }
};

八、面试技巧分享

8.1 低情商 vs 高情商

面试官问:"你了解 Webpack 吗?"

低情商回答:

"了解,有 Entry、Output、Loader、Plugin 这些概念。"

高情商回答:

"Webpack 有五大核心概念:Entry、Output、Loader、Plugin、Mode。

Entry 是构建依赖图的起点,支持单入口和多入口配置;

Output 指定输出位置,支持 library 配置用于打包库文件;

Loader 用于转换非 JS 文件,执行顺序是从右往左;

Plugin 用于干预整个构建流程,可以实现压缩、环境变量注入等功能;

Mode 用于设置开发或生产模式,预设不同的优化策略。"

8.2 一个真实案例的启示

故事:

国外一小哥面试,被问到会不会某技术,回答"都会"。
让他写个案例,他说"现在都用 AI 写,谁还手写"。
让他用 AI 写,结果 AI 工具网络不稳定,最终面试失败。

启示:

code
┌──────────────────────────────────────────────┐
│  AI 工具是辅助,不是替代                       │
├──────────────────────────────────────────────┤
│   完全依赖 AI → 遇到问题束手无策             │
│   理解核心概念 + AI 辅助 → 高效且可靠        │
└──────────────────────────────────────────────┘

九、学习路径总结

9.1 概念学习优先级

code
第一步:理解五大核心概念
├── Entry(入口)
├── Output(输出)
├── Loader(加载器)
├── Plugin(插件)
└── Mode(模式)

第二步:对照配置文档
└── 概念与配置一一对应,左右分屏学习

第三步:动手实践
├── 复制配置示例
├── 本地运行打包
└── 观察输出结果

第四步:扩展学习
├── devServer(开发服务器)
├── cache(缓存)
├── optimization(优化配置)
└── 其他高级配置

9.2 后续学习方向

方向内容
开发配置devServer、Source Map、HMR
性能优化代码分割、Tree Shaking、缓存
自定义扩展编写 Loader、编写 Plugin
工程化实践多环境配置、构建流程优化

十、常见问题与解决方案

问题原因解决方案
Loader 顺序写反了不了解执行顺序记住"从右往左,从下往上"
找不到合适的 Loader不知道去哪找npm 搜索或查看 awesome-webpack
配置太复杂看不懂没有对照概念学习使用概念与配置对照学习法
生成的文件名包含哈希filename 使用了占位符使用 [name].[contenthash].js
生产环境代码没压缩mode 设置错误设置 mode: 'production'
CSS 没有注入页面缺少 style-loader确保 use 包含 style-loader

十一、学习要点总结

  1. 学习要有章法:概念先行
    官方文档从概念开始,理论指导实践

  2. Entry 是构建起点
    支持单入口、多入口、依赖共享等高级配置

  3. Output 指定输出位置
    library 配置支持多种模块规范输出

  4. Loader 处理非 JS 文件
    执行顺序:从右往左,从下往上

  5. Plugin 干预构建流程
    与 Loader 的区别:针对整个流程 vs 单一文件

  6. Mode 预设优化配置
    开发模式和生产模式自动开启不同的优化

  7. 不要过度依赖 AI 工具
    理解核心概念是基础,AI 是辅助


十二、延伸学习资源

官方文档

Loader 资源

插件资源


十三、思考题

  1. 为什么 Webpack 官方文档建议从"概念"开始学习?

  2. Loader 为什么是从右往左执行?这样设计有什么好处?

  3. Plugin 和 Loader 的本质区别是什么?什么场景下应该选择 Plugin 而不是 Loader?

  4. 如果要让 Webpack 输出一个同时支持浏览器和 Node.js 的库,应该如何配置 output.library?

  5. Mode 为 production 时,Webpack 默认开启了哪些优化?如何查看这些优化配置?


笔记整理时间: 2026-03-16
参考文档版本: Webpack 5
下一步学习: Webpack 开发环境配置与调试技巧