代码之家  ›  专栏  ›  技术社区  ›  Ernelli

当需要移除模块以节省内存时,是否可以使用requirejs

  •  16
  • Ernelli  · 技术社区  · 14 年前

    我们的应用程序是用JavaScript构建的,运行在基于Webkit的webbrowser中,由许多按顺序加载的JavaScript模块组成(这不是很有效)。

    一些模块提供多个模块使用的通用功能。我们正在使用requirejs转换当前的javascript加载程序,但是有一个特定的需求我们必须首先解决。

    使用requirejs加载模块后,是否可以卸载模块?假设我们使用以下方法动态加载模块:

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

    这对于加载和运行'somemodule'以及解析'somemodule'的所有依赖项都很有效,requirejs框架将存储对'somemodule'的引用以供将来的请求使用。

    如果我们在某个时候需要回收内存,例如为了能够加载和运行无限多的模块,我们必须在一段时间后开始删除其中的一些模块。在不改变内部实现的情况下,requirejs是否可以这样做?

    2 回复  |  直到 14 年前
        1
  •  17
  •   jrburke    14 年前

    RequireJS没有内置的unload特性,但是它可以作为一个额外的部分添加进来。如果你想拥有这个功能,请随时提出 the mailing list GitHub issue .

    1) 从RequireJS模块缓存中删除定义的模块。如果不使用多版本支持,可以执行以下操作:

    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;
        }
    }
    

    请注意,如果另一个模块通过定义另一个模块的闭包函数(){}保留该模块,则该模块可能不会被垃圾收集。另一个模块也需要拆除。

    您可以尝试通过不将模块作为函数参数传入来限制这种影响,但只要在函数定义中使用require(“somemodule”),就可以获得依赖模块,并且不要将require返回值保留太久。

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

    require(["somemodule"], function(m) { m.run(); } );
    
        2
  •  2
  •   Steen    11 年前