2012-07-18 63 views
4

我有一個模塊,它包裝我的應用程序是使用Socket.io功能,它看起來是這樣的:使用node.js模塊,模塊會在什麼情況下執行兩次?

// realtime.js 
var io = require('socket.io'), 
    sio; 

exports.init = function(expressServer) { 
    sio = io.listen(expressServer); 
} 

... 

主要app.js文件看起來像

// app.js 
var rt = require('./realtime.js'), 
    other = require('./other.js'); 
... 
rt.init(expressServer); 

其他模塊也使用rt.js

// other.js 
var rt = require('./realtime.js'); 
... 

我的問題是,都將other.js和app.js有rt.js的同一個實例?

answer on SO relating to redis導致我相信上述聲明是真實的,但在the documentation here它說

多次調用需要(「富」)不會導致該模塊的代碼是 執行多次。這是一個重要的功能。通過它,可以返回 「部分完成」的對象,從而允許即使在它們會導致循環時也加載依附關係。

這似乎暗示它不能保證是這種情況?

最後this question似乎表明它取決於文件名,並且由於只有一個rt.js實例,所以它不應該被執行多次。如果是這種情況,它只取決於rt.js是相同的文件,還是取決於require指定的路徑。基本上,如果rt.js和other.js在lib /中,並且app.js與other.js中的require相比要低一級,並且app.js會指向來自不同文件的rt.js,那麼這很重要嗎?

如果有人能爲我解決這個困惑,我將不勝感激!

+0

你爲什麼要在兩個js文件中都調用require - 是什麼阻止你將引用從app.js傳遞給模塊? – 2012-07-18 15:40:26

+0

我還沒有能夠想到一個乾淨的方式來做到這一點,而不需要對代碼進行大量修改(使用require它似乎並不重要,如果app.js需要的兩個模塊也需要對方,更改該設置需要一段時間)。如果這就是需要的,我會全力以赴的,但我也只是好奇它是如何工作的:)。謝謝你的評論! – 2012-07-18 15:59:29

+0

好的 - 通常,如果我有某個引用(例如,redis),我將該引用傳遞給模塊。希望它有助於 – 2012-07-18 16:02:42

回答

4

模塊目前只評估一次,但不應該依賴於此。在模塊中有任何狀態被認爲是不好的做法。什麼阻止你將sio引用傳給other.js?

//realtime 
var io = require('socket.io'), 

exports.init = function(expressServer) { 
    return io.listen(expressServer); 
} 

// app.js 
var rt = require('./realtime.js'), 
    other = require('./other.js'); 
... 
var sio = rt.init(expressServer); 
// now ask other.js to use same sio instance 
other.use_sio(sio); 
+0

感謝您的回答,看起來像一個乾淨的方式來處理依賴關係! – 2012-07-19 17:38:28

0

請務必不要在多個位置安裝socket.io。如果在不同模塊中需要使用socket.io,其中每個模塊都在搜索不同路徑的軟件包,則每個模塊將加載該軟件包的單獨實例。

應用程序的目錄佈局:

-module1 
--/npm_modules //has socket.io 
---/socket.io 
--/module1.js //requires socket.io from module1/npm_modules 

-module2 
--/npm_modules //has another socket.io installation 
---/socket.io 
--/module2.js //requires socket.io from module2/npm_modules (Does not create a reference to what was required in module1.) 

希望這有助於。

相關問題