繁体   English   中英

Node.js模块导出混乱

[英]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对象吗?

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是公开给其他模块和文件的对象。 这提供了导出变量,函数和更多javascript功能的便捷方法。

如您在此处看到的,将任何变量初始化为{}时,您正在初始化一个对象。

一个对象可以包含变量和函数,这是使Javascript真正酷的一件事。 您可以轻松地以函数为参数传递复杂的对象,并编写出真正漂亮的干净代码。

因此,简而言之,将module.exports视为一个对象,该对象暴露给具有变量和功能的其他模块和文件。 就像在Java或Ruby中将面向对象的对象作为参数传递一样。

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

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

分配声明正在发生。

// 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM