ES6 模块化笔记

时间:2023-03-09 04:42:35
ES6 模块化笔记

ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。

ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。

// ES6模块
import { stat, exists, readFile } from 'fs';

需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。

export常用的写法如下:

 // 写法1
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958; // 写法2
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958; export {firstName, lastName, year}; // 写法3 var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958; export {
firstName as variable1,
lastName as variable2,
year as variable3
}; // 方法1
export function multiply(x, y) {
return x * y;
}; // 方法2
function v1() { ... }
function v2() { ... } export { v1,v2 }; // 方法3
function v1() { ... }
function v2() { ... }
export {
v1 as streamV1,
v2 as streamV2,
v2 as streamLatestVersion
};

import命令具有 [ 提升效果 ] ,会提升到整个模块的头部,首先执行。

import是静态执行,所以不能使用表达式和变量。

 import { lastName as surname } from './profile';
foo();
// import命令是编译阶段执行的,在代码运行之前,所以foo已经被赋值
import { foo } from 'my_module';

import语句会执行所加载的模块,因此可以有下面的写法。

import 'lodash';

模块的整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

【注意】,模块整体加载所在的那个对象(上例是circle),应该是可以静态分析的,所以不允许运行时改变。下面的写法都是不允许的。

 // circle.js

 export function area(radius) {
return Math.PI * radius * radius;
} export function circumference(radius) {
return 2 * Math.PI * radius;
} // main.js import { area, circumference } from './circle'; console.log('圆面积:' + area(4));
console.log('圆周长:' + circumference(14)); // 第二种写法
import * as circle from './circle'; console.log('圆面积:' + circle.area(4));
console.log('圆周长:' + circle.circumference(14));

export default命令,为模块指定默认输出。

 // export-default.js
export default function () {
console.log('foo');
} // import-default.js
import customName from './export-default';
customName(); // 'foo'

本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。所以,下面的写法是有效的。

 // modules.js
function add(x, y) {
return x * y;
}
export {add as default};
// 等同于
// export default add; // app.js
import { default as xxx } from 'modules';
// 等同于
// import xxx from 'modules';

正是因为export default命令其实只是输出一个叫做default的变量,所以它后面不能跟变量声明语句。

 // 正确
export var a = 1; // 正确
var a = 1;
export default a; // 错误
export default var a = 1;