2
//lib.js
var opt = 0

exports.set = function(arg) {
   opt = arg
}

exports.prn = function() {
   console.log(opt)
}


///prog.js
var lib = require('./lib')
var lib2 = require('./lib')
lib.set(222)
lib2.set(333)
lib.prn()
lib2.prn()

prog.js の出力: 333 333

しかし、出力する必要があります:222 333

つまり、 variableおよびoptvariable に対して一意である必要があります。それを達成する方法は?liblib2

4

5 に答える 5

5

これは、通常、nodejs がrequire経由で取得したモジュールをキャッシュするためです。次のヘルパーを使用できます。

// RequireUncached.js
module.exports = function(module) {
    delete require.cache[require.resolve(module)]
    return require(module);
}

およびヘルパーの使用法:

var requireUncached = require('RequireUncached.js');
requireUncached("./lib"); 

このアプローチは悪い習慣と見なされ、使用すべきではないことに注意してください。ロジックを関数にラップし、モジュールを要求して関数を呼び出すことをお勧めします。したがって、新しいインスタンスを取得するたびに。

于 2013-10-10T18:50:51.403 に答える
4

requireスクリプトを複数回ロードすることはありませんが、常に同じインスタンスが生成されます。

異なる環境が必要な場合は、モジュールを複数回インスタンス化できるコンストラクター関数にします。opt(グローバル) モジュール スコープではなく、各オブジェクトに格納します。

// lib.js
module.exports = function constr() {
    var opt = 0
    this.set = function(arg) {
       opt = arg
    };
    this.print = function() {
       console.log(opt)
    };
};

// prog.js
var lib = require('./lib'),
    inst1 = new lib(),
    inst2 = new lib();
/* or short:
var inst1 = new require('./lib')(),
    inst2 = new require('./lib')(); */
inst1.set(222)
inst2.set(333)
inst1.print()
inst2.print()
于 2013-10-10T18:50:33.580 に答える
1

NodeJS モジュール システムの動作方法、出力は正しく、ここでの期待は設計原則と矛盾します。

各モジュールは一度だけロードされ、その後の呼び出しはrequire既存のモジュールへの参照を返すだけです。

おそらく、モジュール レベルのグローバルを使用する代わりに、1 つ以上のインスタンスを作成できるクラスを作成する必要があります。

于 2013-10-10T18:50:23.267 に答える
0

この行を最初の行として追加しますlib.js

delete require.cache[__filename]

モジュールは、必要になるたびに個別の名前空間になります。

于 2013-10-10T20:10:26.400 に答える