我有两个不同的js文件使用相同的模块。
file1.js:
var mod1 = require('commonmodule.js');
mod1.init('one');
file2.js:
var mod2 = require('commonmodule.js');
mod2.init('two');
(这两个文件file1.js,file2.js都加载到我的server.js文件中,它们本身就是模块)
现在在commonmodule.js:
var savedName;
exports.init = function(name)
{
savedName = name;
}
exports.getName = function()
{
return savedName;
}
我注意到这个savedName总是被覆盖,取决于最后设置它的人。所以它似乎不起作用。我如何获得维持状态的模块?
注意:我还尝试将savedName设置为commonmodule.js中的exports.savedName,但它不起作用
答案 0 :(得分:4)
每次需要模块时,您都可以创建一个新实例:
commonmodule.js
function CommonModule() {
var savedName;
return {
init: function(name) {
savedName = name;
},
getName: function() {
return savedName;
}
};
}
module.exports = CommonModule;
file1.js
var mod1 = new require('./commonmodule')();
mod1.init('one');
console.log(mod1.getName()); // one
file2.js
var mod2 = new require('./commonmodule')()
mod2.init('two');
console.log(mod2.getName()); // two
答案 1 :(得分:2)
模块本身就是简单的对象实例。所有其他模块将共享一个实例(需要注意的是它是通过相同的路径加载的)。如果需要state,请使用类并导出构造函数。
示例:
//Person.js
function Person(name) {
this.name = name;
}
module.exports = Person;
使用它:
var Person = require("./Person");
var bob = new Person("Bob");
答案 2 :(得分:0)
模块不像类/类函数;默认情况下,由于缓存,mod1
和mod2
将引用同一模块。要跟踪每个实例的状态,您需要一个构造函数或模块内部类似的东西,例如。
var mod = require('commonmodule.js');
var state = new mod.init('one');
init
定义有状态对象的位置。你也可以让它返回一个对象文字,在这种情况下你不必使用new
(例如var state = require('commonmodule.js').init('one');
)
(假设您希望模块除了每个实例状态之外还有其他共享状态;如果不是这样,那么Peter Lyons的方法会更简单。)
答案 3 :(得分:-1)
您可以从缓存中删除模块。像那样:
file1.js:
var mod1 = require('commonmodule.js');
mod1.init('one');
file2.js:
delete require.cache[require.resolve(modulename)];
var mod2 = require('commonmodule.js');
mod2.init('two');
但我发现它不是很方便和干净。
但您也可以clone it或制作一个小代理。
你也可以创建类:
var savedName;
exports.obj = {}
exports.obj.prototype.init = function(name)
{
savedName = name;
}
exports.obj.prototype.getName = function()
{
return savedName;
}
然后:
var mod2 = new (require('commonmodule.js'))();
mod2.init('two');