Nodejs 模块导出混乱

Nodejs module exports confusion

我对 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都是函数。

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

module.exports 是暴露给其他模块和文件的对象。这样可以方便地导出变量、函数和更多 javascript 功能。

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

对象可以包含变量和函数,这是 Javascript 非常酷的原因之一。您可以轻松地传递带有函数的复杂对象作为参数,并编写真正漂亮的干净代码。

所以,简而言之,将 module.exports 视为一个对象,该对象通过变量和函数暴露给其他模块和文件。就像在 Java 或 Ruby.

中传递一个面向对象的对象作为参数一样

这里很容易解释:Read More

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

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

Morgan 只是将参数添加到正在导出的模块(在本例中为 compileformattoken。当您在应用程序中使用类似 morgan = require('morgan'),然后您可以调用 morgan.format 以 return 附加到对象的格式。

希望一切都清楚一些!

Can you explain whats happening here?

正在执行赋值语句。

// 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 的 属性 及其value 是标识符的值 morgan

所以当你这样使用它时:

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

一个 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 都指向同一个对象。您可以照常向对象添加属性。但是,如果您想要 return 一个函数或其他对象而不只是默认的标准对象怎么办?

在这种情况下,您可以将 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;

How is a function(morgan) assigned to module.exports ? After the first line is executed, is module.exports a function instead of an JSON object?

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