我目前是RequireJS的初学者,我对AMD概念有点麻烦,特别是RequireJS定义它的方式。
我的目标是构建一个智能Loader,调用他需要的特定Parser。
总结我的需求:
(A)我创建了我的加载器:new Loader( source )
(B) source 表示要加载的数据。这是一个简单的字符串。
(C)创建Loader对象。它执行一些算法来决定使用什么是最好的Parser。最终,它从远程位置下载解析器。最后,动态加载解析器。
我的问题是这样的:如何加载模块/插件而不在定义中明确它?我不能在define([theParserHere])中设置它,因为我无法知道需要哪个Parser。
答案 0 :(得分:3)
require
功能听起来像是可以用于您的目的。它允许加载模块,但不能定义新模块。
您的加载程序可以调用以下函数在需要时动态加载模块:
function loadParser(name, fn) {
require(["parsers/" + name], fn);
}
name
将是解析器的名称或路径或某物(请注意我的路径只是一个示例)并且fn
是在加载完成时调用的回调。该函数的第一个参数是加载的模块。
此函数可以放在您的加载器对象中,也可以放在define:
中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
回调函数中的解析器而不是所有函数调用。