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和 variableopt必须是唯一的。如何做到这一点?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只需返回对预先存在的模块的引用。

也许您需要做的是创建一个类,您可以创建一个或多个实例,而不是使用模块级全局变量。

于 2013-10-10T18:50:23.267 回答
1

添加到Bergi的答案中,您也可以尝试一下

// prog.js
var lib = require('./lib')(),
lib2 = require('./lib')();
lib.set(222)
lib2.set(333)
lib.print()
lib2.print()

// lib.js
module.exports = function constr() {
    var opt = 0

    return { set : function(arg) {
       opt = arg
      },
      print : function() {
       console.log(opt)
      }
    }

};
于 2013-10-10T19:01:41.667 回答
0

将此行添加为您的第一行lib.js

delete require.cache[__filename]

现在,您的模块在每次需要时都位于单独的命名空间中。

于 2013-10-10T20:10:26.400 回答