Подтвердить что ты не робот

Есть ли способ "потребовать" JS файл только один раз в nodejs?

Я только начал работать с nodejs. Интересно, есть ли способ "потребовать" файл только один раз в приложении. Я использую класс framework для получения классического OOPS в моем проекте JS. Каждый "класс" содержится в собственном JS файле. Я хочу "потребовать" рамки класса в каждом файле, чтобы они могли функционировать независимо, но чтобы код инициализации фрейма выполнялся только один раз.

Я могу использовать флаг для реализации этого сам, но встроенный способ был бы приятным. Поиск "требуется один раз" приводит меня ко всем связанным с PHP вопросам.

4b9b3361

Ответ 1

require всегда "требуется один раз". После первого вызова require, require использует кеш и всегда возвращает тот же объект.

Любой исполняемый код, плавающий в модуле, будет запускаться только один раз.

С другой стороны, если вы хотите, чтобы он запускал код инициализации несколько раз, просто выбросьте этот код в экспортированный метод.

edit: прочитайте раздел "Кэширование" http://nodejs.org/docs/latest/api/modules.html#modules

Ответ 2

Если вам действительно нужен код верхнего уровня в вашем модуле (код, который не содержится в методах или функциях в вашем модуле) для выполнения более одного раза, вы можете удалить его объект модуля, который кэшируется на объекте require.cache, например,

delete require.cache[require.resolve('./mymodule.js')];

Сделайте это, прежде чем потребуется модуль во второй раз.

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

var myMod = require("./mymodule.js"); //the first time you require the
                                      //mymodule.js module the top level code gets
                                      //run and you get the module value returned.


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js
                                      //module you will only get the module value
                                      //returned. Obviously the second time you
                                      //require the module it will be in another
                                      //file than the first one you did it in.