参考答案:
Webpack 的构建过程本质上包括模块解析、加载、编译、优化、输出等多个阶段,因此优化手段也需从多个维度入手。
以下从开发模式(webpack-dev-server
)和生产模式(webpack build
)两个阶段,分别分析提高构建速度的关键策略。
开启持久化缓存(Webpack 5):
1module.exports = { 2 cache: { 3 type: 'filesystem', 4 }, 5};
能将模块编译结果缓存到磁盘,避免重复编译。
babel-loader
开启缓存:
1{ 2 loader: 'babel-loader', 3 options: { 4 cacheDirectory: true 5 } 6}
使用 include
/ exclude
精准匹配
1{ 2 test: /\.js$/, 3 loader: 'babel-loader', 4 include: path.resolve(__dirname, 'src'), 5 exclude: /node_modules/ 6}
配置 resolve.extensions
精简后缀解析
1resolve: { 2 extensions: ['.js', '.ts'] 3}
配置 resolve.alias
减少深层查找
1resolve: { 2 alias: { 3 '@': path.resolve(__dirname, 'src') 4 } 5}
使用 thread-loader
处理 JS/TS 转译等耗时任务:
1{ 2 test: /\.js$/, 3 use: ['thread-loader', 'babel-loader'] 4}
使用 terser-webpack-plugin
的并行压缩:
Webpack 5 中默认已启用,手动配置时可设置:
1optimization: { 2 minimize: true, 3 minimizer: [new TerserPlugin({ parallel: true })] 4}
webpack-dev-server
+ HMRsource-map
优化模式开发阶段推荐:
1devtool: 'cheap-module-source-map'
比 eval-source-map
更快,调试体验仍可接受。
Webpack 会将未变更模块缓存,如果未配置 module.id
,建议开启:
1optimization: { 2 moduleIds: 'deterministic' 3}
确保使用 ESModule
规范(import
/export
),否则无法移除无用代码;
设置 sideEffects: false
,移除副作用模块(需谨慎):
1// package.json 2{ 3 "sideEffects": false 4}
利用 SplitChunksPlugin
拆分公共依赖和第三方库,减少重复打包:
1optimization: { 2 splitChunks: { 3 chunks: 'all', 4 }, 5}
对大型路由模块按需加载,减少初始构建体积。
使用 IgnorePlugin
忽略无用语言包等:
1new webpack.IgnorePlugin({ 2 resourceRegExp: /^\.\/locale$/, 3 contextRegExp: /moment$/, 4});
精简 polyfill,例如使用 core-js-pure
或按需引入。
webpack-bundle-analyzer
分析体积1const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
定位冗余依赖和重复打包问题。
dayjs
替代 moment
;lodash-es
+ Tree Shaking 替代整个 lodash。Webpack 5 提供了更好的缓存机制、更快的构建性能和内置优化能力。
最近更新时间:2025-08-04
题库维护不易,您的支持就是我们最大的动力!