2016-12-01 104 views
0

在Node.js的(CommonJS的模塊系統),我們有傳遞數據需要功能

require('foo'); 

有沒有辦法將數據傳遞到模塊,是這樣的:

require('foo', {extra:'args'}); 

我d一旦加載,就希望能夠在模塊本身中設置一個值,並且我不能控制'foo'的結構 - 它可能會導出一個函數,或者整個模塊可能會運行完成。

用例實際上是相當普遍的:

我有一個模塊,像這樣:

// foo.js

function bar(){ 


} 

if(x){  //if I could pass x as variable to the module, that would be useful 
bar(); 
} 

module.exports = bar; 

不幸的是,TMK,我必須設置一個全局變量來規定x的值,這總是很糟糕。

+0

如果你不能控制'foo'的結構,你怎麼知道你的論點將意味着什麼或做任何事情?我的意思是,答案是「不」。但如果你能更好地解釋爲什麼你認爲你需要這樣做,我可以告訴你如何實現你的真正目標。 – Paul

+0

有點難以解釋爲什麼這個功能會有用。它是API的一部分。我只是添加了一些細節。 –

+0

如果你足夠長的時間瞭解Node.js,那麼以前你會看到這種困境。也許有解決辦法。 –

回答

2

自2009年以來,我一直在使用node.js,希望這足夠長。 ;)

一般來說,你所要求的是不可能的,你問它的方式。正如你所描述的,我已經看到了四種配置模塊的常用模式。

1)導出函數,將params傳遞給配置其選項的函數。這是迄今爲止最常用的方法。

2)使用靜態(功能或屬性)。如果將模塊視爲Singleton,這是最常見的選項,並且這些選項是要應用於模塊的所有實例的內容。但是由於全球化的狀況,大多數人都回避這種做法。

3)環境變量。這是另一種非常常見的做法,並由12factor.net推薦。對於應用程序級別的變量來說最爲常見,對於內部模塊來說更是如此。

4)配置模塊。在這種情況下,人們使用類似convict等的東西來整合來自其他文件(基於環境)和命令行參數以及環境變量的配置。需要配置的模塊只需要這些模塊,並詢問他們關心的變量。

+0

感謝Paul,我從來沒有懷疑過你使用Node的經驗! :)基本上這是針對API的,在這種情況下,模塊需要完全作爲腳本執行,或者等待導出的函數在需要腳本之後被調用。我希望API的用戶能夠決定他們想要的執行類型。要求用戶進行大量設置並使用全局變量或env變量總是很糟糕,我想,但讓我再考慮一下你的答案。 –

+1

是的,我沒有把它當作輕微的,但我忍不住迴應。我建議在nodeverse中查看其他記錄良好的API。一般來說,模式是在模塊入口點傳入一次選項,然後讓它們在內部處理任何事情。但選擇是關鍵;應該有幾乎所有的智能默認設置。 – Paul