二、核心概念一:入口(Entry)
2.1 概念理解
定义:
入口是 Webpack 构建依赖图的起点,Webpack 从入口文件开始,递归解析所有依赖的模块。
工作原理:
入口文件 (entry.js)
↓
解析 import/require
↓
构建模块依赖图 (Dependency Graph)
↓
安排不同 Loader 处理各类型文件
↓
输出最终 Bundle2.2 为什么需要入口?
Webpack 本身只能理解:
- JavaScript 文件
- JSON 文件
无法直接处理的文件:
.sass/.scss - CSS 预处理器
.vue - Vue 单文件组件
.jsx/.tsx - React/Vue JSX 语法
.jpg/.png - 图片资源
.woff/.ttf - 字体文件解决方案:
入口文件 → 依赖分析 → Loader 转换 → 输出 Bundle2.3 入口配置语法
方式一:单入口(字符串)
// webpack.config.js
module.exports = {
entry: './src/index.js'
};适用场景:
- 单页应用(SPA)
- 简单项目
方式二:多入口(数组)
module.exports = {
entry: ['./src/a.js', './src/b.js']
};特点:
- 多个入口文件打包到一个 Bundle
- 适用场景:需要合并多个文件的场景
方式三:多入口(对象)
module.exports = {
entry: {
main: './src/index.js',
admin: './src/admin.js'
}
};输出结果:
dist/
├── main.js
└── admin.js适用场景:
- 多页应用(MPA)
- 按功能模块分离打包
方式四:高级配置(依赖共享)
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 属性详解:
entry: {
testApp: {
import: './src/testApp.js',
dependOn: ['react-vendors'],
runtime: 'runtime' // 创建独立的运行时 Chunk
}
}作用:
- 创建独立的运行时 Chunk
- 方便多个入口共享同一份运行时代码
- Webpack 5.43.0+ 可设为
false避免创建新运行时 Chunk
2.4 学习技巧
遇到看不懂的配置?
步骤 1:复制配置代码
↓
步骤 2:创建 webpack.config.js
↓
步骤 3:修改为本地文件路径
↓
步骤 4:执行 npx webpack
↓
步骤 5:查看打包结果,理解配置效果三、核心概念二:输出(Output)
3.1 概念理解
定义:
告诉 Webpack 在哪里输出构建完成的 Bundle,以及如何命名这些文件。
3.2 默认配置
// 不配置 output 时的默认值
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'), // 输出目录
filename: '[name].js', // 输出文件名
}
};3.3 常用配置属性
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 ID | 1.js |
[chunkhash] | Chunk 哈希 | main.def456.js |
3.4 library 配置详解
使用场景: 打包一个库(Library)供其他项目使用
output: {
library: {
name: 'MyLibrary', // 库名称
type: 'umd', // 输出格式
export: 'default', // 指定导出项
}
}type 支持的模块规范:
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 配置
作用: 设置资源的公共路径前缀
output: {
publicPath: 'auto', // 自动推断
publicPath: '/', // 根路径
publicPath: '/assets/', // 指定路径
publicPath: 'https://cdn.example.com/', // CDN 路径
}使用场景:
- 静态资源部署到 CDN
- 资源路径需要前缀
四、核心概念三:Loader
4.1 概念理解
定义:
Webpack 只能理解 JavaScript 和 JSON 文件。Loader 让 Webpack 能够处理其他类型的文件,将它们转换为有效模块。
4.2 Loader 的作用
源文件类型 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/webpack4.3 配置语法
module.exports = {
module: {
rules: [
{
test: /\.css$/, // 匹配文件
use: ['style-loader', 'css-loader'], // 使用的 Loader
include: path.resolve(__dirname, 'src'), // 包含范围
exclude: /node_modules/, // 排除范围
}
]
}
};核心属性:
| 属性 | 类型 | 说明 |
|---|---|---|
test | RegExp | 匹配文件的正则表达式 |
use | Array/Object | 使用的 Loader |
include | String/Array/RegExp | 包含的文件范围 |
exclude | String/Array/RegExp | 排除的文件范围 |
loader | String | 单个 Loader 的简写 |
4.4 如何找到合适的 Loader?
方法一:npm 搜索
# 搜索 TypeScript Loader
npm search webpack typescript loader
# 搜索 SVG Loader
npm search webpack svg loader
# 搜索 Sass Loader
npm search sass loader常用 Loader:
| 文件类型 | Loader | 说明 |
|---|---|---|
| TypeScript | ts-loader | TS 编译 |
| TypeScript | babel-loader + @babel/preset-typescript | Babel 编译 TS |
| JSX | babel-loader | React/Vue JSX |
| Vue | vue-loader | Vue SFC |
| Sass | sass-loader | Sass/Scss 编译 |
| Less | less-loader | Less 编译 |
| CSS | css-loader + style-loader | CSS 处理 |
| 图片 | asset/resource | 图片资源(Webpack 5 内置) |
| SVG | @svgr/webpack | SVG 转 React 组件 |
方法二:Webpack Awesome
https://github.com/webpack-contrib/awesome-webpack方法三:官方文档
在配置文档中搜索文件类型,查看推荐的 Loader。
4.5 Loader 执行顺序
重要规则:Loader 从右往左执行,从下往上执行
// 数组形式:从右往左
use: ['style-loader', 'css-loader', 'sass-loader']
执行顺序:
sass-loader → css-loader → style-loader
↓ ↓ ↓
编译 Sass 转换 CSS 注入到页面// 对象形式:从下往上
use: [
{ loader: 'style-loader' },
{ loader: 'css-loader' },
{ loader: 'sass-loader' }
]
执行顺序:
sass-loader(最后)
↓
css-loader
↓
style-loader(最先)为什么是这个顺序?
源文件: style.scss
↓
sass-loader: 编译 Sass → CSS
↓
css-loader: 解析 CSS 中的 @import、url() 等
↓
style-loader: 将 CSS 注入到页面 <style> 标签4.6 最佳实践
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 | 更精确的范围控制 |
| 使用绝对路径 | 避免路径歧义 |
| 正则交给 AI | AI 工具可快速生成正则 |
五、核心概念四:插件(Plugin)
5.1 概念理解
定义:
插件可以干预整个 Webpack 构建流程,实现 Loader 无法完成的任务。
5.2 Plugin 与 Loader 的区别
┌─────────────────────────────────────────────────────┐
│ Loader │
├─────────────────────────────────────────────────────┤
│ 针对对象:单一类型文件 │
│ 作用范围:文件内容转换 │
│ 工作方式:从源文件转换为目标格式 │
│ 示例:vue-loader 处理 .vue 文件 │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Plugin │
├─────────────────────────────────────────────────────┤
│ 针对对象:整个构建流程 │
│ 作用范围:流程干预、优化、资源管理等 │
│ 工作方式:监听构建生命周期钩子 │
│ 示例:HtmlWebpackPlugin 生成 HTML 文件 │
└─────────────────────────────────────────────────────┘5.3 Plugin 的作用
能做什么?
- 打包优化(代码压缩、Tree Shaking)
- 资源管理(生成 HTML、复制文件)
- 环境变量注入
- 构建流程干预
5.4 常用插件
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 官方插件列表
https://webpack.js.org/plugins/六、核心概念五:模式(Mode)
6.1 概念理解
定义:
模式告诉 Webpack 使用相应的内置优化,不同模式绑定不同的环境变量和插件。
6.2 三种模式
module.exports = {
mode: 'development' | 'production' | 'none'
};| 模式 | 说明 | 默认行为 |
|---|---|---|
development | 开发模式 | 开启开发工具,不压缩代码 |
production | 生产模式 | 开启优化,压缩代码,Tree Shaking |
none | 无模式 | 不使用任何默认优化 |
6.3 模式的差异
development 模式:
// 默认开启的优化
{
devtool: 'eval', // Source Map
cache: { type: 'memory' }, // 内存缓存
optimization: {
minimize: false, // 不压缩
}
}
// 环境变量
process.env.NODE_ENV = 'development'production 模式:
// 默认开启的优化
{
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 | 输出位置和文件名 |
| Loader | module.rules | 文件转换规则 |
| 插件 | plugins | 构建流程干预 |
| 模式 | mode | 预设优化策略 |
7.2 完整配置示例
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 工具网络不稳定,最终面试失败。
启示:
┌──────────────────────────────────────────────┐
│ AI 工具是辅助,不是替代 │
├──────────────────────────────────────────────┤
│ 完全依赖 AI → 遇到问题束手无策 │
│ 理解核心概念 + AI 辅助 → 高效且可靠 │
└──────────────────────────────────────────────┘九、学习路径总结
9.1 概念学习优先级
第一步:理解五大核心概念
├── 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 |
十一、学习要点总结
-
学习要有章法:概念先行
官方文档从概念开始,理论指导实践 -
Entry 是构建起点
支持单入口、多入口、依赖共享等高级配置 -
Output 指定输出位置
library 配置支持多种模块规范输出 -
Loader 处理非 JS 文件
执行顺序:从右往左,从下往上 -
Plugin 干预构建流程
与 Loader 的区别:针对整个流程 vs 单一文件 -
Mode 预设优化配置
开发模式和生产模式自动开启不同的优化 -
不要过度依赖 AI 工具
理解核心概念是基础,AI 是辅助
十二、延伸学习资源
官方文档
Loader 资源
插件资源
十三、思考题
-
为什么 Webpack 官方文档建议从"概念"开始学习?
-
Loader 为什么是从右往左执行?这样设计有什么好处?
-
Plugin 和 Loader 的本质区别是什么?什么场景下应该选择 Plugin 而不是 Loader?
-
如果要让 Webpack 输出一个同时支持浏览器和 Node.js 的库,应该如何配置 output.library?
-
Mode 为 production 时,Webpack 默认开启了哪些优化?如何查看这些优化配置?
笔记整理时间: 2026-03-16
参考文档版本: Webpack 5
下一步学习: Webpack 开发环境配置与调试技巧