2015-07-03 71 views
3

我如何需要全局模塊,以便我可以在不同的模塊中使用它,而無需再次需要它? 還是我每次都必須這樣做? 有沒有最佳做法呢?Node.js全局需求

繼承人是我正在談論的一個例子。 可以說,我有一個index.js這樣的:

var a = require('a.js'), 
utils = require('utils.js'); 

var str = 'hello this is a test'; 
str = a.change(str); 

utils.return(str); 

a.js

var utils = require('utils.js'); 

exports.change = function(str) { 
    str = str.replace('test', 'example'); 
    utils.return('i changed test to example!'); 
    return str; 
} 

utils.js

exports.return = function (msg) { 
    console.log(msg); 
} 

你看我有需要('utils.js')兩次,但我寧願要求一次e index.js,並將其作爲utils在index.js和a.js中提供。 有沒有什麼好的方法來實現這個目標?

+2

我其實有類似的問題以及(stackoverflow.com/questions/31196572/parse-is-undefined-in-node-js-controller)。期待看到你的問題的答案。它也可以解決我的問題。 – Amir

回答

6

nodejs開發中的常規做法是在每個模塊中只需要require()模塊。模塊本身由nodejs緩存,因此每次都返回相同的模塊,並且實際上並未反覆加載。這樣做而不是創建全局變量通常會使代碼更加模塊化並且可重用,因爲每個模塊都唯一地指定(使用require()語句)需要什麼,而不是擁有一堆依賴於一些預先存在的全局配置的模塊,這會創建更多的依賴關係,加載順序問題等...

可以在一堆其他模塊上創建一個模塊,並將結果合併到一個新的主模塊中(如果相關或有用的話),以便僅其他模塊必須要求新的主模塊。

建議不要使用全局變量來代替僅使用require()語句。請記住,在nodejs編程中,大多數require()語句只是在服務器初始化時運行,並且它們被緩存,所以沒有必要避免使用require()而不是全局提供的好處和模塊性。


我不會親自推薦這個,因爲它具有模塊化食堂,但在具體的例子,你也可以通過utils模塊到a.js構造:

var utils = require('utils.js'); 
var a = require('a.js')(utils); 
+0

感謝您的回答。問題是,我有一個高度模塊化的項目,並且其他模塊需要很多模塊。這會導致在我編寫的每個模塊開始時出現大量的require語句,這在我看來非常難看。我知道所需的模塊被緩存,這不是我的問題。我只想擺脫每個模塊中巨大的需求塊。 –

+0

@JohnJackson - 那麼,你已經模塊化了很多,你現在想要用一堆全局變得模塊化?你能看到這裏的諷刺嗎?如果你願意,你肯定可以自由使用全局變量,並以某種方式仔細控制加載順序 - 我只是不知道任何人認爲這是一個好的設計模式。而且,它首先打破了模塊化的許多優點,因爲使用全局變量的模塊將不再是自包含的並且可以獨立使用(沒有某個主機首先創建適當的全局變量)。 – jfriend00

+0

@JohnJackson - FYI具有易於維護,可重複使用和模塊化的設計,但它有一定的成本。在這種情況下,聽起來你已經將事物設計成小塊模塊。剩下的實際使用它的方法是在每個模塊中插入必要的'require()'語句。如果你真的不喜歡那樣,那麼你只是拋棄了模塊化設計的大部分優點(除了有很多小文件外)。模塊化的最大優點是易於重用,如果你依賴一羣全局變量,你就不會有這種情況。 – jfriend00