15. Tree Shaking

97 阅读2分钟

usedExports

在 usedExports 设置为 true 时,会有一段注释:unused harmony export mul,告知 Terser 在优化时,可以删除掉这段代码。usedExports 实现 Tree Shaking 是结合 Terser 来完成的。
案例:
webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'development',
  devtool: 'inline-source-map',

  plugins: [
    new HtmlWebpackPlugin(),
  ],
};

src/math.js

export const add = (x, y) => x + y;
export const subtract = (x, y) => x - y;

src/index.js

import { add } from './math';
console.log(add(1, 2));

从上面看到,我们引用并使用了math.add 函数,没有使用 math.subtract 函数
打包之后: QQ截图20231112121235.png tree shaking 配置

const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  mode: 'development',
  devtool: 'inline-source-map',
  plugins: [
    new HtmlWebpackPlugin(),
  ],
  optimization: {
    // 使用 ES module 方式引用的模块将被 tree shaking 优化
    usedExports: true,
  },
};

QQ截图20231112121446.png 如上图,只是标记了,但是没有清除代码。

const TerserPlugin = require("terser-webpack-plugin");
  optimization: {
    usedExports: true,
    minimize: true,
    minimizer:[
      new TerserPlugin({
        parallel: true,
        extractComments:false,
      })
    ]
  }

打包之后
QQ截图20231112122625.png

sideEffects(副作用)

// math.js
export const add = (x, y) => x + y;
// math2.js
export const subtract = (x, y) => x - y;

// index.js
import { add } from './math';
// 引入了,但是没有使用
import { subtract } from './math2';
console.log(add(1, 2));

webpack 中配置了 usedExports: true,但是打包出的文件还会有引入 math2 的部分。Webpack 认为 math2.js 有“副作用”。具有副作用的文件不应该做 tree-shaking,因为这将破坏整个应用程序。 QQ截图20231112124600.png 如何告诉 Webpack 你的代码无副作用,可以通过 package.json 有一个特殊的属性 sideEffects,就是为此而存在的。
sideEffects 有三个可能的值:

  • true:(默认值)这意味着所有的文件都有副作用,也就是没有一个文件可以 tree-shaking。
**package.json**
{
  "sideEffects": true, // 所有的文件都有副作用,也就是没有一个文件可以 `tree-shaking`。
}
  • false:告诉 Webpack 没有文件有副作用,所有文件都可以 tree-shaking。
{
  "sideEffects": false, // 告诉 Webpack 没有文件有副作用,所有文件都可以 `tree-shaking`。
}
  • 数组:是文件路径数组。它告诉 webpack,除了数组中包含的文件外,你的任何文件都没有副作用。因此,除了指定的文件之外,其他文件都可以安全地进行 tree-shaking。
{
  "sideEffects": ['*.css', '*.global.js'], // 告诉 Webpack 扩展名是 .css 或者 .global.js 文件视为有副作用,不要 `tree-shaking` 
}

sideEffects 和 usedExports
sideEffects 和 usedExports(更多被认为是 tree shaking)是两种不同的优化方式。 sideEffects 更为有效 是因为它允许跳过整个模块/文件和整个文件子树。 usedExports 依赖于 terser 去检测语句中的副作用。它是一个 JavaScript 任务而且没有像 sideEffects 一样简单直接。而且它不能跳转子树/依赖由于细则中说副作用需要被评估。

CSS Tree Shaking

作用:删除未使用的CSS
安装npm install purgecss-webpack-plugin -D
配置 PurgeCss QQ截图20231112131507.png purgecss也可以对less文件进行处理(所以它是对打包后的css进行tree shaking操作)