zoukankan      html  css  js  c++  java
  • webpack优化之HappyPack

    前言

    由于运行在 Node.js 之上的 Webpack 是单线程模型的,所以Webpack 需要处理的事情需要一件一件的做,不能多件事一起做。
    我们需要Webpack 能同一时间处理多个任务,发挥多核 CPU 电脑的威力,HappyPack 就能让 Webpack 做到这点,它把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。

    由于 JavaScript 是单线程模型,要想发挥多核 CPU 的能力,只能通过多进程去实现,而无法通过多线程实现。
    
    提示:由于HappyPack 对file-loader、url-loader 支持的不友好,所以不建议对该loader使用。
    

    安装 HappyPack

    npm install --save-dev happypack
    

    运行机制

    使用 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,
        })
      ]
    }
    
    • Loader 配置中,所有文件的处理都交给了 happypack/loader 去处理,使用紧跟其后的 querystring ?id=happyBabel 去告诉 happypack/loader 去选择哪个 HappyPack 实例去处理文件。

    • Plugin 配置中,新增了两个 HappyPack 实例分别用于告诉 happypack/loader 去如何处理 .js 和 .css 文件。选项中的 id 属性的值和上面 querystring 中的 ?id=happyBabel 相对应,选项中的 loaders 属性和 Loader 配置中一样。

    HappyPack 参数

    这些是在实例化插件时可以传递给插件的参数。 loaders是唯一必需的参数。

    1. loaders: Array

    用法和 webpack Loader 配置中一样.
    下列符号受到正式支持,并且都等效

    {
      loaders: [
        // a string with embedded query for options
        'babel-loader?presets[]=es2015',
    
        {
          loader: 'babel-loader'
        },
    
        // "query" string
        {
          loader: 'babel-loader',
          query:  '?presets[]=es2015'
        },
    
        // "query" object
        {
          loader: 'babel-loader',
          query: {
            presets: [ 'es2015' ]
          }
        },
    
        // Webpack 2+ "options" object instead of "query"
        {
          loader: 'babel-loader',
          options: {
            presets: [ 'es2015' ]
          }
        }
      ]
    }
    

    2. id: String

    Happypack唯一的标识符 id , loader使用它来知道应该与哪个plugin通信。

    除非您定义了多个HappyPack插件,否则无需指定此名称,在这种情况下,您将需要不同的ID来区分它们

    默认为: "1"

    3. threads: Number

    代表开启几个子进程去处理这一类型的文件

    这仅在执行初始构建时才有意义, 因为HappyPack之后将切换到同步模式(即在watch 模式下)

    默认为: 3

    4. threadPool: HappyThreadPool

    代表共享进程池,即多个 HappyPack 实例都使用同一个共享进程池中的子进程去处理任务,以防止资源占用过多。
    默认为: null

    5. verbose: Boolean

    启用它可以将状态消息从HappyPack记录到STDOUT。
    默认为: true

    6. verboseWhenProfiling: Boolean

    即使在webpack --profile运行时HappyPack仍能产生其输出,请启用此选项。

    默认为: false

    7. debug: Boolean

    启用它可以将诊断消息从HappyPack记录到STDOUT。启用debug 用于故障排查。

    默认为: false

    参考

  • 相关阅读:
    不删除数据库,只删除GridView的某一行!
    纯CSS无图打造圆角Table 无图制作圆角
    2009年总结与2010总体计划
    工作中的碰到的问题,以及处理过程:
    SQL Server 2005 不允许远程连接解决方法
    Visual Studio 2008项目模板丢失的解决办法
    C#格式化数值结果表
    准备把csdn的博客搬到这里
    生产系统中 RAC 数据库服务器 不要批量 gzip压缩
    不再更新的业务统计表
  • 原文地址:https://www.cnblogs.com/qiqi715/p/12762042.html
Copyright © 2011-2022 走看看