什么是 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 被摇掉生效条件:
- 用 ESM(
import/export),不用 CJS mode: 'production'(开发模式不做压缩也就不摇)package.json设"sideEffects": false(或数组声明有副作用的文件),否则打包器为保险不敢删
副作用:如
import './polyfill'只执行不导出,这类需保留,要在 sideEffects 里声明。