2014-09-09 2 views
0

я подсмотрел в некотором коде следующее:требующие Singleton Инстансы в узле

var Log = require('log'); 

// This creates a singleton instance 
module.exports = new Log('info'); 

Моя первая реакция была «не так, что это синглтона», но я помню статью, в которой изложил, как Node.js делает require() заявления сказал что-то о кэшировании, требует утверждения и использует их в последующих вызовах.

Итак, в основном, мой вопрос, экспортирует new Object(), фактически создавая синглтон за кулисами?

Я знаю, что существуют другие способы создания синглетонов в JavaScript, но это похоже на довольно удобный способ сделать это внутри узла (если он действительно работает).

ответ

2

Да, это самое близкое к Singleton в Node.js. require() кэширует каждый модуль при первом вызове, поэтому каждый последующий require() всегда возвращает тот же экземпляр.

Однако вы должны знать, что это не всегда применяется. Кэш может быть изменен/удален, также модуль кэшируется с использованием его полного пути, короче говоря, это означает, что если вы определяете singleton в пакете, а ваш пакет устанавливается как вложенная зависимость, у вас может быть несколько экземпляров вашего «singleton» внутри контекст того же приложения. Быстрый пример:

Application 
    node_modules 
    PackageA 
     node_modules 
     YourPackageWithSingleton 
    PackageB 
     node_modules 
     YourPackageWithSingleton 

Обычно вам не придется беспокоиться об этом, но если вам действительно нужно использовать один объект во всем приложении, единственным решением является использование глобалам (мешавшие) или Dependency Injection.

+0

Вид одноразового использования, в каких ситуациях кеш недействителен? Спасибо за информацию о подмодулях, я об этом не думал. –

+0

[Нашел ответ на это.] (Http://stackoverflow.com/questions/9210542/node-js-require-cache-possible-to-invalidate) –

1

На самом деле это не синглтон из-за того, что вы могли создать столько экземпляров Log, сколько хотите. Но вы можете использовать его так. В противном случае вы можете просто создать простой объект на var mySingleton = {} и приложить к нему атрибуты и методы.

Затем вы можете назначить mySingletonmodule.exports и require() в других модулях.

foo.js:

var mySingleton = { 
    someMethod = function() {} 
}; 

module.exports = mySingleton; 

bar.js:

var singletonClass = require('./foo.js'); 

singletonClass.someMethod(); 
1

Почему бы не проверить это для себя?

$ cat test.js 
module.exports = Math.random(); 
$ node 
> var a = require("./test"); 
undefined 
> var a = require("./test"); 
undefined 
> a === b 
true 

Да, похоже, что node.js действительно кэширует экспортированные значения. Следовательно, если вам понадобится тот же модуль снова, он вернет кешированное значение вместо создания нового значения.

Следует отметить, что программист мог только require("log") и создать новый экземпляр вручную. Так что в этом смысле это не синглтон.

Смежные вопросы