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);

results matching ""

    No results matching ""