传统的DCE((dead code elimination) 消灭不可能执行的代码
Tree-shaking 更关注消除没有用到的代码(特别是引用了但是没有使用的代码)

image.pngimage.png

ES6 module 特点:

  • 只能作为模块顶层的语句出现
  • import 的模块名只能是字符串常量
  • import binding 是 immutable的

ES6模块依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析,这就是tree-shaking的基础。

所谓静态分析就是不执行代码,从字面量上对代码进行分析,ES6之前的模块化,比如我们可以动态require一个模块,只有执行后才知道引用的什么模块,这个就不能通过静态分析去做优化。

原理:利用AST做死区分析

参考

Tree-Shaking性能优化实践 - 原理篇