Gob*_*ode 7 javascript memory import dynamic unload
基本上,我有一个 json 文件,它定义用户登录时要加载的内容。这包括 javascript 文件。当不同的用户登录时,需要卸载以前的东西,而无需刷新页面。
我正在使用 javascript 动态导入
modules[moduleId] = await import(url);
Run Code Online (Sandbox Code Playgroud)
我发现,即使我将“模块”变量清除为空对象后,动态导入的模块中定义的事件侦听器仍然会触发。我假设该闭包中定义的大多数其他内容仍然占用内存。
现在,如果我像这样滥用登录/注销,我假设我最终会遇到内存泄漏问题。如何确保加载到对象引用中的模块在不再需要时正确卸载?
我在这里使用纯 js,无法访问外部库或工具。
我只能想到一种可能的(相当)好的解决方案。只需用空模块覆盖该模块即可。就像,加载将是:
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()加载的模块仍然不可能被卸载。