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 不是万能的,它有进程创建和通信开销。如果你的项目文件不多,或者单个文件编译很快,这个开销反而会吃掉并行带来的收益。babel-loader 本身开了 cacheDirectory 之后性能已经不差了,很多场景下加 thread-loader 完全是负优化。
另外 workers 数量也有讲究,8核CPU 别设置成 8 个,留 1-2 个给主进程和系统,建议设置成 3-4 个。
你的配置顺序没问题,thread-loader 确实要在 babel-loader 前面。
几个改进建议:
第一,确保 babel-loader 开了缓存,这是最基本的:
第二,workers 数量调一下:
第三,如果你的项目文件数量少于几百个,或者主要是做开发模式的热更新,那干脆别用 thread-loader,babel-loader + cacheDirectory 就够了。
生产构建如果想加速,可以考虑把 thread-loader 配合 cache-loader 一起用,或者直接上 esbuild-loader 替代 babel-loader,那个才是真的快。
你先试试调一下 workers 数量和确保 babel 的 cacheDirectory 开了,看看有没有改善。
先说根本原因: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 吧。