需要多次

时间:2018-09-17 01:37:14

标签: javascript node.js

文件my_script.js

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

调用此文件(run_me.js)会使IMPORTED打印两次:

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

但是,它只能打印一次。

如何更改run_me.js,以便将IMPORTED打印到控制台两次。

假设存在此问题,无法对my_script.js

进行任何更改

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

我认为不修改response = requests.post( endpoint + '/Chasitor/ChatMessage', headers={ 'X-LIVEAGENT-SESSION-KEY': session_info['key'], 'X-LIVEAGENT-AFFINITY': session_info['affinityToken'], 'X-LIVEAGENT-API-VERSION': '46' }, data=json.dumps({'text': message}) ) 文件是不可能的。特别是因为如您所示,它不会导出任何内容。

它将在您第一次需要它时执行(这就是为什么您一次看到“已导入”的原因),但是随后在以后的要求中什么都不会发生,因为“已缓存”值(即myscript.js)返回为空。

请参阅以下示例,了解我想要的内容(除了myscript.js已被修改)。最大的不同是,在原始module.exports文件中,该函数实际上已执行,而在下面的示例中,该函数只是定义了,然后在myscript.js文件中的require调用中实际执行了

文件run_me.js

myscript.js

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

run_me.js

答案 3 :(得分:-1)

您可以使用此程序包,它是一个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