Требовать несколько раз - PullRequest
       13

Требовать несколько раз

0 голосов
/ 17 сентября 2018

Файл my_script.js:

(function() {
    console.log("IMPORTED");
})();

Вызов этого файла (run_me.js) должен привести к тому, что IMPORTED будет напечатан дважды:

require("./my_script");
require("./my_script");

Однако он печатается только один раз.

Как изменить run_me.js так, чтобы IMPORTED выводился на консоль дважды.

Предположим, для этого вопроса невозможно внести изменения в my_script.js

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

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

https://www.npmjs.com/package/require-uncached

const requireUncached = require('require-uncached');

require('./foo')();
//=> 1

require('./foo')();
//=> 2

requireUncached('./foo')();
//=> 1

requireUncached('./foo')();
//=> 1
0 голосов
/ 14 августа 2019

Не думаю, что это возможно без изменения файла myscript.js. Тем более, что, как вы показываете, он ничего не экспортирует.

Он будет выполняться в первый раз, когда вам это потребуется (именно поэтому вы видите «Импортировано» один раз), но тогда в будущих вызовах ничего не произойдет, потому что возвращается «кэшированное» значение (т. Е. module.exports), которое возвращается пуст.

См. Ниже пример того, что я думаю, что вы хотите (за исключением того, что myscript.js был изменен). Самое большое отличие состоит в том, что в исходном файле myscript.js функция была фактически выполнена, тогда как в приведенном ниже примере она просто определена, а затем фактически выполнена в вызове require в файле run_me.js.

Файл myscript.js:

module.exports = () => console.log("Imported");

Файл run_me.js:

require('myscript.js')(); // note the () at the end which actually calls the function
require('myscript.js')(); // note the () at the end which actually calls the function
0 голосов
/ 17 сентября 2018

require() кеширует свои результаты. Итак, когда модуль требуется в первый раз, запускается его код инициализации. После этого кеш просто возвращает значение module.exports без повторного запуска кода инициализации. Это очень желательная особенность модулей node.js.

Если вы хотите, чтобы код выполнялся каждый раз, вы должны экспортировать функцию, которую вы можете вызывать после того, как она вам понадобится, следующим образом:

Ваш модуль:

module.exports = function() {
    console.log("IMPORTED");
}

Требование и запуск кода каждый раз

require("./my_script")();
require("./my_script")();

Также обратите внимание, что нет причин использовать IIFE в модуле. Модуль node.js автоматически включается в приватную функцию, поэтому вам не нужно делать это снова.


Как вы сейчас говорите в комментарии (но ваш вопрос прямо не говорит), если вы вообще не хотите редактировать my_script (что является просто неправильным способом решения этой проблемы), то вам нужно удалить модуль из кеша node.js перед повторным запросом, что можно сделать так:

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

Я бы не рекомендовал это как решение. Это не правильный способ кодирования в node.js. Это обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...