让HappyPack与TerserPlugin协同工作以达最优打包性能
- 配置HappyPack:
- 首先安装
happy - pack
:npm install happy - pack --save - dev
。
- 在Webpack配置文件中引入
HappyPack
:
const HappyPack = require('happy - pack');
const os = require('os');
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
- 然后在
module.rules
中配置HappyPack
的loader
。例如,对于Babel处理JavaScript文件:
{
test: /\.js$/,
exclude: /node_modules/,
use: ['HappyPack/loader?id=js']
}
- 并在Webpack配置的
plugins
中添加HappyPack
插件实例:
plugins: [
new HappyPack({
id: 'js',
loaders: ['babel - loader'],
threadPool: happyThreadPool,
verbose: true
})
]
- TerserPlugin配置:
- TerserPlugin默认已经与Webpack集成得较好。在Webpack配置的
optimization.minimizer
数组中,确保TerserPlugin配置正确。例如:
optimization: {
minimizer: [
new TerserPlugin({
parallel: true, // 开启并行压缩,利用多核CPU
terserOptions: {
compress: {
drop_console: true // 例如,去除console.log
}
}
})
]
}
- 协同要点:
- HappyPack主要在模块转换阶段(如Babel转译等)利用多线程提高效率,而TerserPlugin在压缩代码阶段工作。由于它们处于不同的打包阶段,只要各自配置合理利用多核CPU(HappyPack通过
threadPool
,TerserPlugin通过parallel
),就能协同提高打包性能。
深度定制HappyPack
- 定制
loaders
:
- 如果默认的
loaders
不能满足需求,例如在处理JavaScript文件时,除了Babel转译还需要进行ESLint检查。可以这样配置:
new HappyPack({
id: 'js',
loaders: ['babel - loader', 'eslint - loader'],
threadPool: happyThreadPool,
verbose: true
})
- 定制缓存:
- HappyPack默认有缓存机制,但可以进一步定制。例如,通过设置
cache
选项来控制缓存的行为:
new HappyPack({
id: 'js',
loaders: ['babel - loader'],
threadPool: happyThreadPool,
cache: true,
cacheDirectory: '.happypack_cache' // 自定义缓存目录
})
- 定制线程池:
- 除了设置线程池大小,还可以对线程池的其他属性进行定制。例如,设置线程的存活时间等(虽然这种情况较少见):
const customThreadPool = new HappyPack.ThreadPool({
size: os.cpus().length,
// 假设HappyPack支持设置线程存活时间(实际不一定有此选项,仅为示例)
threadKeepAliveTime: 10000
});
new HappyPack({
id: 'js',
loaders: ['babel - loader'],
threadPool: customThreadPool,
verbose: true
})
- 定制错误处理:
- 可以通过
errorDeps
选项来定制错误处理。例如,如果某个loader
失败,希望跳过该模块并继续打包其他模块:
new HappyPack({
id: 'js',
loaders: ['babel - loader'],
threadPool: happyThreadPool,
errorDeps: true
})