我们在嵌入式环境中开发应用程序。这是一个高级计算环境,在Busybox Linux系统的顶部具有完整的WebBrowser。唯一的例外是系统的系统内存数量有限。

我们的应用程序内置在JavaScript中,并在基于WebKit的WebBrowser中运行,并由许多按顺序加载的JavaScript模块组成(这不是很高效)。

一些模块提供了多个模块使用的共同功能。我们正在使用RequireJS转换当前的JavaScript加载程序,但是我们必须先解决一个特定的需求。

使用requienjs加载时,是否可以卸载该模块?假设我们使用:

require(["somemodule.js"], function(m) { m.run(); } );

这在加载和运行“ somemodule”方面非常有效,还可以解决“ somemodule”的所有依赖项,并且requirejs框架将存储对“ somemodule”的参考,以供将来的请求。

如果我们在某个时候需要回收内存,例如能够加载和运行无限数量的模块,则一段时间后我们必须开始删除其中的一些模块。启用js在没有更改内部实现的情况下可能会有可能吗?

以前有人处理过这种问题吗?大多数单页JS应用程序在台式PC上的WebBrowser中运行,其中存储器使用通常不是主要问题。

有帮助吗?

解决方案

requirejs没有内置的卸载功能,但可以添加它作为您可以在其中构建的附加部分。如果您想拥有该功能,请随时提出建议 邮件列表 或作为一个 Github问题.

如果您想试验以查看是否有助于您的情况,那么您需要做的就是以下操作:

1)从requirejs模块缓存中删除定义的模块。如果您不使用Multiversion支持,则可以做类似的事情:

var context = require.s.contexts['_'];
delete context.defined[moduleName];
delete context.specified[moduleName];
delete context.loaded[moduleName];

2)然后,您可以尝试删除脚本标签,以查看是否有帮助:

var scripts = document.getElementsByTagName('script');
for (var i = scripts.length - 1; i >= 0; i--) {
    var script = scripts[i];
    if (script.getAttribute('data-requiremodule') === moduleName) {
        script.parentNode.removeChild(script);
        break;
    }
}

请注意,如果另一个模块通过定义其他模块的闭合函数(){}来固定另一个模块,则可能不会收集该模块。该其他模块也需要删除。

您可以尝试通过不作为函数参数传递模块来限制这种影响,而是只需在要掌握依赖模块的情况下,就可以在功能定义中使用(“ somemodule”)价值太长。

另外,在上面的示例中,对于使用require.def来定义自己的模块,它应该像这样(没有.js后缀):

require(["somemodule"], function(m) { m.run(); } );

其他提示

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top