谈谈Webpack中的Optimization

4 阅读2分钟

Optimization主要用于优化构建结果,比如代码压缩、拆分、去除重复模块等。在production模式下,webpack默认会启用一些优化措施,比如TerserPlugin来压缩JS,SplitChunks来拆分代码,而development模式则更注重构建速度和调试,不会进行这些优化。

const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); // webpack5+
const TerserWebpackPlugin = require('terser-webpack-plugin');

// 在module.exports中添加:
optimization: {
    usedExports: true, // 开启tree shaking 标记
    // 添加sideEffects优化(生产环境默认开启)
    sideEffects: true, // 开启副作用分析,标记未使用的文件
    splitChunks: { // 代码分割
      chunks: 'all', // 对所有模块都进行分割
      minSize: 20000, // 分割代码最小的大小
      minRemainingSize: 0, // 类似于minSize,最后确保提取的文件大小不能为0
      minChunks: 1, // 至少被引用的次数,满足条件才会代码分割
      maxAsyncRequests: 30, // 按需加载时并行加载的文件的最大数量
      maxInitialRequests: 30, // 入口js文件最大并行请求数量
      enforceSizeThreshold: 50000, // 超过50kb一定会单独打包(此时会忽略minRemainingSize、maxAsyncRequests、maxInitialRequests)
      cacheGroups: { // 分割代码规则
        defaultVendors: { // 第三方库分离,打包node_modules中的代码
          test: /[\\/]node_modules[\\/]/, // 要打包的模块
          priority: -10, // 权重(越大越高)
          reuseExistingChunk: true, // 如果当前代码块包含已从主包中拆分出的模块,则它将重用该模块,而不是生成新的模块
        },
        default: { // 公共模块提取,打包其他模块
          minChunks: 2, // 至少被引用2次,才会打包到default组的chunk中
          priority: -20, // 权重(越大越高)
          reuseExistingChunk: true, // 如果当前代码块包含已从主包中拆分出的模块,则它将重用该模块,而不是生成新的模块
        }
      }
    },
    minimizer:[ // 压缩插件
      new CssMinimizerPlugin(), // 压缩css
      new TerserWebpackPlugin({ // 压缩js
        terserOptions: {
          format: { // 去掉注释
            comments: false,
          },
        },
        extractComments: false, // 移除注释
      })
    ]
  },
  mode: 'production',