Javascript RequireJS-动态加载模块

Javascript RequireJS-动态加载模块,javascript,dynamic,module,requirejs,Javascript,Dynamic,Module,Requirejs,我目前是RequireJS的初学者,我对AMD的概念有点麻烦,尤其是RequireJS定义它的方式 我的目标是构建一个智能加载程序来调用他需要的特定解析器 总结一下我的需要: (A) 我创建我的加载器:新加载器(源) (B) source表示要加载的数据。这是一个简单的字符串 (C) 将创建一个加载程序对象。它执行一些算法来决定使用哪种解析器最好。最后,它从远程位置下载解析器。最后,它动态加载解析器 我的问题是:如何在没有在define中明确说明的情况下加载模块/插件?我无法在define(

我目前是RequireJS的初学者,我对AMD的概念有点麻烦,尤其是RequireJS定义它的方式

我的目标是构建一个智能加载程序来调用他需要的特定解析器


总结一下我的需要:

(A) 我创建我的加载器:新加载器(源)

(B) source表示要加载的数据。这是一个简单的字符串

(C) 将创建一个加载程序对象。它执行一些算法来决定使用哪种解析器最好。最后,它从远程位置下载解析器。最后,它动态加载解析器



我的问题是:如何在没有在define中明确说明的情况下加载模块/插件?我无法在define([TheParser here])中设置它,因为我无法知道需要哪个解析器。

require函数听起来好像可以用于您的目的。它允许加载模块,但不定义新模块

加载程序可以调用如下函数,以便在需要时动态加载模块:

function loadParser(name, fn) {
    require(["parsers/" + name], fn);
}
name
将是解析器的名称或路径或其他内容(注意,我的路径只是一个示例),而
fn
是加载完成后要调用的回调。函数的第一个参数是加载的模块

此函数可以放在加载器对象中,也可以放在定义中:

define(function () {

    function Loader(text) {
        this.text = text;

        this.parser = null;
        this.loadParser();
    }

    Loader.prototype.loadParser = function () {
        var self = this;
        var parserName = this.getParserName();
        require(["parsers/" + parserName], function (Parser) {
            self.parser = Parser;
            self.parse();
        });
    }

    Loader.prototype.getParserName = function () {
        //mystery logic to determine language...
        return "some-parser-name";
    }

    Loader.prototype.parse = function () {
        if (!this.parser) {
            throw "No parser loaded";
        }
        //do your parsing logic...
    }

    return Loader;

});

现在,如果我真的这样做,我会使用
Q
或jquery deferreds或其他方法来解析
require
回调函数中的解析器,而不是所有的函数调用。

谢谢你的回答。JQuery帮助我解决问题:)