
ES6 Modules 特点
- 只能作为模块顶层的语句出现
- ES6 中
import 和 export 是显性声明的
import 的模块名只能是字符串常量
- ES6 模块的依赖关系是可以根据
import 引用关系推导出来的。
- ES6 模块的依赖关系与运行时状态无关,也就是说 import binding 是 immutable 的。编译时确定输出了。
- ES6 Module 输出的是值的引用,被输出模块的内部的改变会影响引用的改变
- ES6 Module 可以单独加载其中的接口
- ES6 Module this 指向 undefined
上面这些 ES6 Modules 的特点是 Tree-Shaking 的基础。
静态分析或者说依赖关系与运行时状态无关就是说:不执行代码就能知道引用了什么模块。用 cjs 的 require 一个模块,就是动态的,只有执行之后才知道引用的什么模块,这个就不能通过静态分析去做优化。
CommonJS 特点
- 所有代码都运行在模块作用域,不会污染全局作用域
- CommonJS 模块是运行时加载
- 模块是同步加载的,即只有加载完成,才能执行后面的操作
- 模块在首次执行后就会缓存,再次加载只返回缓存结果,如果想要再次执行,可清除缓存;
- CommonJS 输出是值的拷贝(即,require 返回的值是被输出的值的拷贝,模块内部的变化也不会影响这个值)