Есть ли способ "потребовать" JS файл только один раз в nodejs?
Я только начал работать с nodejs. Интересно, есть ли способ "потребовать" файл только один раз в приложении. Я использую класс framework для получения классического OOPS в моем проекте JS. Каждый "класс" содержится в собственном JS файле. Я хочу "потребовать" рамки класса в каждом файле, чтобы они могли функционировать независимо, но чтобы код инициализации фрейма выполнялся только один раз.
Я могу использовать флаг для реализации этого сам, но встроенный способ был бы приятным. Поиск "требуется один раз" приводит меня ко всем связанным с PHP вопросам.
Ответы
Ответ 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.