我正在测试各种异步资源加载器,看看我想要使用哪一个。目前Curl正在抛出'承诺已经完成'错误......他们的文档说“这绝不应该发生”。
我“怀疑”我必须在每个正在加载的文件中使用'define'(希望不是)。此外,他们的文档说Curl可以使用非AMD的JavaScript文件。但是......我是AMD的新手,因为Curl 远远快于我正在测试的其他人 ......我愿意花些时间更好地理解这一点。
最后...
即使FireBug显示错误......所有文件仍然异步加载!但是,由于存在错误......代码的“然后”部分永远不会被调用。
所以我的问题是:
Head的代码如下所示:
<script type="text/javascript">
///<summary>Configuration</summary>
curl = { baseUrl: 'Includes/JavaScript/' };
</script>
<script src="Loaders/Curl/curl.js" type="text/javascript"></script>
<script type="text/javascript">
function onSuccess() {
}
function onError(ex) {
//alert(ex);
}
require(["MooTools/Core/mootools-1.2.2-core-jm",
"MooTools/mGeneral",
"jQuery/Core/jquery-1.3.2",
"jQuery/Core/jquery.tools.min",
"jQuery/ThirdPartyPlugIns/jquery.tmpl"])
.then(onSuccess, onError);
//require(["jQuery/TopUp/top_up-min"], null);
require(["jQuery/ThirdPartyPlugIns/jquery.dimensions",
"jQuery/ThirdPartyPlugIns/jQuery.Color.Animations",
"jQuery/ThirdPartyPlugIns/jquery.corners.min",
"jQuery/ThirdPartyPlugIns/jquery.tipsy",
"jQuery/ThirdPartyPlugIns/jquery.numberformatter-1.1.0",
"jQuery/ThirdPartyPlugIns/jquery.tipsy"]);
require(["general",
"WindowCenter",
"ThirdPartyPlugin/KeyBoardCapture",
"ThirdPartyPlugin/bsn.AutoSuggest_2.1.3",
"ee/8Ball",
"ee/EE"]);
</script>
再次......我确定这是由于缺乏AMD风格代码的经验造成的,但我仍然需要帮助...所以我们都很感激。 < / p>
答案 0 :(得分:1)
通常,如果这些模块没有依赖关系,您应该将模块包装在define()
中或在文件末尾附加define()
。但是,似乎这些模块都依赖于jQuery,如果不是其他模块/文件。
由于您没有使用标准的AMD require()
/ define()
协议,因此AMD并没有真正帮助您使用这些模块。除非您打算使用define()
编写自己的模块,否则您可以使用任何异步加载器。
也就是说,有一种方法可以使curl.js与非AMD模块/文件一起工作。使用js!插入。这是您翻译为使用js的第一个文件块!插件(注意我还添加了“.js”ext,我喜欢使用非模块):
// we load the core files first, then get the next block that depends on them
curl([
"js!MooTools/Core/mootools-1.2.2-core-jm.js",
"js!jQuery/Core/jquery-1.3.2.js"
]).next([
"js!MooTools/mGeneral.js",
"js!jQuery/Core/jquery.tools.min.js",
"js!jQuery/ThirdPartyPlugIns/jquery.tmpl.js"
]).then(onSuccess, onError);
如果每个数组中的任何文件相互依赖,您还可以在它们上使用!order后缀,以确保它们在执行/评估之前等待其他文件(但请确保您正在设置正确的缓存标头) 。实际上,只要没有缓存问题(移动浏览器在文件大小上添加一些额外的约束),!order后缀是最快的方法。
是否有其他错误消息?具体来说,我希望curl.js除了“Promise not completed”之外至少抛出一个错误。
另外,请检查网络标签(Firebug)或网络标签(Chrome),检查curl.js是否在模块的正确位置。
FWIW,我打算删除别名require
- &gt; curl
。原因是全局require
功能是非标准的(并且在AMD提案中明确没有标准化)。我建议您使用curl()
代替require()
。
curl.js还允许它的顶级api通过“apiName”配置参数显式别名,如果你真的想要使用名称“require”。 :)
<script>curl = { apiName: "require" }; </script>
<script src="path/to/curl.js"></script>
<script>require(["some/modules"]).then(success, failure);</script>
更多FWIW:标准require
通常只在模块中需要,可以通过将其包含为依赖项来请求:
define(["require"], function (require) {
require(["another/module"], function (another) {
// use another module here
});
});
- 约翰
答案 1 :(得分:0)
如果您只进行正常的javascript文件加载(不是模块),我会鼓励您查看LABjs(http://labjs.com)。 LABjs专注于成为性能最优化的加载解决方案(排除其他一些功能,如模块/依赖样式的东西)。
事实上,LABjs 2.0a(https://github.com/getify/LABjs/blob/master/next/LAB.src.js)将在未来几天内完全发布,在并行加载通用脚本时非常快(甚至超过1.2)。我鼓励你试一试,除非(正如John上面提到的那样)你打算去模块语法......然后坚持使用Curl或RequireJS。