使用 happypack 提高 Webpack 项目构建速度

本文简单介绍了 Happypack 的简单使用,不了解的同窗能够进来看一看。也许会有所帮助。css


Happypack 做用

在使用 Webpack 对项目进行构建时,会对大量文件进行解析和处理。当文件数量变多以后,Webpack 构件速度就会变慢。因为运行在 Node.js 之上的 Webpack 是单线程模型的,因此 Webpack 须要处理的任务要一个一个进行操做。node

而 Happypack 的做用就是将文件解析任务分解成多个子进程并发执行。子进程处理完任务后再将结果发送给主进程。因此能够大大提高 Webpack 的项目构件速度webpack

因为 JavaScript 是单线程模型,要想发挥多核 CPU 的能力,只能经过多进程去实现,而没法经过多线程实现。git

本文项目代码地址:webpack-happypack-demogithub

欢迎 Star!web


Happypack 的使用

Happypack 只是做用在 loader 上,使用多个进程同时对文件进行编译。npm

安装

$ npm install happypack --save-dev
复制代码

使用(三步操做便可完成)

1、安装完成以后引入 HappyPack

webpack.config.jsbash

const HappyPack = require('happypack');

module.exports = {
    ...
}
复制代码

2、将经常使用的 loader 替换为 happypack/loader

webpack.config.jsbabel

const HappyPack = require('happypack');

module.exports = {
    ...
    module: {
        rules: [
            test: /\.js$/,
            // use: ['babel-loader?cacheDirectory'] 以前是使用这种方式直接使用 loader
            // 如今用下面的方式替换成 happypack/loader,并使用 id 指定建立的 HappyPack 插件
            use: ['happypack/loader?id=babel'],
            // 排除 node_modules 目录下的文件
            exclude: /node_modules/
        ]
    }
}
复制代码

3、建立 HappyPack 插件

webpack.config.js多线程

const HappyPack = require('happypack');

module.exports = {
    ...
    module: {
        rules: [
            test: /\.js$/,
            // use: ['babel-loader?cacheDirectory'] 以前是使用这种方式直接使用 loader
            // 如今用下面的方式替换成 happypack/loader,并使用 id 指定建立的 HappyPack 插件
            use: ['happypack/loader?id=babel'],
            // 排除 node_modules 目录下的文件
            exclude: /node_modules/
        ]
    },
    plugins: [
        ...,
        new HappyPack({
            /* * 必须配置 */
            // id 标识符,要和 rules 中指定的 id 对应起来
            id: 'babel',
            // 须要使用的 loader,用法和 rules 中 Loader 配置同样
            // 能够直接是字符串,也能够是对象形式
            loaders: ['babel-loader?cacheDirectory']
        })
    ]
}
复制代码

这样 Happypack 的使用就配置完了,运行项目,能够看到控制台打印以下提示:

Happy[babel]: Version: 5.0.1. Threads: 3
Happy[babel]: All set; signaling webpack to proceed.
复制代码

说明配置生效了。

Happypack 示例

使用单个 loader

上面的使用中就是单个 loader 时的配置,这里再写一次

exports.module = {
    rules: [
        {
            test: /.js$/,
            use: 'happypack/loader?id=babel'
        }
    ]
};

exports.plugins = [
    new HappyPack({
        id: 'babel',
        loaders: [ 'babel-loader?cacheDirectory' ]
    });
];
复制代码

使用多个 loader

exports.module = {
    rules: [
        {
            test: /\.(css|less)$/,
            use: 'happypack/loader?id=styles'
        },
    ]
};

exports.plugins = [
    new HappyPack({
        id: 'styles',
        loaders: [ 'style-loader', 'css-loader', 'less-loader' ]
    });
];
复制代码

Happypack 配置项

  • id: String类型,对于 happypack 来讲惟一的 id 标识,用来关联 module.rules 中的 happypack/loader

  • loaders: Array类型,设置各类 loader 配置,与 module.rulesloader 的配置用法同样

// 无配置时,可直接使用字符串形式
new HappyPack({
    id: 'babel',
    loaders: ['babel-loader?cacheDirectory']
})

// 有配置项时,可使用对象形式
new HappyPack({
    id: 'babel',
    loaders: [
        {
            loader: 'babel-loader',
            options: {
                cacheDirectory: true
            }
        }
    ]
})
复制代码
  • threads: Number类型,指示对应 loader 编译源文件时同时使用的进程数,默认是 3

  • threadPool: HappyThreadPool对象,表明共享进程池,即多个 HappyPack 实例都使用同一个共享进程池中的子进程去处理任务,以防止资源占用过多

// 建立一个 HappyThreadPool,做为全部 loader 共用的线程池
const happyThreadPool = HappyPack.ThreadPool({ size: 5 });

...
new HappyPack({
    id: 'babel',
    loaders: [
        {
            loader: 'babel-loader',
            options: {
                cacheDirectory: true
            }
        }
    ],
    threadPool: happyThreadPool
})
复制代码
  • verbose: 是否容许 happypack 输出日志,默认是 true

  • verboseWhenProfiling: 是否容许 happypack 在运行 webpack --profile 时输出日志,默认是 false

  • debug: 是否容许 happypack 打印 log 分析信息,默认是 false


我的总结

我的的一点小总结,不足以做为参考依据

  • 在测试 Demo 或者小型项目中,使用 happypack 对项目构建速度的提高不明显,甚至会增长项目的构建速度

  • 在比较复杂的大中型项目中,使用 happypack 才能看到比较明显的构建速度提高

  • 所以,在使用 happypack 时请根据具体状况进行选择,若是反而延长了项目的构建速度,就没有必要使用 happypack


本文 Demo 地址

本文项目代码地址:webpack-happypack-demo

欢迎 Star!

相关文章
相关标签/搜索