webpack优化之HappyPack
前言
由于运行在 Node.js 之上的 Webpack 是单线程模型的,所以Webpack 需要处理的事情需要一件一件的做,不能多件事一起做。
我们需要Webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威力,HappyPack 就能让 Webpack 做到这点,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。
由于 JavaScript 是单线程模型,要想发挥多核 CPU 的能力,只能通过多进程去实现,而无法通过多线程实现。
提示:由于HappyPack 对file-loader、url-loader 支持的不友好,所以不建议对该loader使用。
安装 HappyPack
npm install --save-dev happypack
运行机制
使用 HappyPack
HappyPack同时提供插件
和加载器
以完成其工作,因此您必须同时使用两者
来启用它。
修改你的webpack.config.js
文件
const HappyPack = require('happypack');
const os = require('os');
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
module.exports = {
module: {
rules: [
{
test: /\.js$/,
//把对.js 的文件处理交给id为happyBabel 的HappyPack 的实例执行
loader: 'happypack/loader?id=happyBabel',
//排除node_modules 目录下的文件
exclude: /node_modules/
},
]
},
plugins: [
new HappyPack({
//用id来标识 happypack处理那里类文件
id: 'happyBabel',
//如何处理 用法和loader 的配置一样
loaders: [{
loader: 'babel-loader?cacheDirectory=true',
}],
//共享进程池
threadPool: happyThreadPool,
//允许 HappyPack 输出日志
verbose: true,
})
]
}
-
在
Loader
配置中,所有文件的处理都交给了happypack/loader
去处理,使用紧跟其后的 querystring?id=happyBabel
去告诉 happypack/loader 去选择哪个 HappyPack 实例去处理文件。 -
在
Plugin
配置中,新增了两个 HappyPack 实例分别用于告诉 happypack/loader 去如何处理 .js 和 .css 文件。选项中的 id 属性的值和上面 querystring 中的?id=happyBabel
相对应,选项中的 loaders 属性和 Loader 配置中一样。
HappyPack 参数
这些是在实例化插件时可以传递给插件的参数。 loaders是唯一必需的参数。
1. loaders: Array
用法和 webpack Loader 配置中一样.
下列符号受到正式支持,并且都等效
{
loaders: [
// a string with embedded query for options
'babel-loader?presets[]=es2015',
{
loader: 'babel-loader'
},
// "query" string
{
loader: 'babel-loader',
query: '?presets[]=es2015'
},
// "query" object
{
loader: 'babel-loader',
query: {
presets: [ 'es2015' ]
}
},
// Webpack 2+ "options" object instead of "query"
{
loader: 'babel-loader',
options: {
presets: [ 'es2015' ]
}
}
]
}
2. id: String
Happypack唯一的标识符 id , loader使用它来知道应该与哪个plugin通信。
除非您定义了多个HappyPack插件,否则无需指定此名称,在这种情况下,您将需要不同的ID来区分它们
默认为: "1"
3. threads: Number
代表开启几个子进程去处理这一类型的文件
这仅在执行初始构建时才有意义, 因为HappyPack之后将切换到同步模式(即在watch 模式下)
默认为: 3
4. threadPool: HappyThreadPool
代表共享进程池,即多个 HappyPack 实例都使用同一个共享进程池中的子进程去处理任务,以防止资源占用过多。
默认为: null
5. verbose: Boolean
启用它可以将状态消息从HappyPack记录到STDOUT。
默认为: true
6. verboseWhenProfiling: Boolean
即使在webpack --profile运行时HappyPack仍能产生其输出,请启用此选项。
默认为: false
7. debug: Boolean
启用它可以将诊断消息从HappyPack记录到STDOUT。启用debug 用于故障排查。
默认为: false