ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。
// ES6模块
import { stat, exists, readFile } from 'fs';
需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。
export常用的写法如下:
1 // 写法1
2 export var firstName = 'Michael';
3 export var lastName = 'Jackson';
4 export var year = 1958;
5
6 // 写法2
7 var firstName = 'Michael';
8 var lastName = 'Jackson';
9 var year = 1958;
10
11 export {firstName, lastName, year};
12
13 // 写法3
14
15 var firstName = 'Michael';
16 var lastName = 'Jackson';
17 var year = 1958;
18
19 export {
20 firstName as variable1,
21 lastName as variable2,
22 year as variable3
23 };
24
25 // 方法1
26 export function multiply(x, y) {
27 return x * y;
28 };
29
30 // 方法2
31 function v1() { ... }
32 function v2() { ... }
33
34 export { v1,v2 };
35
36 // 方法3
37 function v1() { ... }
38 function v2() { ... }
39 export {
40 v1 as streamV1,
41 v2 as streamV2,
42 v2 as streamLatestVersion
43 };
import命令具有 [ 提升效果 ] ,会提升到整个模块的头部,首先执行。
import是静态执行,所以不能使用表达式和变量。
1 import { lastName as surname } from './profile';
2 foo();
3 // import命令是编译阶段执行的,在代码运行之前,所以foo已经被赋值
4 import { foo } from 'my_module';
import语句会执行所加载的模块,因此可以有下面的写法。
import 'lodash';
模块的整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。
【注意】,模块整体加载所在的那个对象(上例是circle),应该是可以静态分析的,所以不允许运行时改变。下面的写法都是不允许的。
1 // circle.js
2
3 export function area(radius) {
4 return Math.PI * radius * radius;
5 }
6
7 export function circumference(radius) {
8 return 2 * Math.PI * radius;
9 }
10
11 // main.js
12
13 import { area, circumference } from './circle';
14
15 console.log('圆面积:' + area(4));
16 console.log('圆周长:' + circumference(14));
17
18 // 第二种写法
19 import * as circle from './circle';
20
21 console.log('圆面积:' + circle.area(4));
22 console.log('圆周长:' + circle.circumference(14));
export default命令,为模块指定默认输出。
1 // export-default.js
2 export default function () {
3 console.log('foo');
4 }
5
6 // import-default.js
7 import customName from './export-default';
8 customName(); // 'foo'
本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。所以,下面的写法是有效的。
1 // modules.js
2 function add(x, y) {
3 return x * y;
4 }
5 export {add as default};
6 // 等同于
7 // export default add;
8
9 // app.js
10 import { default as xxx } from 'modules';
11 // 等同于
12 // import xxx from 'modules';
正是因为export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句。
1 // 正确 2 export var a = 1; 3 4 // 正确 5 var a = 1; 6 export default a; 7 8 // 错误 9 export default var a = 1;
来源:https://www.cnblogs.com/dahe1989/p/7117898.html