Javascript 在节点中分离require的实例

Javascript 在节点中分离require的实例,javascript,node.js,Javascript,Node.js,例如,假设我有两个文件A.js和B.js都可以这样做: var some_package=require('some_package') 我调用A.doSomething()和B.doSomething(),在这两个文件中,使用了相同的实例-因此改变了“some_包”中的状态-我不希望发生这种情况 我想做的是在a和B中创建某个_包的单独实例。尽管node.js进行了模块缓存,但这是可能的吗?a.doSomething()和B.doSomething()仅在函数doSomething访问内部模块范

例如,假设我有两个文件A.js和B.js都可以这样做:

var some_package=require('some_package')

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

我想做的是在a和B中创建某个_包的单独实例。尽管node.js进行了模块缓存,但这是可能的吗?

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缓存无效,但这不是一个好主意。请参见

您能更改一些软件包吗?或者将其包装在您自己的模块中,该模块使用
some_package
,这样它就不会出现此类问题(例如,通过调用构造函数创建实例?)是的,我可以。但在我们公司的惯例中,我们不鼓励创建对象样式的模块。另外,发现这是否真的有可能(禁用一个模块的缓存以创建一个单独的实例)并同意将解决方案1作为折衷性工作来执行,这也很好。为了科学起见,我也尝试了解决方案B。两种模式都很好