在节点中分离require的实例

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

var some_package = require('some_package');

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

我想要做的是在A和B中创build一个单独的some_package实例,尽pipenode.js模块caching,这是可能的吗?

如果函数doSomething访问内部模块范围variables, B.doSomething() A.doSomething()B.doSomething()只会影响所需模块的状态。 例如

 // some_package.js var moduleScopeVariable = 0; // acts like a global for this module exports.doSomething = function() { return ++moduleScopeVariable; // will change moduleScopeVariable for everyone }; 

解决这个问题的方法之一就是公开一个构造函数,将状态放在实例对象中,并确保不要访问doSomething任何模块范围variables。

 // 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(); 

另一种方法是在模块中保持状态控制,并将状态与function绑定

 // 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); 

最后,它可能会使需要caching无效,但它不是一个好主意。 请参阅node.js require()caching – 可能无效?