前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5-12 webpack 性能优化(3)

5-12 webpack 性能优化(3)

作者头像
love丁酥酥
修改2023-09-21 19:13:26
1.3K0
修改2023-09-21 19:13:26
举报
文章被收录于专栏:coding for lovecoding for love

简介

本章继续介绍一些细节上的优化。

6. 控制包文件大小

及时删除无用的模块,不要引入无用的文件,使用 treeshaking 尽量减少包体。也可以利用 splitchunks 将包文件切割,有效率利用缓存。

7. 多进程打包

webpack 本身是单线程打包,将其扩展为多进程模式,可以分利用多核的优势。关于中丝路,目前有以下三种解决方案:

7.1 thread-loader

把这个 loader 放置在其他 loader 之前, 放置在这个 loader 之后的 loader 就会在一个单独的 worker 池(worker pool)中运行。

在 worker 池(worker pool)中运行的 loader 是受到限制的。例如:

  • 这些 loader 不能产生新的文件。
  • 这些 loader 不能使用定制的 loader API(也就是说,通过插件)。
  • 这些 loader 无法获取 webpack 的选项设置。
  • 每个 worker 都是一个单独的有 600ms 限制的 node.js 进程。同时跨进程的数据交换也会被限制。

应该仅在耗时的 loader 上使用。

代码语言:javascript
复制
npm install --save-dev thread-loader
代码语言:javascript
复制
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        include: path.resolve("src"),
        use: [
          "thread-loader",
          "expensive-loader"
        ]
      }
    ]
  }
}

7.2 happypack

happypack 的处理思路是将原有的 webpack 对 loader 的执行过程从单一进程的形式扩展多进程模式,原本的流程保持不变。其详细原理可以参考 happypack 原理解析

代码语言:javascript
复制
npm install --save-dev happypack
代码语言:javascript
复制
// @file: webpack.config.js
const HappyPack = require('happypack');

exports.module = {
  rules: [
    {
      test: /.js$/,
      // 1) replace your original list of loaders with "happypack/loader":
      // loaders: [ 'babel-loader?presets[]=es2015' ],
      use: 'happypack/loader',
      include: [ /* ... */ ],
      exclude: [ /* ... */ ]
    }
  ]
};

exports.plugins = [
  // 2) create the plugin:
  new HappyPack({
    // 3) re-add the loaders you replaced above in #1:
    loaders: [ 'babel-loader?presets[]=es2015' ]
  })
];

7.3 并行压缩

这个是专门针对压缩阶段的并行处理,因为打包过程中压缩基本上是最耗时的阶段了。

7.3.1 webpack-parallel-uglify-plugin(webpack3使用)

如果使用 webpack4,就不用关注这个了。

代码语言:javascript
复制
import ParallelUglifyPlugin from 'webpack-parallel-uglify-plugin';
 
module.exports = {
  plugins: [
    new ParallelUglifyPlugin({
      // Optional regex, or array of regex to match file against. Only matching files get minified.
      // Defaults to /.js$/, any file ending in .js.
      test,
      include, // Optional regex, or array of regex to include in minification. Only matching files get minified.
      exclude, // Optional regex, or array of regex to exclude from minification. Matching files are not minified.
      cacheDir, // Optional absolute path to use as a cache. If not provided, caching will not be used.
      workerCount, // Optional int. Number of workers to run uglify. Defaults to num of cpus - 1 or asset count (whichever is smaller)
      sourceMap, // Optional Boolean. This slows down the compilation. Defaults to false.
      uglifyJS: {
        // These pass straight through to uglify-js@3.
        // Cannot be used with uglifyES.
        // Defaults to {} if not neither uglifyJS or uglifyES are provided.
        // You should use this option if you need to ensure es5 support. uglify-js will produce an error message
        // if it comes across any es6 code that it can't parse.
      },
      uglifyES: {
        // These pass straight through to uglify-es.
        // Cannot be used with uglifyJS.
        // uglify-es is a version of uglify that understands newer es6 syntax. You should use this option if the
        // files that you're minifying do not need to run in older browsers/versions of node.
      }
    }),
  ],
};

7.3.2 uglifyjs-webpack-plugin (webpack4 的 production mode 默认启用)

webpack4 默认启用,一般无需关心。

[

new UglifyJsPlugin({

uglifyOptions: {

ie8: false,

ecma: 8,

parse: {...options},

mangle: {

...options,

properties: {

// mangle property options

}

},

output: {

comments: false,

beautify: false,

...options

},

compress: {...options},

warnings: false

}

})

]

7.3.3 terser-webpack-plugin (推荐使用)

terser 较 uglifyjs 压缩性能更好,推荐使用。而且用法很简单,webpack4 支持在 optimization 配置中指定压缩插件。

代码语言:javascript
复制
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
};

8. 合理使用 sourcemap

这个可以参考前面讲解 sourceMap的配置 的章节。

9. 利用分析工具

这个可以参考前面讲解 打包分析的章节,由其关注以下两个工具。

10. 开发环境内存读取

使用 dev-server

11. 开发环境无用插件剔除

其实就是设置成 development,然后尽量少引入一些不必要的产检,比如开发环境完全没必要压缩。

参考

即刻起,加速您的前端构建

webpack打包极限优化

性能

happypack 原理解析

webpack4配置总结(六)webpack4提升180%编译速度

webpack 打包优化的四种方法(多进程打包,多进程压缩,资源 CDN,动态 polyfill)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 6. 控制包文件大小
  • 7. 多进程打包
    • 7.1 thread-loader
      • 7.2 happypack
        • 7.3 并行压缩
          • 7.3.1 webpack-parallel-uglify-plugin(webpack3使用)
          • 7.3.2 uglifyjs-webpack-plugin (webpack4 的 production mode 默认启用)
          • 7.3.3 terser-webpack-plugin (推荐使用)
      • 8. 合理使用 sourcemap
      • 9. 利用分析工具
      • 10. 开发环境内存读取
      • 11. 开发环境无用插件剔除
      • 参考
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档