RequireJS - 动态加载模块

4

我目前是RequireJS的初学者,对于AMD概念有些困惑,尤其是RequireJS如何定义它。

我的目标是构建一个智能加载器,可以调用需要的特定解析器。


总结我的需求:

(A) 我创建了我的加载器:new Loader(source)

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

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


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

1个回答

4

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 Deffered帮助我解决了我的问题 :) - Adrien Saunier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接