概念
es6之前,js没有模块体系,制定的模块加载方案,主要是CommonJs和AMD,前者用于服务器,后者用于浏览器。
ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
模块功能主要有2个命令构成:export和import
比较
1 | // CommonJs模块 |
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 |
import命令输入的变量不能修改
字符串不能修改,对象可以修改里面的属性,不过不建议,因为修改了,其他文件引入也会修改
只会加载一次文件
1 | import { foo } from 'my_module'; |
整体加载
1 | // 正常加载 |
默认输出
1 | // export-default.js |
import()
import命令会被 JavaScript 引擎静态分析,先于模块内的其他语句执行。
为了动态加载模块,引入了import(),返回一个Promise对象
1 | // 报错 |
import()输出接口
1 | import('./myModule.js') |
同时加载多个模块
1 | Promise.all([ |