什么是HappyPack? 作用是什么
webpack在构建文件时,比如js,css,图片及字体时,它需要一个一个去解析和编译,不能同时处理多个任务。特别当文件数量变多后,webpack构建慢的问题会显得更为严重。因此HappyPack出现了,它能让webpack同时处理多个任务,它将任务分解给多个子进程去并发执行,子进程处理完成后再将结果发送给主进程中。
HappyPack的基本原理:在webpack构建过程中,我们需要使用Loader对js,css,图片,字体等文件做转换操作,并且转换的文件数据量也是非常大的,且这些转换操作不能并发处理文件,而是需要一个个文件进行处理,HappyPack的基本原理是将这部分任务分解到多个子进程中去并行处理,子进程处理完成后把结果发送到主进程中,从而减少总的构建时间。
在配置中使用HappyPack
js/main.js 入口文件代码如下:
1 | require('../styles/main.styl'); |
js/demo1.js 文件如下:
1 | export default function printMe() { |
styles/main.styl 代码如下:
1 | @import "./index.styl"; |
styles/index.styl 代码如下:
1 | body |
安装HappyPack插件
1 | npm i -D happypack |
配置HappyPack
首先在webpack中引入happyPack, 如下代码:
1 | // 引入HappyPack插件 |
js模块默认不使用 HappyPack编译, 是如下配置:
1 | module.exports = { |
使用 HappyPack 配置,变成如下:
1 | module.exports = { |
plugins配置如下:
1 | module.exports = { |
因此所有的webpack配置代码如下:
1 | const path = require('path'); |
小结
如上配置代码:
- 在Loader配置中,对所有的文件的处理都交给了happypack/loader(除了styl中使用postcss外,对这个处理貌似会报错),happypack/loader?id=xx 紧跟的id=xxx,就是告诉happy-loader选择哪个happyPack的实列处理文件。
- 在plugin插件配置中新增了HappyPack的实列,作用是告诉HappyPack如何处理该文件
HappyPack实列中除了有 id 和 loaders两个属性外,还有如下几个属性:
threads: 代表开启几个子进程去处理这一类文件,默认是3个,必须是整数。
verbose: 是否允许HappyPack输出日志,默认为true。
threadPool: 代表共享进程池。即多个HappyPack实列都使用同一个共享进程池中的子进程去处理任务。以防止资源占用过多。
1 | const HappyPack =require (’happypack’); |