最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Webpack从手把手配置到原理浅析(四):构建速度优化

    正文概述 掘金(ScarlettLL)   2021-01-03   582

    在开发过程中,源文件经常要被修改,免不了要重新构建打包,才能看到修改后的效果。这时候构建速度就显得尤为重要,构建速度的优化能极大地提高开发效率和体验。 本文介绍一些常见的Webpack优化构建速度的方法。

    优化babel-loader

    babel-loader的作用是将ES6及以上的语法转译为浏览器能识别的ES5语法,速度很慢。所以优化的点在于:

    1. 明确转译范围,确保转译尽可能少的文件

      明确includeexclude,即告诉Webpack使用babel-loader的文件范围

    2. 使用缓存

      开启babel-loadercacheDirectory选项,当有设置时,指定的目录将用来缓存 loader 的执行结果。之后的 webpack 构建,将会尝试读取缓存,来避免在每次执行时,可能产生的、高性能消耗的 Babel 重新编译过程。如果设置了一个空值 (loader: 'babel-loader?cacheDirectory') 或者 true (loader: 'babel-loader?cacheDirectory=true'),loader 将使用默认的缓存目录 node_modules/.cache/babel-loader,如果在任何根目录下都没有找到 node_modules 目录,将会降级回退到操作系统默认的临时文件目录。

    module: {
      rules: [
        {
          test: /\.js$/,
          loader: ['babel-loader?cacheDirectory'],
          include: srcPath,
          // exclude: /node_modules/
          }
        }
      ]
    }
    

    Happypack多进程打包

    在使用 Webpack 对项目进行构建时,会对大量文件进行解析和处理。当文件数量变多之后,Webpack 构件速度就会变慢。由于运行在 Node.js 之上的 Webpack 是单线程模型的,所以 Webpack 需要处理的任务要一个一个进行操作。 而 happypack 的作用就是将文件解析任务分解成多个子进程并发执行。子进程处理完任务后再将结果发送给主进程。所以可以大大提升 Webpack 的项目构件速度。 happypack 只是作用在 loader 上,使用多个进程同时对文件进行编译。

    1.引入happypack插件

    const HappyPack = require('happypack')
    
    module.exports = {
        // ...
        plugins: [
            // happypack 开启多进程打包
            new HappyPack({
                // 用唯一的标识符 id 来代表当前的 HappyPack 是用来处理一类特定的文件
                id: 'babel',
                // 如何处理 .js 文件,用法和 Loader 配置中一样
                loaders: ['babel-loader?cacheDirectory']
            }),
        ],
    }
    

    2.将普通的loader替换为happypack/loader

    module.exports = {
        // ...
        module: {
            rules: [
                {
                    test: /\.js$/,
                    // 把对 .js 文件的处理转交给 id 为 babel 的 HappyPack 实例
                    use: ['happypack/loader?id=babel'],
                    include: srcPath,
                    // exclude: /node_modules/
                },
            ]
        },
        // ...
    };
    

    ParalleUglifyPlugin多进程压缩JS

    happypack多进程打包类似,Webpack压缩也可以开启多进程,webpack-parallel-uglify-plugin就是为了开启并行压缩JS代码而生。

    const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin')
    
    module.exports = {
        // ...
        plugins: [
         // 使用 ParallelUglifyPlugin 并行压缩输出的 JS 代码
         new ParallelUglifyPlugin({
             // 传递给 UglifyJS 的参数
             // (还是使用 UglifyJS 压缩,只不过帮助开启了多进程)
             uglifyJS: {
                 output: {
                     beautify: false, // 最紧凑的输出
                     comments: false, // 删除所有的注释
                 },
                 compress: {
                     // 删除所有的 `console` 语句,可以兼容ie浏览器
                     drop_console: true,
                     // 内嵌定义了但是只用到一次的变量
                     collapse_vars: true,
                     // 提取出出现多次但是没有定义成变量去引用的静态值
                     reduce_vars: true,
                 }
             }
         })
        ],
    }
    

    关于开启多进程

    在上面的介绍中,happypackParalleUglifyPlugin都会开启多进程。 多进程打包可以将打包任务分解成多个子任务并发打包,但是不一定都能对项目的构建速度进行优化,要分情况讨论。

    • 项目较大,本身打包速度较慢,那么开启多进程打包确实是可以提升构建速度
    • 项目较小,本身打包速度就很快,开启多进程打包反而会降低构建速度,因为开启多线程需要开销大

    结论:不能盲目使用多进程打包,应该要结合自己项目的特点,按需使用。


    起源地下载网 » Webpack从手把手配置到原理浅析(四):构建速度优化

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元