模块加载方案
- CommonJS: 通过require来引入模块,通过module.exports输出接口。用于服务端,它是以同步的方式来引入模块的,因为在服务端文件都存储在本地磁盘,所以读取非常快
- AMD: 采用异步加载的方式来加载模块,所有依赖这个模块的语句都定义在一个回调函数里,等到加载完成后再执行回调函数。require.js实现了AMD规范
- CMD: sea.js实现了CMD规范,异步加载模块
- ESModule: 使用import和export的形式来导入导出模块
比较
1 | // AMD和CMD |
import和require使用变量引用
1 | // logo地址:@/assets/img/logo.png |
export 命令
一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果外部要读取模块内部的某个变量,就必须使用export关键字输出该变量。
export命令可以出现在模块的任何位置,只要不是块作用域
1 | // profile.js |
export 是可以取到模块内部实时的值
1 | export var foo = 'bar'; |
import 命令
使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。
import会有提升效果,所以不一定是放到头部
1 | // main.js |
整体加载
1 | // 正常加载 |
默认输出
1 | // export-default.js |
import()
import命令会被 JavaScript 引擎静态分析,先于模块内的其他语句执行。
为了动态加载模块,引入了import(),返回一个Promise对象
1 | // 报错 |
import()输出接口
1 | import('./myModule.js') |
同时加载多个模块
1 | Promise.all([ |