什么是 Tree Shaking?为什么必须要用 ESM 才能生效?

Tree Shaking 是在打包时移除未被引用的代码(dead code elimination),减小产物体积。

为什么依赖 ESM:ESM 是静态的(import/export 在编译期就确定依赖关系,不能动态拼接),打包器能静态分析出「哪些导出从未被 import」并剔除。而 CommonJS 的 require(变量) 是动态的,无法静态判定。

// util.js 只导出 a 和 b
export const a = 1
export const b = 2
// main.js 只用了 a
import { a } from './util'
// 打包后 b 被摇掉

生效条件:

  1. 用 ESM(import/export),不用 CJS
  2. mode: 'production'(开发模式不做压缩也就不摇)
  3. package.json 设 "sideEffects": false(或数组声明有副作用的文件),否则打包器为保险不敢删

副作用:如 import './polyfill' 只执行不导出,这类需保留,要在 sideEffects 里声明。

同分类其他题目