CJS | ESM | |
---|---|---|
语法类型 | 动态 | 静态 | |
关键声明 | require | export与import |
加载方式 | 运行时加载 | 编译时加载 |
加载行为 | 同步加载 | 异步加载 |
书写位置 | 任何位置 | 顶层位置 |
指针指向 | this指向当前模块 | this指向undefined |
执行顺序 | 首次加载时加载模块,再次引用时读取缓存 | 引用时只生成只读引用,执行时才是正式取值 |
属性引用 | 基本类型属于复制不共享,引用类型属于浅拷贝且共享 | 所有类型属于动态只读引用 |
属性改动 | 工作空间可修改引用的值 | 工作空间不可修改引用的值,但可以通过引用的方法修改 |
运行时加载:指整体加载模块生成一个对象,再从对象中获取所需的属性方法去加载。最大特性是全部加载,只有运行时才能得到该对象,无法在编译时做静态优化
编译时加载:指直接从模块中获取所需的属性方法去加载。最大特性是按需加载,在编译时就完成模块加载,效率比其他方案高,无法引用模块本身,但可以扩展JS高级语法(宏与类型校验)