不行,太慢了,看我怎么加速构建启动项目

374 阅读2分钟

平时做的项目中很多都采用webpack去构建,但由于js单线程的特点,使用默认配置只能单线程去启动应用。当项目体积过大时,启动1分钟左右是很正常的事。如果我们联想到传说中的“墨菲定律”,自然就会有个问题:可以尝试多线程构建项目吗?

想到这里,恭喜您已经击败了全国90%的选手!

在此安利一个webpack第三方npm插件,happypackwww.npmjs.com/package/hap…

接下来是常规用法(引包+new+配置):

1.引包:

在webpack的配置文件中引入happypack

const HappyPack = require('happypack');

2.没有那就new一个:

new HappyPack()

3.配置:

new HappyPack({
    id: “babel”,
    threadPool: happyThreadPool,
    loaders: [
      ...,
      loader: "babel-loader",
      ...
    ]
})

4.补充缺少参数:

(1)threadPool:

共享进程池,由HappyPack实例去管理。此处应采用HappyPack.ThreadPool(size: 16)赋值当前电脑的线程信息。其中size为当前电脑cpu的线程总数,调用node核心模块os可以获取到cpu信息:

const happyThreadPool = HappyPack.ThreadPool({
  size: os.cpus().length
})

尝试打印输出

{
  size: 16,
  start: [Function: start],
  isRunning: [Function: isRunning],
  compile: [Function: compile],
  stop: [Function: stop]
}

(2)loaders:[]

很多小伙伴看到这里有些疑问:一般loader属于模块,是要配置在modules里,但这里的loaders是有什么不同吗?

其实既然用了loaders,我们就把modules里需要并行处理的loader全部移到这里。因为构建的大部分时间全消耗了loader的过程,所以我们要用happypack去管理loader,将loader的任务分成不同线程去执行,这样就加快了构建速度。 然后我们需要改造一下原来在modules里的loader。 将
loaders: [...,loader: "babel-loader",...]
改造成
use:'happypack/loader',

这就是告诉webpack通过happypack插件中的loader去处理某些文件。

如果有多个HappyPack实例,需要匹配HappyPack的id,如: use:'happypack/loader?id=babel'

5.效果展示:

在此我在github上找了一个项目:github.com/bailicangdu…,便于演示加速效果。

加速配置前(15.57s):

image.png

加速配置后(0.576s):

image.png
至于这个测速插件,请大家自行参考:www.npmjs.com/package/spe…,我也会在后续的文章中记录。