需要多次

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

Che*_*Kot 8

如果您使用 jest 并希望每次都运行代码进行测试,则可以使用jest.isolateModules

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

jest.isolateModules(() => {
    require("./my_script");
});
Run Code Online (Sandbox Code Playgroud)


jfr*_*d00 6

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中进行编码的正确方法。这是一种解决方法。

  • @JoshMcGee - 如果您希望模块是可变的(一遍又一遍地运行自身),那么只需设计一个从该函数导出的函数,然后根据需要多次调用它。从缓存中删除它以便您可以再次运行它是一种黑客行为。这就是模块现在设计的工作方式,并且不能保证较新的 ESM 模块也能以这种方式工作。此外,如果您希望模块具有特定功能,则将该功能构建到模块本身中,而不是尝试进行修改以使其再次运行其初始化代码。 (2认同)