Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Require multiple times

File my_script.js:

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

Calling this file (run_me.js) should cause IMPORTED to print twice:

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

However it only prints once.

How can I change run_me.js so that IMPORTED is printed to the console twice.

Assume for this question, no changes can be made to my_script.js

like image 519
Milk Avatar asked Sep 17 '18 01:09

Milk


2 Answers

require() caches its results. So, the first time a module is required, then its initialization code runs. After that, the cache just returns the value of module.exports without running the initialization code again. This is a very desirable feature of node.js modules.

If you want code to be run each time, then you should export a function that you can call after you require it like this:

Your module:

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

Requiring it and running the code each time

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

Also, please note that there is no reason to use an IIFE in a module. The node.js module is automatically wrapped in a private function already so you don't need to do it again.


As you now say in a comment (but your question does not directly say), if you don't want to edit my_script at all (which is simply the wrong way to solve this issue), then you have to delete the module from the node.js cache before requiring it again which can be done like this:

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

I would not recommend this as a solution. It's not the proper way to code in node.js. It's a hack work-around. And, it is not compatible with ESM modules.

like image 186
jfriend00 Avatar answered Oct 17 '22 02:10

jfriend00


If you use jest and want code to be run each time for testing, you can use jest.isolateModules:

jest.isolateModules(() => {
    require("./my_script");
});

jest.isolateModules(() => {
    require("./my_script");
});
like image 33
ChelowekKot Avatar answered Oct 17 '22 03:10

ChelowekKot