4

アプリが使用している Socket.io 機能をラップするモジュールが 1 つあります。これは次のようになります。

// 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 の同じインスタンスがあるかどうかです。

redisに関連するSOの答えは、上記の声明が真実であると私に信じさせますが、ここのドキュメントでは次のように述べています

require('foo') を複数回呼び出しても、モジュール コードが複数回実行されることはありません。これは重要な機能です。これにより、「部分的に完了した」オブジェクトを返すことができるため、サイクルが発生する場合でも推移的な依存関係をロードできます。

それが事実であることが保証されていないことを暗示しているようですか?

最後に、この質問は、ファイル名に依存していること、および rt.js のインスタンスが 1 つしかないため、複数回実行してはならないことを示しているようです。その場合、同じファイルである rt.js のみに依存するか、require で指定されたパスに依存しますか。基本的に、rt.js と other.js が lib/ にあり、app.js が other.js の require の 1 レベル下にあり、app.js が別のファイルから rt.js を指す場合、これは問題になりますか?

誰かが私のためにこの混乱を解消できれば幸いです!

4

2 に答える 2

5

modules are currently evaluated only once, but you should not rely on this. Having any state in module is considered bad practice. What prevents you from passing reference to sio to 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);
于 2012-07-19T01:04:30.517 に答える
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.)

お役に立てれば。

于 2012-07-19T23:37:09.843 に答える