一、构建速度优化
1、升级Webpack和Node.js
- 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。
- 原因 :
- V8引擎优化(
for of
替代forEach
、Map/Set
替代Object
)。 - 默认使用更快的
md4
哈希算法。 - AST直接从Loader传递,减少解析时间。
- V8引擎优化(
bash
# 示例:Webpack 3 vs Webpack 4构建时间对比
Webpack 3: Time: 54263ms
Webpack 4: Time: 26563ms
2、多进程/多实例构建
- 方案选择 :
thread-loader
(官方推荐,Webpack 4+)。HappyPack
(Webpack 3,已逐渐被替代)。
- 原理:将模块解析分配给Worker线程并行处理。
javascript
// thread-loader 配置示例
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: ['thread-loader', 'babel-loader']
}
]
}
};
3、并行压缩代码
- 推荐插件 :
terser-webpack-plugin
(Webpack 4默认,支持ES6)。uglifyjs-webpack-plugin
(开启parallel
参数)。
javascript
// terser-webpack-plugin 并行压缩
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new TerserPlugin({ parallel: 4 })]
}
};
4、缩小构建目标
- 关键配置 :
- 限制
babel-loader
作用范围(排除node_modules
)。 - 优化
resolve
配置,减少文件搜索范围。
- 限制
javascript
module.exports = {
module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, use: 'babel-loader' }
]
},
resolve: {
modules: [path.resolve(__dirname, 'node_modules')], // 限定模块搜索路径
extensions: ['.js'], // 减少后缀尝试
alias: { react: path.resolve(__dirname, './node_modules/react/dist/react.min.js') } // 别名缩短路径
}
};
5、缓存优化
- 策略 :
babel-loader
开启cacheDirectory
。terser-webpack-plugin
启用缓存。- 使用
hard-source-webpack-plugin
为模块提供中间缓存。
javascript
// babel-loader 缓存示例
use: [{
loader: 'babel-loader',
options: { cacheDirectory: true }
}]
二、构建体积优化
1、代码分包(减少主包体积)
- 方案1:设置Externals
通过CDN引入基础库(如React),不打包进Bundle。
javascript
const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin');
plugins: [
new HtmlWebpackExternalsPlugin({
externals: [
{ module: 'react', entry: '//cdn.url/react.min.js', global: 'React' }
]
})
];
- 方案2:SplitChunksPlugin分包
分离公共模块与业务代码。
javascript
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendors: { test: /[\\/]node_modules[\\/]/, name: 'vendors' }
}
}
}
2、Tree Shaking
- 条件 :必须是ES6模块语法(
import/export
)。 - 生效方式 :
- Webpack生产模式默认开启。
- 确保
.babelrc
中设置"modules": false
。
3、图片与字体优化
- 压缩图片 :
image-webpack-loader
集成imagemin
。
javascript
rules: [{
test: /\.(png|jpg)$/,
use: [
{ loader: 'file-loader', options: { name: 'img/[name][hash:8].[ext]' } },
{ loader: 'image-webpack-loader', options: { mozjpeg: { quality: 65 } } }
]
}]
- 小资源内联 :
url-loader
将小文件转为Base64。
javascript
use: [{ loader: 'url-loader', options: { limit: 10240 } }] // 小于10KB的文件内联
4、删除无用代码
- CSS清理 :
purgecss-webpack-plugin
移除未使用的CSS。
javascript
const PurgecssPlugin = require('purgecss-webpack-plugin');
plugins: [
new PurgecssPlugin({ paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }) })
];
- 动态Polyfill服务 :按需加载Polyfill(如
polyfill.io
)。
html
<script src="https://polyfill.io/v3/polyfill.min.js?features=Promise,Map"></script>
三、高级分析与监控
1、构建速度分析
- 工具 :
speed-measure-webpack-plugin
。 - 效果:输出每个Loader和插件的耗时。
javascript
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
const smp = new SpeedMeasurePlugin();
module.exports = smp.wrap({ /* webpack配置 */ });
2、体积分析
- 工具 :
webpack-bundle-analyzer
。 - 效果:可视化分析各模块大小。
javascript
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins: [new BundleAnalyzerPlugin()];
3、日志优化
- 工具 :
friendly-errors-webpack-plugin
。 - 效果:精简控制台输出,突出错误和警告。
javascript
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
plugins: [new FriendlyErrorsPlugin()];
stats: 'errors-only' // 仅显示错误
四、总结
优化方向 | 关键技术 | 效果 |
---|---|---|
构建速度 | 多进程/缓存/缩小目标 | 减少60%+构建时间 |
体积优化 | 代码分包/Tree Shaking/图片压缩 | 减少30%-50% Bundle大小 |
开发体验 | 热更新/日志优化 | 快速定位问题,减少刷新 |
长期维护 | ESLint规范/CI集成 | 提升代码质量和团队协作效率 |
核心原则:
- 优先使用高版本Webpack(内置优化更多)。
- 并行与缓存是速度优化的关键。
- 按需加载与死代码删除是体积优化的核心。
- 通过可视化分析工具量化优化效果。