webpack HappyPack多个进程处理loader

webpack HappyPack多个进程处理loader文章目录文章参考什么是 HappyPack 作用是什么 HappyPack 的基本原理 使用案例安装依赖库 webpack config js 配置如何使用 happypack 配置说明 webpack 配置问题 HappyPack pluginforthe 1 couldnotbefo 文章参考 roadhog 构建优化深入浅出的 webpack 构建工具 Happy

文章参考

  1. roadhog 构建优化
  2. 深入浅出的webpack构建工具—HappyPack优化构建(九)

什么是HappyPack? 作用是什么?

  1. Webpack是允许在NodeJS中的,它是单线程模型的,因此webpack在构建文件时,比如js,css,图片及字体时,它需要一个一个去解析和编译,不能同时处理多个任务。
  2. 特别当文件数量变多后,webpack构建慢的问题会显得更为严重。
  3. 因此HappyPack出现了,它能让webpack同时处理多个任务,它将任务分解给多个子进程去并发执行,子进程处理完成后再将结果发送给主进程中。

HappyPack的基本原理?

在webpack构建过程中,我们需要使用Loader对js,css,图片,字体等文件做转换操作,并且转换的文件数据量也是非常大的,且这些转换操作不能并发处理文件,而是需要一个个文件进行处理,HappyPack的基本原理是将这部分任务分解到多个子进程中去并行处理,子进程处理完成后把结果发送到主进程中,从而减少总的构建时间。

使用案例

安装依赖库

cnpm i -D happypack 

