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
morgan
, compile
, format
和token
都是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;
默认情况下, exports
和module.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只是简单地为要导出的模块添加参数(在这种情况下为compile
, format
和token
。当你的应用程序需要使用类似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);