Module模块系统
ES6提供了语言级别的模块系统解决方案,是模块化编程更加简单和清晰。
我们将一个JavaScript文件看做一个js模块,在模块内部的变量和表达式,只要在相同的作用域中,不需要额外的引入操作变可以直接使用。
但在不同模块之前的变量或者表达式无法直接使用,需要使用Module系统进行暴露和导入操作,才可以使用。
在编写代码时,我们通常在一个js模块中编写一个类,方面后期的维护和阅读。当在另一个js模块中需要使用这个类时,我们需要进行以下两步操作
- 在编写类的js模块中,暴露该类的定义
- 在使用类的js模块中,引入该类的定义
在完成以上两步操作之后,便可以在新的模块中使用已经写好的类的代码。
1,暴露模块接口
在ES6中,使用export
关键字对模块内的定义进行暴露。
一般我们暴露三种接口:
- 变量接口
- 函数接口
- Class接口
暴露接口方法有两种形式,分别为暴露定义和通过大括号暴露名称。直接暴露名称为错误方法!
注意:export命令,只能写在模块的顶层作用域(注意,不是顶部)。顶层作用域的意思是不能再任何一个大括号内写export
//变量接口
//正确1,暴露定义
export const a = 1;
export const b = 2;
//正确2
const x = 1;
const y = 1
//通过大括号暴露名称
export {
x,
y,
};
//错误!!!
cosnt x = 1;
export x;
//函数接口
//正确1
export function f1(){
console.log(1);
}
export function f2(){
console.log(2);
}
//正确2
function f1(){
console.log(1);
}
function f2(){
console.log(2);
}
export {
f1,
f2,
}
//class接口
//正确1
export class AClass {
}
export class BClass {
}
//正确2
class AClass {
}
class BClass {
}
export {
AClass,
BClass,
}
2,引入模块接口
引入模块使用import
关键字进行。使用方法如下
import { 接口名 } from '相对路径'
例如,我们首先在a.js文件中暴露一个变量,
//a.js
export const name = 'Tom';
如果我们想在b.js文件中使用这个变量,我们需要引入该变量接口。
我们假定a.js和b.js在同级目录下。
import { name } from './a.js';
console.log(name);//输出结果为Tom
在import命令中,如引入文件为.js,那么其拓展名可以省略,其他类型文件不可以省略
import { name } from './a';与上午中代码等效,日常开发经常省略.js
在引入中一定注意,暴露的变量名和引入的变量名,一定要一致,如果不一致,将引入失败。
3,默认暴露
在上述讲解中,暴露和引入都必须使用相同的接口名,如果不相同便会出错。这样的要求在实际使用中不是很方便,在使用其他人的模块是,还需要阅读其源码才能完成正确引入。
在ES6通过这样的暴露引入机制同时,为了方面开发者更加方便的使用模块,增加了一个默认暴露引入机制。
该机制通过export default关键字进行暴露,且同一模块中,只能使用一次export default
,同时可以使用传统的export
进行暴露
//a.js
export default const name = 'Tom';
当引入默认暴露的接口是,接口名称可以自定义,无需和暴露名一致。同时也不需要大括号
import XXX from './a';
console.log(XXX);//输出结果为Tom
默认暴露和普通暴露机制可以同时使用:
//a.js
export default const name = 'Tom';
export const age = 10;
import Name , { age } from './a';
console.log(Name);
console.log(age);
4, as重命名
在除了默认暴露以外的情况,暴露和引入的接口名必须一致。但有时模块内部有自己的命名规则,对外暴露是命名规则可能过于繁琐,我们便可以使用 as 关键字做暴露或者引入重命名,方面后面编码使用该接口。
暴露重命名
//a.js
const xxx_name = 'Tom';
export {
xxx_name as name,
}
import { name } from './a';
console.log(name)
引入重命名
//a.js
export const name = 'Tom';
import { name as xxx_name } from './a'
console.log(xxx_name);