Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在客户端ES6 JavaScript中卸载和垃圾收集模块?_Javascript_Memory Leaks_Garbage Collection_Node Modules - Fatal编程技术网

如何在客户端ES6 JavaScript中卸载和垃圾收集模块?

如何在客户端ES6 JavaScript中卸载和垃圾收集模块?,javascript,memory-leaks,garbage-collection,node-modules,Javascript,Memory Leaks,Garbage Collection,Node Modules,我正在编写一个需要动态加载和卸载自包含(批准)代码的网络应用程序。简言之,主要目标是在短时间内加载这些脚本,避免全局名称冲突或污染全局范围,并能够卸载它们并将所有内容垃圾收集 最初的问题是,如果我只是在DOM中添加和删除一个脚本,那么卸载后任何全局变量都将保持不变 我的临时解决方案是将所有单独的动态代码节文件包装到: systemArray.push((function() { // local-global scope function main() { // do something

我正在编写一个需要动态加载和卸载自包含(批准)代码的网络应用程序。简言之,主要目标是在短时间内加载这些脚本,避免全局名称冲突或污染全局范围,并能够卸载它们并将所有内容垃圾收集

最初的问题是,如果我只是在DOM中添加和删除一个脚本,那么卸载后任何全局变量都将保持不变

我的临时解决方案是将所有单独的动态代码节文件包装到:

systemArray.push((function() {
// local-global scope
function main() {
   // do something
}
return main;
}()));
...
...
// some external code calls:
systemArray[sandboxIdx](); // max of 10 sandboxes at once, need to unload old sandboxes that have been exited
并在卸载时简单地弹出数组,让垃圾收集器完成其工作。但是,这实际上不允许将子程序拆分为多个文件,而且似乎有点容易出错,除非我可以在服务器端进行一些预处理以创建一个连接的文件

然后我研究了ES6模块。这些看起来很好,避免了名称冲突,但我不清楚模块是否可以卸载,这是我在不更改网页或刷新的情况下需要做的关键事情

首先,有没有办法在运行时显式卸载模块?应用程序的主要非卸载部分只需要导入一个函数,但是脚本本身可能有很多代码。
其次,如果答案是肯定的,那么卸载的模块加载的任何模块也会卸载吗?模块中的全局变量是否正确地被垃圾收集?如果答案是否定的,还有什么其他选项?

我正在编写一个Node JS应用程序/../I只需在DOM中添加和删除一个脚本。
。DOM在NodeJS中不是一个概念。请您澄清一下,您是在浏览器中还是在NodeJS中运行代码。我的意思是,这是一个网络应用程序,带有使用NodeJS的服务器端组件,但您是对的,这一部分是不相关的。我指的是ES6客户端代码@Olian04为什么要卸载模块?其思想是我的应用程序是我们循环使用的可信用户代码的主机。它们都是孤立的“世界”/“游戏循环”。但我们需要离开那些“世界”,永远不要再看到它们。可能有很多。我想在每次切换到另一个时清除用户代码/内存,因为我们不关心用户代码的保留。我们还需要结构内存和全局范围。我意识到这似乎是武断的,但这是一个有这些约束和目标的项目的一部分。我希望我想做的事情实际上可以通过模块而不是黑客解决方案来实现。这似乎是动态加载设计或实现中的一个缺陷。它违背了将大型前端应用程序拆分为模块以实现更好的内存管理的目的。我们确实得到了延迟加载的好处,这可能会加快引导时间,但随着用户在应用程序的不同区域导航,内存使用量将增加。这是Flash时代解决的问题:(),很遗憾浏览器模块系统似乎没有启用此功能。
我正在编写一个Node JS应用程序/../我只是在DOM中添加和删除一个脚本。
。DOM在NodeJS中不是一个概念。请您澄清一下,您是在浏览器中还是在NodeJS中运行代码。我的意思是,这是一个网络应用程序,带有使用NodeJS的服务器端组件,但您是对的,这一部分是不相关的。我指的是ES6客户端代码@Olian04为什么要卸载模块?其思想是我的应用程序是我们循环使用的可信用户代码的主机。它们都是孤立的“世界”/“游戏循环”。但我们需要离开那些“世界”,永远不要再看到它们。可能有很多。我想在每次切换到另一个时清除用户代码/内存,因为我们不关心用户代码的保留。我们还需要结构内存和全局范围。我意识到这似乎是武断的,但这是一个有这些约束和目标的项目的一部分。我希望我想做的事情实际上可以通过模块而不是黑客解决方案来实现。这似乎是动态加载设计或实现中的一个缺陷。它违背了将大型前端应用程序拆分为模块以实现更好的内存管理的目的。我们确实得到了延迟加载的好处,这可能会加快引导时间,但随着用户在应用程序的不同区域导航,内存使用量将增加。在Flash时代,这是一个已解决的问题:(),很遗憾浏览器模块系统似乎没有启用此功能。