使用node.js模块,在什么情况下模块会被执行两次?

Bob*_*ith 4 javascript node.js

我有一个模块包装我的应用程序使用的Socket.io功能,看起来像这样:

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

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

...
Run Code Online (Sandbox Code Playgroud)

主要的app.js文件看起来像

// app.js
var rt = require('./realtime.js'),
    other = require('./other.js');
...
rt.init(expressServer);
Run Code Online (Sandbox Code Playgroud)

另一个模块也使用rt.js

// other.js
var rt = require('./realtime.js');
...
Run Code Online (Sandbox Code Playgroud)

我的问题是,other.js和app.js是否都有相同的rt.js实例?

有关redis的SO的答案让我相信上述陈述是正确的,但在文档中说它

多次调用require('foo')可能不会导致模块代码多次执行.这是一个重要的特征.有了它,就可以返回"部分完成"的对象,从而允许加载传递依赖,即使它们会导致循环.

这似乎意味着它不能保证是这样的?

最后这个问题似乎表明它取决于文件名,因为只有一个rt.js实例,所以不应该多次执行.如果是这种情况,它只依赖于rt.js是同一个文件,还是取决于require指定的路径.基本上,如果rt.js和other.js在lib /中,并且app.js比其他.js中的要求低一级,而app.js会指向来自不同文件的rt.js,这有关系吗?

如果有人能为我清除这种困惑,我将不胜感激!

And*_*rov 5

模块目前只评估一次,但你不应该依赖它.在模块中有任何状态被认为是不好的做法.是什么阻止你将对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);
Run Code Online (Sandbox Code Playgroud)