当然可以!下面是一份 的复习指南,适合用于系统性地回顾 Webpack 的核心概念、配置方式以及常见实践。我们将从零开始搭建一个简单的 Webpack 项目,并逐步深入关键知识点。
📚 Webpack 是什么?
Webpack 是一个静态模块打包工具(module bundler),它可以将项目中的各种资源(JS、CSS、图片、字体等)视为模块,通过依赖关系进行打包,最终输出优化后的静态资源。
核心概念
| 概念 | 说明 |
|---|---|
| Entry | 入口文件,指示 Webpack 从哪个文件开始构建依赖图 |
| Output | 输出配置,定义打包后文件的名称和路径 |
| Loader | 处理非 JS 文件(如 .css、.ts、.vue 等) |
| Plugin | 扩展功能,执行更广泛的任务(如压缩、HTML 注入、清理目录等) |
| Mode | 模式:development / production / none,影响默认优化行为 |
✅ 第一步:初始化项目
mkdir webpack-demo
cd webpack-demo
npm init -y
✅ 第二步:安装 Webpack
npm install --save-dev webpack webpack-cli
webpack: 核心打包引擎webpack-cli: 提供命令行工具(如npx webpack)
✅ 第三步:创建基本结构
webpack-demo/
├── src/
│ └── index.js
├── dist/
│ └── index.html
├── webpack.config.js
└── package.json
创建 src/index.js
console.log('Hello Webpack!');
创建 dist/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Webpack Demo</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>
✅ 第四步:配置 webpack.config.js
const path = require('path');
module.exports = {
mode: 'development', // 可选:'production' 或 'none'
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
clean: true, // 每次构建前清空 dist 目录(v5+)
},
};
✅ 第五步:添加 npm 脚本
"scripts": {
"build": "webpack",
"dev": "webpack serve --open"
}
运行打包:
npm run build
你会在 dist/main.js 中看到打包结果。
✅ 第六步:使用 Loader(处理 CSS)
安装 CSS loader:
npm install --save-dev css-loader style-loader
更新 webpack.config.js
module.exports = {
// ...其他配置
module: {
rules: [
{
test: /.css$/i,
use: ['style-loader', 'css-loader'],
},
],
},
};
添加 src/style.css
body {
background: lightblue;
}
引入 CSS
import './style.css';
console.log('Hello Webpack!');
再次运行 npm run build,打开 dist/index.html 查看效果。
✅ 第七步:使用 Plugin(生成 HTML)
安装 html-webpack-plugin:
npm install --save-dev html-webpack-plugin
配置插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
title: 'My App',
template: 'dist/index.html', // 使用模板
}),
],
};
现在它会自动生成 dist/index.html 并自动注入 <script> 标签。
✅ 第八步:开发服务器(Dev Server)
安装:
npm install --save-dev webpack-dev-server
配置 devServer
module.exports = {
devServer: {
static: './dist',
port: 3000,
open: true,
},
};
启动开发服务器:
npm run dev
支持热更新、实时刷新。
✅ 第九步:处理图片等资源(Asset Modules)
Webpack 5 内置支持资源模块,无需额外 loader。
module.exports = {
module: {
rules: [
{
test: /.(png|svg|jpg|jpeg|gif)$/i,
type: 'asset/resource', // 自动处理图片,输出到 dist
},
],
},
};
在 JS 中导入图片:
import imgSrc from './assets/logo.png';
const img = document.createElement('img');
img.src = imgSrc;
document.body.appendChild(img);
✅ 第十步:代码分割(Code Splitting)
方式一:入口起点(Entry Points)
module.exports = {
entry: {
main: './src/index.js',
vendor: './src/vendor.js',
},
};
方式二:动态导入(推荐)
// 懒加载
button.onclick = () => {
import('./module.js').then(module => {
module.default();
});
};
Webpack 会自动拆分 chunk。
方式三:SplitChunksPlugin(提取公共代码)
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
},
},
};
自动提取第三方库(如 lodash、react 等)为独立 bundle。
✅ 第十一步:环境区分配置
通常我们会创建多个配置文件:
webpack.common.js—— 公共配置webpack.dev.js—— 开发环境webpack.prod.js—— 生产环境
使用 webpack-merge 合并配置:
npm install --save-dev webpack-merge
示例:webpack.common.js
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({ title: 'Production' }),
],
module: {
rules: [
{
test: /.css$/i,
use: ['style-loader', 'css-loader'],
},
],
},
};
webpack.prod.js
const { merge } = require('webpack-merge');
const common = require('./webpack.common.js');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = merge(common, {
mode: 'production',
optimization: {
minimizer: [new TerserPlugin()],
},
});
package.json 脚本
"scripts": {
"build": "webpack --config webpack.prod.js",
"dev": "webpack serve --config webpack.dev.js"
}
✅ 第十二步:Babel 支持(转换 ES6+)
npm install --save-dev babel-loader @babel/core @babel/preset-env
module.exports = {
module: {
rules: [
{
test: /.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
}
支持箭头函数、async/await 等现代语法。
✅ 第十三步:常用 Plugin 回顾
| 插件 | 作用 |
|---|---|
HtmlWebpackPlugin | 自动生成 HTML |
CleanWebpackPlugin | 清理 dist 目录 |
CopyWebpackPlugin | 复制静态资源 |
MiniCssExtractPlugin | 抽离 CSS 到单独文件 |
DefinePlugin | 定义全局常量(如 process.env.NODE_ENV) |
CompressionPlugin | 生成 gzip 压缩文件 |
✅ 第十四步:性能优化建议
- 使用
mode: 'production' - 启用
splitChunks - 使用
source-map控制调试信息(开发用eval-source-map,生产用source-map) - 图片压缩、Tree Shaking(默认开启)
- 缓存:
output.filename = '[name].[contenthash].js'
output: {
filename: '[name].[contenthash].js',
path: path.resolve(__dirname, 'dist'),
}
✅ 总结:Webpack 核心流程
- 从 Entry 开始分析依赖
- 通过 Loaders 转换非 JS 模块
- 生成 Chunk 和 Asset
- 通过 Plugins 增强构建过程
- 输出到 Output 目录
🔚 复习检查清单 ✅
| 项目 | 是否掌握 |
|---|---|
| 初始化项目 & 安装 Webpack | ☐ |
| 配置 entry/output/mode | ☐ |
| 使用 loader 处理 CSS、图片 | ☐ |
| 使用 plugin 自动生成 HTML | ☐ |
| 启动 dev server 实现热更新 | ☐ |
| 实现代码分割(动态导入) | ☐ |
| 区分开发与生产环境配置 | ☐ |
| 使用 Babel 转译 JS | ☐ |
| 输出带 hash 的文件名 | ☐ |
| 了解 Tree Shaking 原理 | ☐ |
📚 推荐学习资料
- Webpack 官方文档
- 《深入浅出 Webpack》—— 程沛权
- Webpack GitHub Examples:github.com/webpack/web…
如果你正在准备面试或项目重构,这份复习笔记可以帮助你快速回顾 Webpack 的全貌。需要我帮你生成一个完整的最小可运行示例仓库结构吗?欢迎继续提问!