2016-05-23 116 views
1

我对module.exports有些混淆。据我理解module.exports是暴露于其他模块的对象,Nodejs模块导出混乱

exports=module.exports={} 

但在摩根包中的node.js的index.js我发现这个。

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

morgancompileformattoken的所有功能。

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

+0

我读到“Nodejs模块导出混淆”。 (肯定会+1) – sweaver2112

回答

3

一个节点模块基本上是这样的:

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对象,而是编码格式)。

+0

执行完这4行后,你能告诉我module.exports怎么样? – MYGz

+0

@MohammadYusufGhazi它将是一个函数对象,具有3个函数对象属性。 –

+0

所以format,compile和token会变成module.exports的函数变量,这是一个函数吗? – MYGz

0

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

正如你所看到的here,当你初始化任何变量到{}时,你正在初始化一个对象。

一个对象可以包含变量和函数,这是让Javascript真的很酷的东西之一。您可以轻松地传递具有参数功能的复杂对象,并执行真正的干净的代码。

因此,短篇小说,请将module.exports想象成暴露给其他模块和带有变量和函数的文件的对象。就像在Java或Ruby中传递面向对象的对象作为参数一样。

这里很容易解释:Read More

1

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

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

摩根只需添加参数被导出的模块(这种情况下,compile,formattoken当你在你的应用程序中需要使用类似morgan = require('morgan')的模块时,你可以调用morgan.format来返回附加到该对象的格式吨。

希望能够清理一些东西!

+0

执行完这4行后,你能告诉我module.exports怎么样? – MYGz

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