当前位置: 首页 > 知识库问答 >
问题:

在RequireJS中动态要求,获取“模块名称尚未加载上下文”错误?

岳锦
2023-03-14

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

例如,让<code>dynModules</code>定义名称/路径对的模块:

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”:_。使用必需的([])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
    }

    // ...
});

共有2个答案

楚勇
2023-03-14

回答我自己。来自需求JS网站:

//THIS WILL FAIL
define(['require'], function (require) {
    var namedModule = require('name');
});

这将失败,因为requirejs需要确保在调用上面的工厂函数之前加载并执行所有依赖项。[...]所以,要么不要传入依赖关系数组,要么如果使用依赖关系数组,列出其中所有的依赖关系。

我的解决方案:

// Modules configuration (modules that will be used as Jade helpers)
define(function () {
    return {
        'moment':   'path/to/moment',
        'filesize': 'path/to/filesize',
        '_':        'path/to/lodash',
        '_s':       'path/to/underscore.string'
    };
});

加载程序:

define(['jade', 'lodash', 'config'], function (Jade, _, Config) {
    var deps;

    // Dynamic require
    require(_.values(Config), function () {
        deps = _.object(_.keys(Config), arguments);

        // Use deps...
    });
});
牟恺
2023-03-14

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

    < Li > http://require js . org/docs/why amd . html # commonjscompat < Li > https://github . com/Jr Burke/require js/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define

由于下载模块的时间未知,加载模块本质上是一个异步过程。但是,在模拟服务器端通用JS规范时,要求JS试图为您提供简化的语法。当你做这样的事情时:

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

});

编辑:从您自己的回答中,我看到您使用了下划线/下划线,所以使用了_。值_。object可以简化通过参数数组的循环,如上所述。

 类似资料:
  • 问题内容: 有没有一种方法可以定义一个在RequireJS中“动态”加载其他模块的模块?如果是,优化器(r.js)如何理解如何/何时必须包含一个模块? 例如,让一个定义名称/路径对的模块: 另一个模块将基于该阵列动态加载模块。这将 不起作用 : … 给我: 未捕获的错误:尚未为上下文_加载模块名称“ moduleA”。使用require([]) http://requirejs.org/docs/

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

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

  • 问题内容: 可以正常工作,但是想要像这样测试开发分支: 不知道这是怎么回事?如果我做得到相同的结果 问题答案: 所需的软件包具有依赖关系。在1.3.3版中,他们开始使用不带版本后缀的go模块,现在明确指示该版本不再起作用。 如果要在不更新其依赖项的情况下使用devel包,请使用不带标志。 存储库中有关于此问题的公开拉取请求:https : //github.com/gdamore/tcell/pu

  • 问题内容: 我在构建ORM库时要考虑到重用和简单性。一切都进行得很好,除了我被愚蠢的继承限制所困。请考虑以下代码: 显然,这不是我所期望的行为(尽管实际行为也很有意义)。因此,我的问题是,你们是否知道在父类中获得子类名称的意思。 问题答案: 简而言之。这不可能。在php4中,您可以实施可怕的破解(检查),但是该方法在PHP5中不起作用。参考资料: 37684 34421 编辑 :PHP 5.3中后

  • 问题内容: 我正在尝试动态加载我创建的模块。 现在这可以正常工作: 但是,如果我通过动态导入尝试相同的操作,它将失败。 提供的错误是: 有什么想法吗? 编辑:使用完整范围时(它的工作原理?): 这不会引发任何错误,但是,它不会加载索引模块,而是会加载“ neoform”模块。 “ struct”的结果是: 另外,作为附带的问题,我该如何在动态加载的模块中实例化一个类?(假设所有模块都包含一个通用的