在节点中分隔require的实例

时间:2015-07-16 22:13:40

标签: javascript node.js

比如说我有两个文件A.js和B.js都这样做:

var some_package = require('some_package');

我在两个文件中调用A.doSomething()和B.doSomething(),使用相同的实例 - 因此改变“some_package”中的状态 - 我不希望这种情况发生。

我想要做的是在A和B中创建some_package的单独实例尽管node.js的模块缓存可能吗?

1 个答案:

答案 0 :(得分:1)

如果函数A.doSomething()访问内部模块范围变量,

B.doSomething()doSomething将仅影响所需的模块状态。 e.g。

// some_package.js
var moduleScopeVariable = 0;  // acts like a global for this module

exports.doSomething = function() {
  return ++moduleScopeVariable; // will change moduleScopeVariable for everyone
};

解决此问题的一种方法是公开构造函数,将状态放在实例对象中,并确保不访问doSomething中的任何模块范围变量。

// some_package.js
exports.Doer = function() {
  this.objectScopeVariable = 0;
  this.doSomething = function() {
    return ++this.objectScopeVariable;
  }
}

// test
var A = require("some_package.js");
var doer = new A.Doer();
doer.doSomething();

另一种方法是在模块中保持状态控制并将状态与函数联系起来

// A.js and B.js
var somePackage = require("some_package.js");
var myContext = {
   localState: 0
};

// change doSomething to accept the context
somePackage.doSomething(myContext);

// or use bind to bind the context to a new function
var myDoSomething =  somePackage.doSomething.bind(myContext);

最后,它可以使require缓存无效,但这不是一个好主意。见node.js require() cache - possible to invalidate?