javascript - 如何在运行时重新加载 ES6 模块?

标签 javascript node.js import module

在 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/

相关文章:

javascript - 是否可以在 ES6 的类中使用箭头函数?

node.js:导入模块的范围

javascript - 需要 riak-js 的帮助

python - 在Python中从多个文件夹读取多个csv文件

python - 导入 GDK 的问题

javascript - 如何遍历 MarkLogic 中的序列值?

javascript - HTML5自定义属性更新值

javascript - 我从哪里获得 http ://jsfiddle.net/jrweinb/MQ6VT/中提到的 javascript uri css

javascript - 在 Node 中打开 PDF 时的错误处理

mysql - 导入大数据库到docker时写入错误