博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 happypack 提升 Webpack 项目构建速度
阅读量:5937 次
发布时间:2019-06-19

本文共 3776 字,大约阅读时间需要 12 分钟。

本文简单介绍了 Happypack 的简单使用,不了解的同学可以进来看一看。也许会有所帮助。


Happypack 作用

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

而 Happypack 的作用就是将文件解析任务分解成多个子进程并发执行。子进程处理完任务后再将结果发送给主进程。所以可以大大提升 Webpack 的项目构件速度

由于 JavaScript 是单线程模型,要想发挥多核 CPU 的能力,只能通过多进程去实现,而无法通过多线程实现。

本文项目代码地址:

欢迎 Star!


Happypack 的使用

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

安装

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

使用(三步操作即可完成)

一、安装完成之后引入 HappyPack

webpack.config.js

const HappyPack = require('happypack');module.exports = {    ...}复制代码

二、将常用的 loader 替换为 happypack/loader

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/        ]    }}复制代码

三、创建 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: 3Happy[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 地址

本文项目代码地址:

欢迎 Star!

转载地址:http://iyttx.baihongyu.com/

你可能感兴趣的文章
好用的CSS模块化打包工具CSS-COMBO
查看>>
python 中的字符和字符串
查看>>
C#Winform限制Textbox只能输入数字
查看>>
EL表达式经典用法
查看>>
java.lang.NoClassDefFoundError: javax/mail/Authenticator
查看>>
联想集团涨超7% 杨元庆持股比例升至8.12%
查看>>
各省光伏十三五规划汇总:总规模将超130GW
查看>>
Apache Storm 官方文档 —— 常用模式
查看>>
聊聊JVM的年轻代
查看>>
lvm逻辑卷管理
查看>>
VS2010不能断点/下断的问题
查看>>
[Android]权限处理
查看>>
Spark bind on port 0. Attempting port 1 问题解决
查看>>
兼容所有浏览器的复制到剪切板功能,悬浮层不能复制问题解决
查看>>
day 20 第一阶段考试总结
查看>>
我的友情链接
查看>>
Centos 7.5 部署DNS
查看>>
yum简介
查看>>
cp讲解
查看>>
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
查看>>