首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在RequireJS中动态要求,得到“模块名称尚未加载上下文”错误?

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

Stack Overflow用户
提问于 2013-07-03 19:33:24
回答 2查看 114.9K关注 0票数 61

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

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

代码语言:javascript
复制
define([], function () {
    return ['moduleA', 'moduleB']; // Array of module names
});

另一个模块将基于数组动态加载模块。这将不起作用

代码语言:javascript
复制
define(['dyn_modules'], function (dynModules) {
    for(name in dynModules) {   
        var module = require(path); // Call RequireJS require
    }

    // ...
});

..。给了我:

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

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

代码语言:javascript
复制
define(['dyn_modules', 'moduleA', 'moduleB'], function (dynModules) {
    for(name in dynModules) {   
        var module = require(path); // Call RequireJS require
    }

    // ...
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-03 21:05:18

限制涉及简化的CommonJS语法与正常的回调语法:

由于下载模块的时间未知,因此加载模块本质上是一个异步过程。但是,模拟服务器端CommonJS规范的RequireJS试图为您提供一种简化的语法。当你这样做的时候:

代码语言:javascript
复制
var foomodule = require('foo');
// do something with fooModule

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

代码语言:javascript
复制
var module = require(path); // Call RequireJS require

...then Require无法将其解析出来并自动转换。解决方案是转换为回调语法;

代码语言:javascript
复制
var moduleName = 'foo';
require([moduleName], function(fooModule){
    // do something with fooModule
})

考虑到上述情况,这里是使用标准语法的第二个示例的一种可能重写:

代码语言:javascript
复制
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可以简化上面通过参数数组的循环。

票数 73
EN

Stack Overflow用户

发布于 2013-07-03 21:06:30

自言自语。从RequireJS网站:

代码语言:javascript
复制
//THIS WILL FAIL
define(['require'], function (require) {
    var namedModule = require('name');
});

这会失败,因为在调用上面的工厂函数之前要求to需要确保加载并执行所有的依赖项。..。因此,要么不传入依赖项数组,要么如果使用依赖项数组,则列出其中的所有依赖项。

我的解决方案是:

代码语言:javascript
复制
// 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'
    };
});

加载器:

代码语言:javascript
复制
define(['jade', 'lodash', 'config'], function (Jade, _, Config) {
    var deps;

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

        // Use deps...
    });
});
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17446844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档