JS中exports与module.exports的区别详细介绍

JavaScript015

JS中exports与module.exports的区别详细介绍,第1张

exports和module.exports 都是对外暴露对象接口的,但是使用需要注意以下细节:

例如:这是rocker.js文件

在另一个文件中你这样引用

其实, Module.exports 才是真正的接口, exports 只不过是它的一个辅助工具。最终返回给调用的是 Module.exports 而不是 exports 。

注意:

所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

例如:

会以对象(也可叫字典)输出

如果你想在module.js中使用outputA或outputB函数,就得

上面的写法也等同于

exports收集到的属性和方法,并未都赋值给了Module.exports,因为Module.exports已经具备一些属性和方法,因此exports收集来的信息将 被忽略

再次引用执行rocker.js

下面例子中,你的模块是一个类: 想导出的模块为特定的数组类型

可以这样应用它:

下面例子中,你的模块是一个数组: 想导出的模块为特定的数组类型

可以这样应用它

结论: 现在你明白了,如果你 想你的模块是一个特定的类型 就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。

进一步说,之所以同步是 Node.js 所遵循的 CommonJS 的模块规范要求的。

在当年,CommonJS 社区对此就有很多争议,导致了坚持异步的 AMD 从 CommonJS 中分裂出来。

CommonJS

模块是同步加载和同步执行,AMD 模块是异步加载和异步执行,CMD(Sea.js)模块是异步加载和同步执行。ES6

的模块体系最后选择的是异步加载和同步执行。也就是 Sea.js 的行为是最接近 ES6 模块的。不过 Sea.js

这样做是需要付出代价的——需要扫描代码提取依赖,所以它不像 CommonJS/AMD 是纯运行时的模块系统。

注意 Sea.js 是

2010年之后开发的,提出 CMD 更晚。Node.js 当年(2009年)只有 CommonJS 和 AMD 两个选择。就算当时已经有

CMD 的等价提案,从性能角度出发,Node.js 不太可能选择需要静态分析开销的 类 CMD 方案。考虑到 Node.js

的模块是来自于本地文件系统,最后 Node.js 选择了看上去更简单的 CommonJS 模块规范,直到今天。

node.js module初步理解

在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块,文件内容可能是我们封装好的一些JavaScript方法、JSON数据、编译过的C/C++拓展等,在关于node.js的误会提到过node.js的架构。