module是一个对象,表示特定源文件要公开公开的内容。在c / c ++世界中,您没有类似于头文件的东西,而是描述了模块的内容 出口 通过定义此对象。然后,节点运行时使用此对象来确定模块的“公共”。
它与在编译世界中从dll导出函数的概念类似。你必须明确定义外部世界可以访问哪些功能。这有助于封装,让您以干净的方式组织您的库。
您可以在node.js源代码中找到最佳答案。 如果有人要求你的js模块, 您的脚本按节点变为一个函数,如下所示(请参阅src / node.js)。
// require function does this.. (function (exports, require, module, __filename, __dirname) { ... your javascript contents... });
Node将包装你的脚本。然后上面的脚本将执行如下:
//module.js var args = [self.exports, require, self, filename, dirname]; return compiledWrapper.apply(self.exports, args);
所以在你的脚本中,
exports is just module.exports.
在您的脚本中,您可以向此导出对象添加一些内容(函数..)。 require函数将返回此对象。这是node.js的模块系统(commonJS规范)。
但要注意不要修改module.exports。否则你当前的出口将毫无意义。
更具体:
module 是文件中的全局范围变量。
module
所以,如果你打电话 require("foo") 然后 :
require("foo")
// foo.js console.log(this === module); // true
它的行为方式与此相同 window 在浏览器中执行。
window
还有一个名为的全局对象 global 您可以在任何您想要的文件中编写和读取,但这涉及到变异全局范围,这是 的 邪恶 强>
global
exports 是一个存在的变量 module.exports 。这基本上就是你 出口 何时需要文件。
exports
module.exports
// foo.js module.exports = 42; // main.js console.log(require("foo") === 42); // true
有一个小问题 exports 在其自己的。 _global范围上下文+和 module 是 的 不 强> 相同。 (在浏览器中全局范围上下文和 window 是相同的)。
// foo.js var exports = {}; // creates a new local variable called exports, and conflicts with // living on module.exports exports = {}; // does the same as above module.exports = {}; // just works because its the "correct" exports // bar.js exports.foo = 42; // this does not create a new exports variable so it just works
详细了解出口情况