Mil*_*ilk 0 javascript node.js
档案my_script.js:
(function() {
console.log("IMPORTED");
})();
Run Code Online (Sandbox Code Playgroud)
调用此文件(run_me.js)应该导致IMPORTED打印两次:
require("./my_script");
require("./my_script");
Run Code Online (Sandbox Code Playgroud)
但是,它仅打印一次。
我run_me.js该如何更改,以便IMPORTED两次打印到控制台。
假设存在此问题,则无法进行任何更改 my_script.js
如果您使用 jest 并希望每次都运行代码进行测试,则可以使用jest.isolateModules:
jest.isolateModules(() => {
require("./my_script");
});
jest.isolateModules(() => {
require("./my_script");
});
Run Code Online (Sandbox Code Playgroud)
require()缓存其结果。因此,第一次需要模块时,它将运行其初始化代码。之后,缓存仅返回module.exports的值,而无需再次运行初始化代码。这是node.js模块的非常理想的功能。
如果您希望每次都运行代码,则应导出一个函数,您可以在需要该函数后调用该函数,如下所示:
您的模块:
module.exports = function() {
console.log("IMPORTED");
}
Run Code Online (Sandbox Code Playgroud)
每次都需要它并运行代码
require("./my_script")();
require("./my_script")();
Run Code Online (Sandbox Code Playgroud)
另外,请注意,没有理由在模块中使用IIFE。node.js模块已经自动包装在私有函数中,因此您无需再次执行此操作。
正如您现在在评论中说的那样(但您的问题并没有直接说出),如果您根本不想编辑my_script(这是解决此问题的错误方法),那么您必须从在再次要求它之前先将node.js缓存起来,可以这样做:
delete require.cache[require.resolve('./my_script')];
Run Code Online (Sandbox Code Playgroud)
我不建议将此作为解决方案。这不是在node.js中进行编码的正确方法。这是一种解决方法。