14

我正在使用动态导入来加载用户在浏览器中编写的脚本。我首先将脚本内容放入一个 blob 中,然后使用 dynamicimport()将脚本作为模块加载。随着时间的推移,我希望这些脚本会改变并被销毁,因此相应的模块会被垃圾收集。但是,基于 Chrome 中的内存分析,这并没有发生。

原因似乎与一个叫做ModuleMap. 这是我在所有脚本不再使用后拍摄的内存快照的屏幕截图。

Chrome 堆快照

如您所见,Window 对象提供了通往这些模块的保留路径。只要是这种情况,我肯定最终会耗尽内存,因为每次用户编辑他们的脚本时都会创建这些模块。

我想知道是否有办法让 Chrome(和其他浏览器)在这些模块不再使用时卸载它们。

4

1 回答 1

6

我从这个规范中了解到,也许答案是你不能导致模块被卸载。这是因为任何给定的模块只能被每个 Document worker 解析一次。我无法保证一旦将给定 URL 中的模块丢弃,我将永远不再使用它,因此 ModuleMap 无法允许收集东西。

而且,确实,通读 Chromium 源代码,我没有看到对UnregisterModuleScript的任何调用。这完全有可能不是所有相关的代码,但如果是这样,那么任何给定的实例ModuleMap都会永远挂在它的模块上。

从理论上讲,我似乎可以从 WebWorkers 获得所需的行为,因为它们具有不同的全局范围。如果有人能告诉我我是否在吠叫正确的树,那将很有帮助。

于 2018-05-11T04:00:07.213 回答