webpack5性能优化

开发优化

  • 使用html-webpack-plugin 自动引入打包资源
  • 通过 eslint 格式化代码
  • babel处理 js 文件设置缓存(cacheDirectory)
  • loader 都可以设置缩小扫描范围的规则(include/exclude)
  • 开启 sourcemap 帮助我们快速定位问题
  • 使用 oneOf 解决 rules 匹配性能浪费的问题
  • 使用 thread-loader 多进程打包

生产优化

  • 资源文件打包 base64

    {
      test: /\.(png|jpe?g|gif|webp|svg)$/,
      type: 'asset', 
      parser: {
        dataUrlCondition: {
          maxSize: 4 * 1024 // 4kb 以下打包base64
        }
       }
    }
    
  • css文件的单独提取(1. 单独提取利用浏览器并行加在机制,2. 可以使用 splitchunk 减少重复引用导致的代码冗余)

    const MiniCssExtractPlugin = require("mini-css-extract-plugin");
    
  • css 样式的兼容性处理(使用了postcss)

    npm install postcss-loader postcss postcss-preset-env -D
    ... 具体配置流程详见 4.
    
  • css 样式压缩

    npm install css-minimizer-webpack-plugin --save-dev
    
  • 使用 babel 对 js 代码进行兼容性处理(简单的)

  • babel 使用 runtime 解决辅助代码重复的问题

  • 使用 core-js 处理 esnext 不能被 es5 转化的语法糖

  • 开启 sourcemap 帮助我们快速定位问题

  • 利用 webpack 提供的 tree-shaking (esm)

  • Tree-shaking 字面意思就是 摇晃树, 其实就是去除那些引用的但却没有使用的代码。
    Tree-shaking 概念最早由Rollup.js 提出,后来在webpack2中被引入进来,但是这个这一特性能够被支持得益于ES6 modules的静态特性。ES6的模块声明相比于传统CommonJS的同步require有着本质区别。这种modules设计保证了依赖关系是提前确定的,使得静态分析成为了可能,与运行时无关,记住,如果使用babel的话,需要关闭babel的modules配置,“modules”: false 的含义是关闭 Babel 的模块转换功能,保留原本的 ES6 模块化语法
    
  • 图片压缩(详见 10.)

  • splitchunk 帮我们自动扫描重复引用(自定义模块和第三方依赖),单独打包

  • splitchunk 帮我们对动态导入语法实现单独打包

  • 打包输出文件命名规则整理,结合 runtimeChunk,(帮助我们充分利用浏览器缓存)

  • // 添加 contenthash 当内容发生变化的时候加载新的资源
    output: {
        filename: '[name].[contenthash:8]js', // 正常 js 打包文件
        chunkFilename: '[name].chunk.[contenthash:8].js', // splitchunk 单独打包的文件增加一个.chunk标识
        assetModuleFilename: 'static/[hash:8][ext]', // 通过 'type: asset' 这种方式打包的资源文件
        path: path.join(__dirname, 'dist'),
        clean: true,
    },
      
    plugins: [new MiniCssExtractPlugin({
        filename: 'static/css/[name].[contenthash:8].css', // 指定输出目录
      	// 多次引入同一个 css 文件也可能单独打包 css 文件
      	chunkFilename: 'static/css/[name].chunk.[contenthash:8].css', // splitchunk 单独打包的文件增加一个.chunk标识
    })],
    
  • preload 和 prefetch(按需加载),可以根据产品提供的用户埋点数据分析什么地方更适合使用这些性能优化的点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值