比如说我有两个文件A.js和B.js都这样做:
var some_package = require('some_package');
我在两个文件中调用A.doSomething()和B.doSomething(),使用相同的实例 - 因此改变“some_package”中的状态 - 我不希望这种情况发生。
我想要做的是在A和B中创建some_package的单独实例尽管node.js的模块缓存可能吗?
答案 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?