tree-shaking 与vue3

3,808 阅读2分钟

什么是 tree shaking (摇摇🌲 将不要的代码摇下来)

tree shaking 是一个术语,通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。它依赖于 ES2015 模块系统中的静态结构特性,例如 import 和 export。这个术语和概念实际上是兴起于 ES2015 模块打包工具 rollup。

webpack 4 正式版本,扩展了这个检测能力,通过 package.json 的 "sideEffects" 属性作为标记,向 compiler 提供提示,表明项目中的哪些文件是 "pure(纯的 ES2015 模块)",由此可以安全地删除文件中未使用的部分。

「副作用」的定义

在导入时会执行特殊行为的代码,而不是仅仅暴露一个 export 或多个 export。举例说明,例如 polyfill,它影响全局作用域,并且通常不提供 export。导入时除了提供导出的内容外还做了其他事,此事这个模块就不纯了。

一个函数会、或者可能会对函数外部变量产生影响的行为。

tree-shakinng 原理

tree-shakinng基于ES6模块实现:

  1. 只能作为模块顶层的语句出现 import 的模块名只能是字符串常量 import binding 是 immutable的 ES6模块依赖关系是确定的,和运行时的状态无关,可以进行可靠的静态分析,这就是tree-shaking的基础
  2. 分析程序流,判断哪些变量未被使用、引用,进而删除此代码

⚠️ export default 对象被 import 后,挂在 default 上的属性和方法,即使没有被调用,也无法被 tree-shaking。

所以我们在组织模块文件时,应当尽可能避免 export default {A, B, C} 的写法

大神文:多读多读 github.com/wuomzfx/tre…

vue3 中的 tree-shaking

基于函数的 API 每一个函数都可以作为 named ES export 被单独引入,这使得它们对 tree-shaking 非常友好。没有被使用的 API 的相关代码可以在最终打包时被移除。同时,基于函数 API 所写的代码也有更好的压缩效率,因为所有的函数名和 setup 函数体内部的变量名都可以被压缩,但对象和 class 的属性/方法名却不可以。