我有一個模塊,它包裝我的應用程序是使用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,那麼這很重要嗎?
如果有人能爲我解決這個困惑,我將不勝感激!
你爲什麼要在兩個js文件中都調用require - 是什麼阻止你將引用從app.js傳遞給模塊? – 2012-07-18 15:40:26
我還沒有能夠想到一個乾淨的方式來做到這一點,而不需要對代碼進行大量修改(使用require它似乎並不重要,如果app.js需要的兩個模塊也需要對方,更改該設置需要一段時間)。如果這就是需要的,我會全力以赴的,但我也只是好奇它是如何工作的:)。謝謝你的評論! – 2012-07-18 15:59:29
好的 - 通常,如果我有某個引用(例如,redis),我將該引用傳遞給模塊。希望它有助於 – 2012-07-18 16:02:42