文件my_script.js
:
(function() {
console.log("IMPORTED");
})();
调用此文件(run_me.js
)会使IMPORTED
打印两次:
require("./my_script");
require("./my_script");
但是,它只能打印一次。
如何更改run_me.js
,以便将IMPORTED
打印到控制台两次。
假设存在此问题,无法对my_script.js
答案 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