Nodejs模块导出混乱

我有一个与module.exports混淆。 据我module.exports是暴露给其他模块的对象,

 exports=module.exports={} 

但是在node.js的摩根包的index.js中我find了这个。

 module.exports = morgan module.exports.compile = compile module.exports.format = format module.exports.token = token 

morgancompileformattoken都是function。

你能解释一下这里发生了什么? 一个函数(摩根)如何分配到module.exports? 第一行执行后,module.exports是一个函数而不是一个JSON对象?

一个Node模块基本上是这样工作的:

 var module = { exports: {} }; (function (exports, require, module, __filename, __dirname) { // your module code here })(module.exports, require, module, __filename, __dirname); var exported = module.exports; 

默认情况下, exportsmodule.exports都指向同一个对象。 您可以像往常一样向对象添加属性。 但是,如果你想返回一个函数或其他对象,而不仅仅是默认的标准对象呢?

在这种情况下,您可以将module.exports设置为其他内容,那将是新的导出对象。

 module.exports = function() {}; 

当然,这个函数也可以有属性,所以你的代码是这样的:

 module.exports = function(){}; module.exports.compile = function() {}; module.exports.format = function() {}; module.exports.token = function() {}; 

这将相当于:

 var morgan = function() {}; var compile = function() {}; var format = function() {}; var token = function() {}; morgan.compile = compile; morgan.format = format; morgan.token = token; module.exports = morgan; 

一个函数(摩根)如何分配到module.exports? 第一行执行后,module.exports是一个函数而不是一个JSON对象?

是的, module.exports将是一个函数,而不是默认对象(但是这里没有JSON,JSON不是JavaScript对象,而是编码格式)。

您可能想要阅读这个答案作更深入的解释:

节点js模块导出的目的是什么?你如何使用它?

Morgan只是简单地为要导出的模块添加参数(在这种情况下为compileformattoken 。当你的应用程序需要使用类似morgan = require('morgan') ,你可以调用morgan.format来返回被附加到对象的格式。

希望能够清理一些东西!

module.exports是暴露给其他模块和文件的对象。 这允许一个方便的方式来导出variables,函数和更多的JavaScriptfunction。

正如你在这里看到的,当你初始化任何variables时,你正在初始化一个对象。

一个对象可以包含variables和函数,这是让Javascript真的很酷的东西之一。 你可以很容易地将复杂的对象作为parameter passing给函数,并做出真正的干净的代码

所以,短小的故事,把module.exports想象成暴露给其他模块和variables和函数的文件的对象。 就像在Java或Ruby中传递一个Object Oriented对象作为参数一样。

这里很容易解释: 阅读更多

你能解释一下这里发生了什么?

一个赋值语句正在发生。

 // path-to-my-module.js module.exports = morgan module.exports.compile = compile module.exports.format = format module.exports.token = token 

对于这四个陈述中的每一个,都有一个赋值语句。 看第一行, module.exports = morgan ,这将意味着module.exports 对象将有一个名为morgan的属性,其值是标识符的值morgan

所以当你像这样使用它时:

 var m = require('./path-to-my-module.js'); console.log(m.morgan); console.log(m);