在 ES6 模块之前,通过删除它的 require
来强制重新加载 JS 脚本很容易(其他 Stack 答案告诉我)。缓存:
delete require.cache[require.resolve('./mymodule.js')]
但是,我找不到通过
import
加载的 ES6 模块的等效项。 .这可能足以让这个问题变得清晰,但以防万一,这是代码的简化版本。我所拥有的是一个运行类似的 Node 服务器:
-- look.mjs --
var look = function(user) { console.log(user + " looks arond.") }
export { look };
-- parser.mjs --
import { look } from './look.mjs';
function parse(user, str) {
if (str == "look") return look(user);
}
我想要的是能够手动更改look.mjs文件(例如修复拼写错误的单词),触发一个导致look.mjs在运行时重新导入的函数,这样parse()无需返回新值重启 Node 服务器。
我尝试更改为动态导入,如下所示:
-- parser.mjs --
function parse(user, str) {
if (str == "look") {
import('./look.mjs').then(m => m.look(user))
}
}
这也不起作用。 (我的意思是,它确实,但它不会在每次调用它时重新加载look.mjs,只是在第一次)如果可能的话,我更愿意继续使用静态导入。
另外,如果不清楚,这都是服务器端的。我不是想将新模块传递给客户端,只是让一个 Node 模块重新加载另一个 Node 模块。
最佳答案
我不知道这样做背后的原因是什么,
我认为在运行时更改模块的上下文并导致意外行为是不安全的,这也是 Deno 出现的原因之一。
如果你想在运行时运行一些代码评估,你可以使用 vm 使用类似这样的东西:
https://nodejs.org/dist/latest-v16.x/docs/api/vm.html
关于javascript - 如何在运行时重新加载 ES6 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61376059/