当前位置: 首页 > 面试题库 >

RequireJS中的动态require,是否出现“尚未为上下文加载模块名称”错误?

冀俊良
2023-03-14
问题内容

有没有一种方法可以定义一个在RequireJS中“动态”加载其他模块的模块?如果是,优化器(r.js)如何理解如何/何时必须包含一个模块?

例如,让dynModules一个定义名称/路径对的模块:

define([], function () {
    return ['moduleA', 'moduleB']; // Array of module names
});

另一个模块将基于该阵列动态加载模块。这将 不起作用

define(['dyn_modules'], function (dynModules) {
    for(name in dynModules) {   
        var module = require(path); // Call RequireJS require
    }

    // ...
});

… 给我:

未捕获的错误:尚未为上下文_加载模块名称“ moduleA”。使用require([])
http://requirejs.org/docs/errors.html#notloaded

我可以 解决错误 ,但是它不再是“动态的”:

define(['dyn_modules', 'moduleA', 'moduleB'], function (dynModules) {
    for(name in dynModules) {   
        var module = require(path); // Call RequireJS require
    }

    // ...
});

问题答案:

该限制与简化的CommonJS语法和常规回调语法有关:

由于下载模块的时间未知,因此加载模块本质上是一个异步过程。但是,在服务器端CommonJS规范的仿真中,RequireJS试图为您提供简化的语法。当您执行以下操作时:

var foomodule = require('foo');
// do something with fooModule

幕后发生的事情是RequireJS正在查看函数代码的主体,并解析出您需要’foo’并在函数执行之前加载它。但是,当变量或除简单字符串以外的任何内容(例如您的示例)…

var module = require(path); // Call RequireJS require

…然后Require无法解析出来并自动将其转换。解决方案是将转换为回调语法。

var moduleName = 'foo';
require([moduleName], function(fooModule){
    // do something with fooModule
})

鉴于以上所述,这是您的第二个示例可能的重写,以使用标准语法:

define(['dyn_modules'], function (dynModules) {
    require(dynModules, function(){
        // use arguments since you don't know how many modules you're getting in the callback
        for (var i = 0; i < arguments.length; i++){
            var mymodule = arguments[i];
            // do something with mymodule...
        }
    });

});

编辑:从您自己的答案,我看到您正在使用下划线/破折号,因此使用_.values_.object可以简化上述遍历参数数组的循环。



 类似资料:
  • 有没有办法定义一个模块,在 RequireJS 中“动态”加载其他模块?如果是,优化器(r.js)如何理解如何/何时必须包含模块? 例如,让<code>dynModules</code>定义名称/路径对的模块: 另一个模块将根据数组动态加载模块。这将不起作用: ...给了我: 未捕获的错误:尚未为上下文加载模块名“moduleA”:_。使用必需的([])http://requirejs.org/d

  • 问题内容: 我正在尝试建立反应的单元测试框架。这样做时,发生以下错误。我搜索了整个互联网,但没有有效的解决方案。下面是显示的错误和我正在使用的代码/软件包。 调试错误 节点包 karma.conf.js 测试/ test.js 非常感谢您的帮助! 问题答案: 当您以CommonJS形式()而不是AMD形式()进行调用时,您所描述的错误正是RequireJS给您的, 并且 调用没有被封装进来。Req

  • 我对RequireJS非常陌生,在编写QUnit到源代码时遇到了困难,源代码具有使用RequireJS动态加载模块的逻辑。 下面是源代码:factory/Factory.js * 运行 QUnit 时,模块“page/something”永远不会加载,并且永远不会调用回调。我在这里错过了什么吗?感谢您的回复。 **QUnit工厂/FactoryTests.js* *test-require-con

  • 函数名称:加载模块 函数名称:加载模块 函数方法 bool = require(modle) 参数 类型 必填 说明 modle string 是 需要加载的模块名称 返回值 说明 bool 模块返回值 函数用例 --加载 lua 文件 --如果要加载 ceshi.lua 文件代码如下 require("ceshi") 注意事项 加载文件和被加载文件存放在相同脚本文件夹下才能调用成功,否则会提示

  • 我是OSGi概念的新手,对于下面的错误,我非常感谢您的帮助。 当运行独立应用程序时没有问题,但是当同一个应用程序放在OSGI包中时,我们得到以下错误。 原因异常java.lang.运行时异常:无法实例化解析器org.apache.xerces.parsers.SAXParser:java.lang.类org.apache.xerces.parsers.SAXParser无法转换为类org.xml.

  • 所以我有一个项目,在其中我使用Spring boot,并希望利用一个模块系统。我希望模块系统能够动态地重新加载。我让它几乎可以工作,但是@ComponentScan在模块中完全不工作。 有一个模块文件夹,包含启动时加载的jar文件,需要动态卸载、加载和重新加载。 模块通过AnnotationConfigApplicationContext创建,上下文的类加载器设置为核心的类加载器,模块接口中的方法