为什么用了Thread-loader后构建反而更慢了?
最近给项目加了Thread-loader想优化打包速度,结果发现构建时间比之前还长!配置的时候按照文档设置了workers: 2,但打包时控制台老是出现worker process failed to respond的警告,最后总耗时比不用多线程时多了10秒左右……
尝试过把workers改成自动检测CPU核心数:
workers: require('os').cpus().length - 1
但还是没改善,用npx webpack --profile看报告发现每个线程处理的文件都很小,可能卡在了频繁的进程通信上?
项目里用的webpack5+,其他loader配置是这样的:
{
test: /.js$/,
use: [
'thread-loader',
{
loader: 'babel-loader',
options: { ... }
}
]
}
是不是哪里设置错了?
我建议先检查一下你的项目规模和文件数量。如果像你描述的每个文件都很小,那确实不建议用thread-loader。我之前遇到过类似情况,最后是给thread-loader加了个判断条件,只对较大的文件启用多线程处理。
可以改成这样试试:
另外那个poolTimeout默认值是500ms,太短了容易导致worker被频繁创建销毁,改成Infinity可以让worker常驻内存。还有就是workers数量不需要设得太大,一般cpu核心数减一就够了。
最后提醒下,记得把node版本升级到14以上,低版本node的worker性能确实不太行。我当时就是因为这个吃了亏,升级完效果明显好多了。
把test条件改得更严格点,比如只针对node_modules里的文件或者大文件用thread-loader,简单文件直接跳过thread-loader。
试试这样改配置:
{
test: /.js$/,
include: [path.resolve(dirname, 'src'), path.resolve(dirname, 'node_modules/some-heavy-lib')],
use: [
{
loader: 'thread-loader',
options: {
workers: 2,
workerParallelJobs: 50, // 限制每个线程处理的任务数
}
},
{
loader: 'babel-loader',
options: { ... }
}
]
}