Nodejs模块输出混乱

时间:2016-05-23 17:28:52

标签: javascript node.js node-modules

我对module.exports感到困惑。据我所知module.exports是一个暴露给其他模块的对象,

exports=module.exports={} 

但是在node.js的morgan包的index.js中我找到了这个。

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

morgancompileformattoken都是功能。

你能解释一下这里发生的事吗?如何将一个函数(morgan)分配给module.exports?执行第一行后,module.exports是一个函数而不是JSON对象吗?

4 个答案:

答案 0 :(得分:3)

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;
  

如何将一个函数(morgan)分配给module.exports?执行第一行后,module.exports是一个函数而不是JSON对象吗?

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

答案 1 :(得分:1)

您可能需要阅读此答案以获得更深入的解释:

What is the purpose of node js module exports and how do you use it?

Morgan只是向要导出的模块添加参数(在本例中为compileformattoken。当您在应用程序中使用{{1}之类的模块时然后,您可以调用morgan = require('morgan')来返回附加到对象的格式。

希望能稍微清理一下!

答案 2 :(得分:0)

module.exports是一个暴露给其他模块和文件的对象。这允许以方便的方式导出变量,函数和更多javascript功能。

正如您所见here,当您将任何变量初始化为{}时,您正在初始化一个对象。

一个对象可以包含变量和函数,这是使Javascript非常酷的事情之一。您可以轻松地将具有函数的复杂对象作为参数传递,并执行真正干净的代码。

因此,简短的故事,将module.exports视为暴露给其他模块和具有变量和函数的文件的对象。就像将面向对象的对象作为Java或Ruby中的参数传递一样。

这里很容易解释:Read More

答案 3 :(得分:0)

  

你能解释一下这里发生的事吗?

正在发生转让声明。

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

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

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

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