webpack.config.js 配置如何使用 happypack

  1. 在plugin中配置happypack实例
  2. 在loader中使用 happypack 创建的进程
 // 引入HappyPack插件  const HappyPack = require('happypack'); const os = require('os'); const happyThreadPool = HappyPack.ThreadPool({ 
   size: os.cpus().length}); console.log("happyThreadPool:" + happyThreadPool) // 构造出共享进程池,在进程池中包含 5 个子进程 // const happyThreadPool = HappyPack.ThreadPool({ size : 5 }) ; module.exports = { 
    mode: "development", // mode: "production", entry: { 
    main: "./main.js" // lodash: './src/template/lodash.js' }, output: { 
    path: path.resolve(__dirname, "dist"), filename: "main.js" }, resolve: { 
    // 定义路径别名 alias: { 
    "@": path.resolve(__dirname, "./"), // @src 代表 “工程目录/src” "@src": path.resolve(__dirname, "./src"), // @component 代表 “工程目录/src/components” "@component": path.resolve(__dirname, "./src/components") }, // 指定第三方模块加载的路径,例如 jquery 、lodash等 modules: ["node_modules", "./lib/components"], // 如果引入的文件没有后缀名,默认会优先去找 js文件,如果没有就去找 ts文件,如果没有就找json文件,依次类推,默认是 js extensions: [".js", ".ts", ".json"] }, module: { 
    rules: [ { 
    test: /\.js$/, // 排除 node_modules 和 bower_components 下的文件 exclude: /(node_modules|bower_components)/, use: { 
    // loader: "babel-loader", loader: 'happypack/loader?id=babel', // options: { 
    // presets: [ // [ // "@babel/preset-env", // { 
    // // 只引用使用了新特性 polyfill // // useBuiltIns: 'usage' // } // ] // ] // } } }, { 
    test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/, use: { 
    loader: "file-loader", options: { 
    esModule: false, // 这里设置为false outputPath: "fonts/", // 指定字体输入的文件夹,打包地址是 “/dist/fonts/字体文件” publicPath: "/fonts" // 指定字体的路径,即打包结果引入的地址是 "/fonts/字体文件名" } } }, { 
    test: /\.(png|jpg|gif)$/, use: [ { 
    loader: 'happypack/loader?id=image', // loader: "url-loader", // options: { 
    // esModule: false, // 这里设置为false // outputPath: "images/", // 指定图片输入的文件夹, 打包地址是 “/dist/images/图片名字” // publicPath: "/images", // 指定获取图片的路径,即打包结果引入的地址是 "/images/图片名字" // // limit (如果小于 8192字节 ,则转为base64,否则返回一个url地址) // limit: 8192, // name: "[name].[hash:8].[ext]" // 输入的图片名 // } } ] }, { 
    test: /\.(scss|css)$/, / * loader 是从又向做执行 * 1. 最先执行 sass-loader ,将 sass 文件转为css * 2. css-loader 将转换后的css文件转为 js模块 * 3. style-loader 将 css 插入到HTML中的 use: [ devMode ? { 
    loader: "style-loader" // 将 JS 字符串生成为 style 节点 } : MiniCssExtractPlugin.loader, { 
    // loader: "css-loader" // 将 CSS 转化成 CommonJS 模块 loader: 'happypack/loader?id=css-pack' // 将 CSS 转化成 CommonJS 模块 }, { 
    loader: "sass-loader" // 将 Sass 编译成 CSS } ] // 等价于 // use: ["style-loader", "css-loader", "sass-loader"] } ] }, plugins: [ new CleanWebpackPlugin(), //删除上次打包文件,默认目录'./dist' / 使用HappyPack实例化 */ new HappyPack({ 
    // 用唯一的标识符id来代表当前的HappyPack 处理一类特定的文件 id: 'babel', // 使用共享进程池中的子进程去处理任务。 // threadPool: happyThreadPool, // 如何处理.js文件,用法和Loader配置是一样的 loaders: [{ 
    loader: 'babel-loader', options: { 
    presets: [ [ "@babel/preset-env", { 
    // 只引用使用了新特性 polyfill // useBuiltIns: 'usage' } ] ] } }] }), new HappyPack({ 
    id: 'image', // threadPool: happyThreadPool, loaders: [{ 
    loader: 'url-loader', options: { 
    esModule: false, // 这里设置为false outputPath: "images/", // 指定图片输入的文件夹, 打包地址是 “/dist/images/图片名字” publicPath: "/images", // 指定获取图片的路径,即打包结果引入的地址是 "/images/图片名字" // limit (如果小于 8192字节 ,则转为base64,否则返回一个url地址) limit: 8192, name: "[name].[hash:8].[ext]" // 输入的图片名 } }] }), // 处理css文件 new HappyPack({ 
    id: 'css-pack', // threadPool: happyThreadPool, loaders: [{ 
    loader: 'css-loader' }] }) ], }; 

配置说明

  1. happypack/loader?id=xx 紧跟的id=xxx,就是告诉happy-loader选择哪个happyPack的实列处理文件。
  2. 在plugin插件配置中新增了HappyPack的实列,作用是告诉HappyPack如何处理该文件

webpack配置问题:HappyPack: plugin for the loader ‘1’ could not be found?

用了 happypack 之后,不能在 rules 里面的相关 loader 中配置 options,相反只能在 happypack 插件中配置 options!

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

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

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


相关推荐

  • WERTC-在Ubuntu中搭建ICE服务器

    WERTC-在Ubuntu中搭建ICE服务器1.ICE服务器介绍最近一段时间在做关于webrtc语音视频通话,网上免费的公开的STUN服务器可以用于测试,使用起来响应时间非常的慢,用起来不爽。作为一个有情怀的技术人员的我,就需要自己搭建了coturn服务器,现在分享给大家。前提先介绍一下ICE服务器,ICE服务器包含了STUN和TURN两部分,实际上我们就需要TURN服务器就可以进行P2P穿墙。coturn服务器是在turnserver上增加了部分高级特性(感谢项目作者,为我们提供了很好的环境)。coturn支持cp,udp,

    2022年4月30日
    47
  • 推荐一个好的Redis GUI 客户端工具

    推荐一个好的Redis GUI 客户端工具

    2021年11月4日
    45
  • 详解Android布局中gravity与layout_gravity属性[通俗易懂]

    详解Android布局中gravity与layout_gravity属性[通俗易懂]在android布局中,我们经常会用到“重心”-gravity这个属性。但是gravity有不同的类型:gravitylayout_gravity相对布局中的layout_center等属性今天我们就来具体说说。1、gravitygravity属性是对控件自身内容对自己的限定,拿布局文件test.xml举例来说:此时在TextView中并没有对gravity属性进行操作,文字内容如上图。接下

    2022年7月13日
    16
  • log4j的配置ConversionPattern详细讲解[通俗易懂]

    log4j的配置ConversionPattern详细讲解[通俗易懂]原文来自https://blog.csdn.net/reserved_person/article/details/52849505感谢大佬先写下我一直没找到的ConversionPattern里面参数代表的详细含义参数 说明 例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件…

    2022年8月22日
    10
  • 计算机组成原理知识点总结(第2篇 第3、4章)[通俗易懂]

    计算机组成原理知识点总结(第2篇 第3、4章)[通俗易懂]基于计算机组成原理(第2版)唐朔飞编著第2篇计算机系统的硬件结构 第3章系统总线总线是连接多个部件(模块)的信息传输线,是各部件共享的传输介质。在某一时刻只允许有一个部件向总线发送信息,但多个部件可以同时从总线上接收相同的信息。总线通信分为异步和同步两大类。总线的定义:为多个功能组件服务的一组公用信息线。按功能分类:地址总线、数据总线、控制总线。按连接部件不同分类:片内总线、系…

    2022年5月10日
    36
  • 在PyCharm环境下使用Jupyter Notebook

    在PyCharm环境下使用Jupyter Notebook1 安装 JupyterNoteb 打开 Pytharm 中的 setting 找到 ProjectInter 里面通过 号添加 如下图 然后搜索 Jupyter 点击 install 安装 2 在 PyCharm 中新建 JupyterNoteb 文件步骤 File gt New gt JupyterNoteb gt 输入文件名建好之后效果如下图

    2026年3月19日
    1

发表回复

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

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