2016-05-23 149 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);