ES6 import/export的静态性和一一对应关系

这是最近第4篇JavaScript关于模块导出/导入的文章了。

之所以会对模块引用产生一些疑问,是因为刚开始用CommonJS的写法,即require/module.exports模块,而现
在改为用ES6的写法了,即import/export写法,而且ES6的写法有多种形式,头脑中有一些混淆。

首先要理解这两种写法的最大不同之处是:

CommonJS的模块只有一个唯一的出口,那就是module.exports对象,我们把所有要导出的变量或函数都放到这
个对象里。

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

详细内容大家可以参考这两篇文章:必须要知道的CommonJS和ES6 Modules规范、阮一峰ES6入门的Module的语法、MDN的import。


这里还举一个“接口转发”的例子,就是我们很多时候这些写:先一些一组模块并导出,然后通过一个文件转
发这组模块的接口。比如lib文件夹中有这三个模块:

// module1.js

class module1_1 {
    fun1() {

    }
}

class module1_2 {
    fun2() {

    }
}

export { module1_1, module1_2 };
// module2.js

class module2 {
    fun3() {

    }
}

export default module2;
// module3.js

class module3_1 {
    fun4() {

    }
}

class module3_2 {
    fun5() {

    }
}

export { module3_1, module3_2 };

转发的文件这么写:

export * from './lib/module1';
export { default as m2 } from './lib/module2';
export { module3_1 } from './lib/module3';

这里用到了默认导出、导出整个模块的内容(*)、导出单个模块、重命名等。不过哪种写法,都要保证“导入者”能找到“被导入的”模块内部的变量,即建立接口名和变量之间一对一的关系。

 


#扩展知识推荐:

webpack让node.js支持import/export写法

import报Unexpected identifier错误

ES6前后的module体系

require类名需要带大括号

JS语法之:require

你可能感兴趣的:(JavaScript)