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

使用 happypack 提升 Webpack 项目构建速度本文简单介绍了 Happypack 的简单使用 不了解的同学可以进来看一看 也许会有所帮助 Happypack 作用在使用 Webpack 对项目进行构建时 会对大量文件进行解析和处理 当文件数量变多之后 Webpack 构件速度就会变慢 由于运行在 Node js 之上的 Webpack 是单线程模型的 所以 Webpack 需要处理的任务要一个一个进行操作 而 Happypack 的作

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


Happypack 作用

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

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

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

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

欢迎 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: 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!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176643.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:24
下一篇 2026年3月26日 下午9:25


相关推荐

  • ref out param 区别

    ref out param 区别

    2022年3月8日
    42
  • .bat文件打开方式[通俗易懂]

    .bat文件打开方式[通俗易懂]有的时候不小心将后缀名.bat文件在选择打开方式时误勾选了用记事本或者其他文本编辑器打开,结果电脑上的*.bat文件的打开方式都变成了记事本或者其他文本编辑器。本方法就是恢复.bat文件的默认打开方式。1、同时按住windows键和R键,在出来的框中输入regedit,打开注册表编辑器。2、找到:计算机\HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\currentversion\Explorer\FileExts.bat删除除了openwithlist

    2022年7月15日
    25
  • mybatis看这一篇就够了,简单全面一发入魂

    mybatis看这一篇就够了,简单全面一发入魂文章目录Mybatis概述快速入门原生开发示例基于Mapper代理的示例基于注解的示例应用场景主键返回批量查询动态SQL缓存关联查询延迟加载逆向工程PageHelper分页插件MybatisPlusMybatis概述mybatis是什么?有什么特点?它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低什么是ORM?ObjectRelationMapping,对象关系映射。对象指的是Java

    2022年7月14日
    22
  • JavaSE基础(101) 遍历ArrayList集合的4种方式[通俗易懂]

    JavaSE基础(101) 遍历ArrayList集合的4种方式[通俗易懂]ArrayList遍历:取出ArrayList集合中的数据①:for循环②:增强for循环:foreach③:Iterator:迭代器④:ListIterator:双向迭代器ex:/***ArrayList遍历:取出ArrayList集合中的数据*①:for循环*②:增强for循环:foreach*③:Iterator:迭代器*④:…

    2022年7月22日
    16
  • rabbitmq 启动命令「建议收藏」

    rabbitmq 启动命令「建议收藏」linux系统:centos71.启动前,查看mq状态systemctlstatusrabbitmq-server2.启动systemctlstartrabbitmq-server3.停止systemctlstoprabbitmq-server4.重启restart5.打开浏览器管理页面:默认端口号15672systemctlstatusfirewalld//关闭防火墙systemctldisablefirewalldsystemctlstopfir

    2025年6月10日
    10
  • telnet如何测试端口是否能通_netstat查看端口状态

    telnet如何测试端口是否能通_netstat查看端口状态背景闲暇之余玩一下,特此纪要!问题telnet如何开启?telnet只有客户端没有服务端?如何下载telnet服务端?telnet如何测试端口?说明环境:Windows10纪要telnet如何开启?wondows+Rprint:controltelnet只有客户端没有服务端?上面的操作还不能够支持端口的通达测…

    2026年2月20日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号