ESModule, CommonJS
ESModule
- es的import在编译阶段就被执行,所以可以实现按需加载,在所有代码运行之前就被加载。
由于import是静态执行,所以不能使用表达式和变量。
import语句会执行所加载的模块,因此可以只执行模块而不输入任何值:
import 'lodash'
以上代码仅执行lodash
模块而不输入任何值
多次重复执行同一import
语句只会执行一次
import { foo } from 'my_module';import { bar } from 'my_module';// 等同于import { foo, bar } from 'my_module';
虽然foo
和bar
在两个语句中加载,但他们对应同一个my_module
模块,my_module
模块只会执行一次。
模块也可以使用*
整体加载:
import { area, circumference } from './circle'// 或import * as circle from './circle'
- 可以使用default为模块默认输出:
export { add as defulat};// 等价于export default add;import { default as foo } from 'modules';// 等价于import foo from 'modules';
export 与 import 复合写法
export { foo, bar } from 'modules';
由于直接对外转发了这两个方法,所以不能直接使用foo,bar
export { foo as myFoo } from 'modules';export * from 'modules';// 具名方法改为默认方法写法export { es6 as default } from 'modules';// 等价于import { es6 } from 'modules';export default es6;// 默认方法改为具名方法export { default as foo } from 'modules';// ES2020补上了以下import语句的复合写法import * as Bar from 'modules';export * as Bar from 'modules';// 等价于import * as Bar from 'modules';export { Bar };
- 动态import
Reference: Module 的语法
动态import类似于CommonJS的require,为运行时加载,与静态import的区别在于静态import在编译时就已分析好。但是动态import是异步加载,返回Promise,require是同步加载。
CommonJS
- CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
- CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
- CommonJS 模块的
require()
是同步加载模块,ES6 模块的import
命令是异步加载,有一个独立的模块依赖的解析阶段。
评论加载中 (ง •̀ω•́)ง