这是最近第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写法