在节点中分离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 – 可能无效?