webpack 优化
SourceMap
devtool 配置
热模块替换
webpack serve 默认开启
CSS style loader 实现了
js 文件需要自己处理
// main.js
// ...
if (module.hot) { // 是否支持热模块替换
module.hot.accept('./js/some.js')
module.hot.accept('./js/some2.js')
}
oneOf
每个文件只能被其中一个 loader
配置处理
include 和 exclude
eslint 和 babel 缓存
提升第一次以后的打包编译速度, 因为只处理修改了 js 文件, 没有修改的文件使用缓存
// webpack.prod.js
// ...
rules: [
// ...
{
test: /\.js$/,
include: path.resolve(__dirname, "../src"),
loader: "babel-loader",
options: {
cacheDirectory: true, // 开启 babel 缓存
cacheCompression: false, // 关闭缓存文件压缩
}
}
],
plugins: [
{
new ESLintPlugin({
context: path.resolve(__dirname, "../src"),
exclude: "node_modules",
cache: true, // 开启缓存
cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"), // 指定生成缓存文件位置
})
}
]
//...
多进程打包
仅在特别耗时的操作中使用, 因为每个进程启动就有大约为600ms 左右的开销
// 获取CPU核数
const os = require("os")
// cpu 核数
const threads = os.cpus().length
# 下载包
npm i thread-loader -D
eslint babel terser 开启多进程处理
// webpack.prod.js
//...
// 获取CPU核数
const os = require("os")
// cpu 核数
const threads = os.cpus().length
const TersetWebpackPlugin = require("terser-webpack-plugin")
// ...
rules: [
// ...
{
test: /\.js$/,
include: path.resolve(__dirname, "../src"),
use: [
{
loader: "thread-loader", // 开启多进程
options: {
works: threads, // 进程数量
}
},
{
loader: "babel-loader",
options: {
cacheDirectory: true, // 开启 babel 缓存
cacheCompression: false, // 关闭缓存文件压缩
}
}
]
}
],
plugins: [
// ...
new ESLintPlugin({
context: path.resolve(__dirname, "../src"),
exclude: "node_modules",
cache: true, // 开启缓存
cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache"), // 指定生成缓存文件位置
threads, // 开启多进程和设置进程数量
}),
//new TersetWebpackPlugin({
// parallel: threads // 开启多进程和设置进程数量
//})
// ...
],
optimization: {
// 压缩操作 webpack5 推荐放这里
minimizer: [
new CssMinimizerPlugin(),
new TersetWebpackPlugin({
parallel: threads // 开启多进程和设置进程数量
})
]
}
Tree Shaking
Tree Shaking
是一个术语, 通常用于描述移出 js 中没有用到的代码
依赖于 ES Module
减少 babel 生成文件的体积
babel 为编译的每个文件都插入了辅助代码, 使代码体积过大.
@babel/plugin-transform-runtime
: 禁用了 babel 自动对每个文件的 runtime 注入, 而是引入 @babel/plugin-transform-runtime
并且使所有辅助代码从这里引用.
npm i @babel/plugin-transform-runtime -D
// webpack.prod.js
// ...
rules: [
// ...
{
test: /\.js$/,
include: path.resolve(__dirname, "../src"),
use: [
{
loader: "thread-loader", // 开启多进程
options: {
works: threads, // 进程数量
}
},
{
loader: "babel-loader",
options: {
cacheDirectory: true, // 开启 babel 缓存
cacheCompression: false, // 关闭缓存文件压缩
plugins: ["@babel/plugin-transform-runtime"] // 使用 @babel/plugin-transform-runtime
}
}
]
}
],
// ...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