Tree Shaking 的原理和注意事项?(详见 BE-019 补充)
Tree Shaking 前提条件
- 使用 ESM(CommonJS 不支持)
- 生产模式构建
- 标记 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注意事项
- 类的方法不会被摇除
export class Calculator {
used() { return 1 }
unused() { return 2 } // 不会被摇除
}- 函数有副作用时不摇除
export function init() {
console.log('init') // 副作用,不会被摇除
}- 动态导入不摇除
import(dynamicPath) // 无法静态分析- 整包导入不摇除
import _ from 'lodash' // 整个 lodash 被打包
import { debounce } from 'lodash-es' // 只打包 debounce ✅