webpack HappyPack实战详解


Posted in Javascript onOctober 08, 2019

由于运行在 Node.js 之上的 Webpack 是单线程模型的,所以Webpack 需要处理的事情需要一件一件的做,不能多件事一起做。

我们需要Webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威力,HappyPack 就能让 Webpack 做到这点,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

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

提示:由于HappyPack 对file-loader、url-loader 支持的不友好,所以不建议对该loader使用。

安装 HappyPack

npm i -D happypack

运行机制

webpack HappyPack实战详解

使用 HappyPack

修改你的webpack.config.js 文件

const HappyPack = require('happypack');
const os = require('os');
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });

module.exports = {
 module: {
  rules: [
   {
    test: /\.js$/,
    //把对.js 的文件处理交给id为happyBabel 的HappyPack 的实例执行
    loader: 'happypack/loader?id=happyBabel',
    //排除node_modules 目录下的文件
    exclude: /node_modules/
   },
  ]
 },
plugins: [
  new HappyPack({
    //用id来标识 happypack处理那里类文件
   id: 'happyBabel',
   //如何处理 用法和loader 的配置一样
   loaders: [{
    loader: 'babel-loader?cacheDirectory=true',
   }],
   //共享进程池
   threadPool: happyThreadPool,
   //允许 HappyPack 输出日志
   verbose: true,
  })
 ]
}
  1. 在 Loader 配置中,所有文件的处理都交给了 happypack/loader 去处理,使用紧跟其后的 querystring ?id=babel 去告诉 happypack/loader 去选择哪个 HappyPack 实例去处理文件。
  2. 在 Plugin 配置中,新增了两个 HappyPack 实例分别用于告诉 happypack/loader 去如何处理 .js 和 .css 文件。选项中的 id 属性的值和上面 querystring 中的 ?id=babel 相对应,选项中的 loaders 属性和 Loader 配置中一样。

HappyPack 参数

  • id: String 用唯一的标识符 id 来代表当前的 HappyPack 是用来处理一类特定的文件.
  • loaders: Array 用法和 webpack Loader 配置中一样.
  • threads: Number 代表开启几个子进程去处理这一类型的文件,默认是3个,类型必须是整数。
  • verbose: Boolean 是否允许 HappyPack 输出日志,默认是 true。
  • threadPool: HappyThreadPool 代表共享进程池,即多个 HappyPack 实例都使用同一个共享进程池中的子进程去处理任务,以防止资源占用过多。
  • verboseWhenProfiling: Boolean 开启webpack --profile ,仍然希望HappyPack产生输出。
  • debug: Boolean 启用debug 用于故障排查。默认 false。

总结

如果想详细了解happypack的原理 可以看这篇文章
happypack 原理解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript div 遮罩层封锁整个页面
Jul 10 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
修复bash漏洞的shell脚本分享
Dec 31 Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
JS模拟实现方法重载示例
Aug 03 Javascript
Vue.js实现无限加载与分页功能开发
Nov 03 Javascript
javascript防篡改对象实例详解
Apr 10 Javascript
React中ES5与ES6写法的区别总结
Apr 21 Javascript
vue router 配置路由的方法
Jul 26 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
小程序外卖订单界面的示例代码
Dec 30 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 #Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 #Javascript
vue-cli和v-charts实现可视化图表过程解析
Oct 08 #Javascript
vue路由传参页面刷新参数丢失问题解决方案
Oct 08 #Javascript
vux-scroller实现移动端上拉加载功能过程解析
Oct 08 #Javascript
深入学习Vue nextTick的用法及原理
Oct 08 #Javascript
jQuery 筛选器简单操作示例
Oct 02 #jQuery
You might like
Protoss热键控制
2020/03/14 星际争霸
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
Javascript 按位与运算符 (&)使用介绍
2014/02/04 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
对Django url的几种使用方式详解
2019/08/06 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
python可以用哪些数据库
2020/06/22 Python
python输入中文的实例方法
2020/09/14 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
什么是数组名
2012/05/10 面试题
高中学生干部学习的自我评价
2014/02/21 职场文书
说明书范文
2014/05/07 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
加强作风建设工作总结
2014/10/23 职场文书
运动会广播稿300字
2015/08/19 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
Oracle使用别名的好处
2022/04/19 Oracle