一、基础配置优化
1.1 区分开发与生产环境
- // webpack.config.js
- module.exports = (env, argv) => {
- const isProduction = argv.mode === 'production';
-
- return {
- mode: isProduction ? 'production' : 'development',
- devtool: isProduction ? 'source-map' : 'eval-cheap-module-source-map',
- // 其他配置...
- };
- };
复制代码 优化点:
- 开发环境使用更快的 sourcemap 生成方式
- 生产环境启用完整优化但保留 sourcemap
1.2 减少解析范围
- module.exports = {
- module: {
- rules: [
- {
- test: /\.js$/,
- exclude: /node_modules/,
- include: path.resolve(__dirname, 'src'),
- use: ['babel-loader']
- }
- ]
- },
- resolve: {
- modules: [path.resolve(__dirname, 'src'), 'node_modules'],
- extensions: ['.js', '.jsx'] // 减少扩展名尝试
- }
- };
复制代码 二、Loader 优化策略
2.1 限制 loader 应用范围
- {
- test: /\.js$/,
- exclude: /node_modules/,
- include: path.resolve(__dirname, 'src'),
- use: ['babel-loader?cacheDirectory']
- }
复制代码 2.2 启用 loader 缓存
- use: [
- {
- loader: 'babel-loader',
- options: {
- cacheDirectory: true // 默认缓存目录 node_modules/.cache/babel-loader
- }
- }
- ]
复制代码 2.3 减少 loader 数量
- // 避免不必要的 loader 调用
- {
- test: /\.(jpe?g|png|gif|svg)$/,
- use: [
- {
- loader: 'url-loader',
- options: {
- limit: 8192 // 小于8KB转为base64
- }
- }
- // 移除不必要的 image-webpack-loader 开发环境
- ]
- }
复制代码 三、插件优化方案
3.1 选择性使用插件
- const plugins = [
- new webpack.DefinePlugin({/*...*/}),
- isProduction && new MiniCssExtractPlugin()
- ].filter(Boolean);
复制代码 3.2 禁用开发无用插件
- plugins: [
- !isDevelopment && new CompressionPlugin(),
- !isDevelopment && new BundleAnalyzerPlugin()
- ].filter(Boolean)
复制代码 3.3 使用 HardSourceWebpackPlugin
- const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
- module.exports = {
- plugins: [
- new HardSourceWebpackPlugin()
- ]
- };
复制代码 效果:二次构建速度提升60%-80%
四、模块解析优化
4.1 缩小模块搜索范围
- resolve: {
- alias: {
- '@': path.resolve(__dirname, 'src'),
- react: path.resolve(__dirname, './node_modules/react')
- },
- symlinks: false // 防止npm link导致的重复解析
- }
复制代码 4.2 使用 module.noParse
- module: {
- noParse: /jquery|lodash/ // 忽略未模块化的库
- }
复制代码 五、多进程并行处理
5.1 thread-loader
- module.exports = {
- module: {
- rules: [
- {
- test: /\.js$/,
- use: [
- {
- loader: 'thread-loader',
- options: {
- workers: 2,
- workerParallelJobs: 50,
- poolTimeout: 2000
- }
- },
- 'babel-loader'
- ]
- }
- ]
- }
- };
复制代码 5.2 parallel-webpack
- // 安装后直接运行
- parallel-webpack --config=webpack.config.js
复制代码 5.3 TerserPlugin 多进程
- optimization: {
- minimizer: [
- new TerserPlugin({
- parallel: require('os').cpus().length - 1
- })
- ]
- }
复制代码 六、开发环境特化优化
6.1 禁用生产环境优化
- optimization: {
- removeAvailableModules: false,
- removeEmptyChunks: false,
- splitChunks: false,
- minimize: false
- }
复制代码 6.2 使用 cache-loader
- {
- test: /\.(js|jsx)$/,
- use: [
- 'cache-loader',
- 'babel-loader'
- ],
- include: path.resolve('src')
- }
复制代码 6.3 增量编译
- watchOptions: {
- aggregateTimeout: 500, // 防抖延迟
- ignored: /node_modules/ // 忽略目录
- }
复制代码 七、DLL 预编译技术
7.1 创建 DLL 配置
- // webpack.dll.config.js
- module.exports = {
- entry: {
- vendor: ['react', 'react-dom', 'lodash']
- },
- output: {
- filename: '[name].dll.js',
- path: path.resolve(__dirname, 'dll'),
- library: '[name]_[hash]'
- },
- plugins: [
- new webpack.DllPlugin({
- name: '[name]_[hash]',
- path: path.join(__dirname, 'dll', '[name]-manifest.json')
- })
- ]
- };
复制代码 7.2 主配置引用 DLL
- // webpack.config.js
- plugins: [
- new webpack.DllReferencePlugin({
- manifest: require('./dll/vendor-manifest.json')
- })
- ]
复制代码 八、高级优化技巧
8.1 使用 SWC 替代 Babel
- module: {
- rules: [
- {
- test: /\.(js|jsx)$/,
- exclude: /node_modules/,
- use: {
- loader: 'swc-loader',
- options: {
- jsc: {
- parser: {
- syntax: 'ecmascript',
- jsx: true
- }
- }
- }
- }
- }
- ]
- }
复制代码 速度对比:SWC 比 Babel 快 20 倍以上
8.2 使用 esbuild-loader
- const { ESBuildMinifyPlugin } = require('esbuild-loader');
- module.exports = {
- module: {
- rules: [
- {
- test: /\.js$/,
- loader: 'esbuild-loader',
- options: {
- target: 'es2015'
- }
- }
- ]
- },
- optimization: {
- minimizer: [
- new ESBuildMinifyPlugin({
- target: 'es2015'
- })
- ]
- }
- };
复制代码 8.3 模块联邦共享
- // 共享依赖避免重复打包
- new ModuleFederationPlugin({
- name: 'app1',
- shared: {
- react: { singleton: true },
- 'react-dom': { singleton: true }
- }
- })
复制代码 九、构建分析工具
9.1 速度分析
- const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
- const smp = new SpeedMeasurePlugin();
- module.exports = smp.wrap({
- // 原webpack配置
- });
复制代码 9.2 构建耗时分析
- class BuildTimePlugin {
- apply(compiler) {
- let startTime;
-
- compiler.hooks.beforeRun.tap('BuildTime', () => {
- startTime = Date.now();
- });
-
- compiler.hooks.done.tap('BuildTime', stats => {
- console.log(`构建耗时: ${(Date.now() - startTime) / 1000}s`);
- });
- }
- }
复制代码 十、综合优化配置示例
- const path = require('path');
- const os = require('os');
- const webpack = require('webpack');
- const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
- const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
- module.exports = {
- mode: 'development',
- devtool: 'eval-cheap-module-source-map',
- cache: {
- type: 'filesystem',
- buildDependencies: {
- config: [__filename]
- }
- },
- module: {
- rules: [
- {
- test: /\.js$/,
- exclude: /node_modules/,
- use: [
- {
- loader: 'thread-loader',
- options: {
- workers: os.cpus().length - 1
- }
- },
- {
- loader: 'babel-loader',
- options: {
- cacheDirectory: true
- }
- }
- ]
- }
- ]
- },
- plugins: [
- new HardSourceWebpackPlugin(),
- new webpack.ProgressPlugin(),
- process.env.ANALYZE && new BundleAnalyzerPlugin()
- ].filter(Boolean),
- resolve: {
- alias: {
- '@': path.resolve('src')
- },
- extensions: ['.js', '.json']
- },
- optimization: {
- removeAvailableModules: false,
- removeEmptyChunks: false,
- splitChunks: false,
- minimize: false
- },
- stats: {
- modules: false,
- children: false,
- chunks: false,
- chunkModules: false
- }
- };
复制代码 关键优化指标对比
优化手段构建时间减少幅度适用场景HardSourceWebpackPlugin60%-80%开发环境thread-loader30%-50%大型项目DLL 预编译40%-60%稳定第三方库SWC/esbuild50%-70%全场景缓存配置70%-90%增量构建
最佳实践建议
- 分层优化:
- 开发环境:侧重构建速度(缓存、不压缩)
- 生产环境:侧重输出质量(Tree Shaking、压缩)
- 渐进式实施:
- 1. 添加基础缓存(HardSourceWebpackPlugin)
- 2. 引入多进程(thread-loader)
- 3. 分析优化重点(SpeedMeasurePlugin)
- 4. 实施高级优化(DLL/SWC)
复制代码 持续监控:
- performance: {
- hints: 'warning',
- maxAssetSize: 500 * 1024,
- maxEntrypointSize: 500 * 1024
- }
复制代码 通过综合应用这些优化策略,可以将 Webpack 构建速度提升 3-10 倍,显著改善开发体验。建议根据项目实际情况选择性组合使用,并定期使用分析工具评估优化效果。
以上就是Webpack打包速度优化方案汇总的详细内容,更多关于Webpack打包速度优化的资料请关注脚本之家其它相关文章!
来源:https://www.jb51.net/javascript/3395375uu.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|