Tree Shaking 的原理和注意事项?(详见 BE-019 补充)

Tree Shaking 前提条件

  1. 使用 ESM(CommonJS 不支持)
  2. 生产模式构建
  3. 标记 sideEffects

sideEffects 详解

// package.json
{
  "sideEffects": false  // 所有文件都是纯的,可安全 Tree Shake
}

什么算副作用:

// ✅ 无副作用:纯导出
export function add(a, b) { return a + b }

// ❌ 有副作用:修改全局状态
window.myGlobal = 'hello'

// ❌ 有副作用:修改原型
Array.prototype.myMethod = function() {}

// ❌ 有副作用:CSS(引入时执行了样式注入)
import './style.css'

// ❌ 有副作用:polyfill
import 'core-js/stable'

指定有副作用的文件:

{
  "sideEffects": ["*.css", "*.scss", "./src/polyfills.js"]
}

Tree Shaking 实际效果

// math.js
export function add(a, b) { return a + b }      // 被使用
export function subtract(a, b) { return a - b }  // 未使用,被摇除
export function multiply(a, b) { return a * b }  // 未使用,被摇除

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

// 打包结果:只有 add,没有 subtract 和 multiply

注意事项

  1. 类的方法不会被摇除
export class Calculator {
  used() { return 1 }
  unused() { return 2 }  // 不会被摇除
}
  1. 函数有副作用时不摇除
export function init() {
  console.log('init')  // 副作用,不会被摇除
}
  1. 动态导入不摇除
import(dynamicPath)  // 无法静态分析
  1. 整包导入不摇除
import _ from 'lodash'  // 整个 lodash 被打包
import { debounce } from 'lodash-es'  // 只打包 debounce ✅

同分类其他题目