Skip to content

优化性能

压缩 JS 代码

terser是一个JavaScript的解释、绞肉机、压缩机的工具集,可以压缩、丑化代码,让bundle更小

production模式下,webpack 默认就是使用 TerserPlugin 来处理代码的。如果想要自定义配置它,配置方法如下

js
const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
  ...
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: true // 电脑cpu核数-1
      })
    ]
  }
}
  • extractComments:默认值为true,表示会将注释抽取到一个单独的文件中
  • parallel:使用多进程并发运行提高构建的速度,默认值是true,并发运行的默认数量: os.cpus().length - 1
  • toplevel:底层变量是否进行转换
  • keep_classnames:保留类的名称
  • keep_fnames:保留函数的名称

压缩 CSS

CSS压缩通常是去除无用的空格等,因为很难去修改选择器、属性的名称、值等

shell
npm install css-minimizer-webpack-plugin -D
js
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
module.exports = {
  // ...
  optimization: {
    minimize: true,
    minimizer: [
      new CssMinimizerPlugin({
        parallel: true
      })
    ]
  }
}

压缩 HTML

js
module.exports = {
  ...
  plugin: [
    new HtmlwebpackPlugin({
      ...
      minify: {
        minifyCSS: false, // 是否压缩css
        collapseWhitespace: false, // 是否折叠空格
        removeComments: true // 是否移除注释
      }
    })
  ]
}

压缩文件

shell
npm install compression-webpack-plugin -D
js
const CompressionPlugin = require("compression-webpack-plugin");

module.exports = {
  plugins: [new CompressionPlugin({
    test: /\.(css|js)$/, // 哪些文件需要压缩
    threshold: 500, // 设置文件多大开始压缩
    minRatio: 0.7, // 至少压缩的比例
    algorithm: "gzip", // 采用的压缩算法
  })],
};

压缩图片

js
module: {
  rules: [{
    test: /\.(png|jpg|gif)$/,
    use: [{
        loader: 'file-loader',
        options: {
          name: '[name]_[hash].[ext]',
          outputPath: 'images/',
        }
      },
      // 放在 file-loader 后
      {
        loader: 'image-webpack-loader',
        options: {
          // 压缩 jpeg 的配置
          mozjpeg: {
            progressive: true,
            quality: 65
          },
          // 使用 imagemin**-optipng 压缩 png,enable: false 为关闭
          optipng: {
            enabled: false,
          },
          // 使用 imagemin-pngquant 压缩 png
          pngquant: {
            quality: '65-90',
            speed: 4
          },
          // 压缩 gif 的配置
          gifsicle: {
            interlaced: false,
          },
          // 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式
          webp: {
            quality: 75
          }
        }
      }
    ]
  }, ]
}

Tree Shaking

Tree Shaking 是一个术语,在计算机中表示消除死代码,依赖于ES Module的静态语法分析

webpack实现Trss shaking有两种不同的方案:

  • usedExports:通过标记某些函数是否被使用,之后通过Terser来进行优化的
  • sideEffects:跳过整个模块/文件,直接查看该文件是否有副作用

usedExports

js
module.exports = {
  ...
  optimization: {
    usedExports: true
  }
}

使用之后,没被用上的代码在webpack打包中会加入unused harmony export mul注释,用来告知 Terser 在优化时,可以删除掉这段代码

sideEffects

sideEffects用于告知webpack compiler哪些模块时有副作用,配置方法是在package.json中设置sideEffects属性

如果sideEffects设置为false,就是告知webpack可以安全的删除未用到的exports

如果有些文件需要保留,可以设置为数组的形式

js
"sideEffecis": [
  "./src/util/format.js",
  "*.css" // 所有的css文件
]

css tree shaking

shell
npm install purgecss-plugin-webpack -D
js
const PurgeCssPlugin = require('purgecss-webpack-plugin')
module.exports = {
  ...
  plugins: [
    new PurgeCssPlugin({
      path: glob.sync(`${path.resolve('./src')}/**/*`),
      {
        nodir: true
      } // src里面的所有文件
      satelist: function () {
        return {
          standard: ["html"]
        }
      }
    })
  ]
}

代码分离

js
module.exports = {
  ...,
  optimization: {
    splitChunks: {
      // 对同步代码还是异步代码进行处理,all 表示都处理
      chunks: "all",
      // 拆分包的大小, 至少为minSize,如何包的大小不超过minSize,这个包不会拆分
      minSize: 30000,
      // 被引入的次数
      minChunks: 2
    }
  }
}