JS 文件绝大多数通过网络进行加载,然后执行。DCE(dead code elimination)可以使得加载文件的大小更小,整体执行时间更短。tree shaking 就是通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export。

原理

ESM

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

这就是区别于CommonJs,ESM 独有的静态分析特性。等等,那什么是静态分析呢,就是不执行代码。CommonJs 中的 require,只有执行以后才知道引用的是什么模块。

保证了依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析。静态分析会在绘制依赖图时做 DCE,减少打包体积。ESM 也支持动态引入,类似于下面这种引入方式是不支持 Tree Shacking的。

if (false) {
  import('./app.js').then(() => {
	
	});
} else {
 
}

最新版的 antd 以及 vue 都对 Tree Shaking 提供了支持。