Thread-loader 加速构建反而变慢了?是不是我配置错了?
我在用 Webpack 优化项目构建速度,听说 thread-loader 能并行处理提升性能,就加到了 Babel loader 前面。但实际跑下来构建时间反而比不用还长,本地开发机是 8 核 CPU,按理说应该有效果才对。
我试过调整 workers 数量、只在生产环境启用,都没啥改善。是不是我的配置顺序有问题?或者某些 loader 不适合和 thread-loader 一起用?
<!-- 这是我 webpack 配置里 module.rules 的一段(简化版) -->
{
test: /.js$/,
use: [
'thread-loader',
{
loader: 'babel-loader',
options: { presets: ['@babel/preset-env'] }
}
]
}
先说根本原因:thread-loader 的开销在于 worker 进程创建和进程间通信,如果你的项目文件不多或者单个文件处理时间很短,这部分开销反而会吃掉并行带来的收益。8核CPU又怎样,worker 启动也要时间的。
几个可能的原因和解决方案:
1. 开启 babel-loader 缓存
没缓存的话每次都要重新编译,thread-loader 反而增加了开销:
2. 只对 src 目录启用,别碰 node_modules
你可能没排除 node_modules,那 thread-loader 会尝试处理所有 js 文件,纯属浪费。
3. 如果文件不多,直接放弃 thread-loader
对于中小型项目,babel-loader 开缓存就够了。thread-loader 适合那种几千个文件、编译时间几十秒以上的项目。
4. 实在想提速,试试 esbuild-loader 替代 babel-loader
那速度比 thread-loader + babel-loader 组合快得多,配置也简单:
先试试前两条,如果还是慢,基本可以判定你的项目规模不适合 thread-loader,换 esbuild-loader 吧。