如何在javascript中卸载动态导入?

Gob*_*ode 7 javascript memory import dynamic unload

基本上,我有一个 json 文件,它定义用户登录时要加载的内容。这包括 javascript 文件。当不同的用户登录时,需要卸载以前的东西,而无需刷新页面。

我正在使用 javascript 动态导入

 modules[moduleId] = await import(url);
Run Code Online (Sandbox Code Playgroud)

我发现,即使我将“模块”变量清除为空对象后,动态导入的模块中定义的事件侦听器仍然会触发。我假设该闭包中定义的大多数其他内容仍然占用内存。

现在,如果我像这样滥用登录/注销,我假设我最终会遇到内存泄漏问题。如何确保加载到对象引用中的模块在不再需要时正确卸载?

我在这里使用纯 js,无法访问外部库或工具。

itn*_*nix 3

我只能想到一种可能的(相当)好的解决方案。只需用空模块覆盖该模块即可。就像,加载将是:

modules[moduleId] = await import(`./${moduleId}.js`);
Run Code Online (Sandbox Code Playgroud)

卸载就像:

modules[moduleId] = await import(`./empty_module.js`);
Run Code Online (Sandbox Code Playgroud)

甚至更好:

modules[moduleId] = null;
Run Code Online (Sandbox Code Playgroud)

编辑:在测试了许多进行垃圾收集以清理内存的方法之后 - 卸载已加载的模块似乎是不可能的。看来浏览器无论如何都会根据模块的 URL 来缓存该模块。我在Chromium上测试了它,以明确该主题。所以总而言之 - 通过import()加载的模块仍然不可能被卸载。