如何解决node.js中的模块缓存警告(单例问题)?

时间:2014-06-09 18:49:29

标签: javascript node.js module singleton

关注另一个question后,我了解到我正面临module caching caveat issue。显然,在我的项目中创建了同一模块的几个实例。

我要求位于不同文件夹中的其他模块的模块:

var mm = require("./myModule.js");
...

var mm = require("../myDir/myModule.js");
...

var mm = require("../../MyDir/myModule.js");
...

我一直在尝试使用对象并通过导出来创建myModule(单例)的唯一实例:

var myModule = function() {

    if (!(this instanceof myModule)) { return new myModule(); }

    ...

};

...

module.exports = new myModule();

然而,它并没有解决问题。在node.js中声明单例的正确方法是什么?以及如何在其他模块中检索实例?

2 个答案:

答案 0 :(得分:3)

这是一个Windows问题:Windows中的文件路径不区分大小写,因此./File.txt./file.txt引用相同的文件。问题是,该节点不知道这一点,并使用已解析的文件路径作为缓存键,因此可以使用不同的外壳多次加载相同的模块。

有关该问题和讨论的更多信息:https://github.com/joyent/node/issues/6000

解决方案(种类):不要在节点项目中的文件和目录名称中使用大写

答案 1 :(得分:-1)

这种模式绝对适用于单身人士。

// singleton.js

module.exports = new Singleton

function Singleton () {
  this.rand = Math.random()
}

// one.js

var singleton = require('./singleton')
console.log(singleton.rand)

// two.js

require('./one')
var singleton = require('./singleton')
console.log(singleton.rand)

果然输出一致。

0.7851003650575876
0.7851003650575876