前端面试宝典

Tree-shaking 算法(面试深度版)

我给你讲面试官真正想听的 Tree-shaking 算法原理,不是大白话,是能加分的底层逻辑,但我会用最简单的方式讲清楚。


一、一句话概括算法

Tree-shaking 本质是:基于 ES Module 的「可达性分析算法」+ 「DCE(死代码消除)」

从入口文件出发,标记所有被使用到的代码,最后删除未被标记的代码。


二、Tree-shaking 算法完整流程(4 步)

1. 构建模块依赖图(Module Graph)

  • 从入口文件(main.js)开始
  • 递归分析所有 import/export
  • 生成一张模块依赖关系图

2. 标记-清除算法(Mark-Sweep)核心

这就是 Tree-shaking 的真正算法

① 标记阶段(Mark)

  • 从入口开始,递归遍历所有用到的函数、变量
  • 只要被引用 = 标记为存活
  • 没被引用 = 不标记

② 清除阶段(Sweep)

  • 遍历所有代码
  • 删除未被标记的代码

和垃圾回收机制(GC)完全一样


三、算法核心:静态分析(Static Analysis)

Tree-shaking 之所以能实现,靠的是:

ES Module 是静态

  • 编译时就能确定依赖关系
  • 不能动态导入
  • 不能条件导入
// 静态 ✅ 可以 Tree-shaking
import { a } from './utils'

// 动态 ❌ 无法 Tree-shaking
if (true) import('./utils')
const lib = require('lib')

算法只能分析静态结构,不能分析运行时逻辑。


四、副作用(Side Effect)算法规则

Tree-shaking 不会删除有副作用的代码

什么是副作用?

代码执行后会影响外部环境,即使没被引用也不能删:

  • 修改全局变量
  • 立即执行函数
  • 操作 DOM
  • 赋值给 window
// 有副作用,不会被删除
window.a = 123
document.body.style.color = 'red'
(async function(){})()

算法规则:有副作用 → 强制保留,不参与 shaking


五、Tree-shaking 算法总结(面试背诵版)

Tree-shaking 采用标记-清除算法,基于 ES Modules 静态分析:

  1. 构建依赖图
  2. 从入口递归标记所有用到的代码
  3. 删除未标记、无副作用的死代码
  4. 最终实现DCE(死代码消除)

它的核心是静态可达性分析,只保留程序执行路径上会用到的代码。


六、一句话超级总结

Tree-shaking = 依赖图 + 标记清除算法 + 静态分析 + 副作用保留 = 只打包用到的代码


如果你愿意,我可以把
Vite + Rollup + Tree-shaking 算法
整合成一段面试满分回答,直接背就能吊打面试官!