4

我目前正在测试各种异步资源加载器,看看我想使用哪一个。目前,Curl抛出一个“<strong>Promise 已经完成”错误……他们的文档说“这永远不会发生”。

我“怀疑”我必须在每个正在加载的文件中使用“定义”(希望不是)。此外,他们的文档说 Curl 可以使用非 AMD javascript 文件。但是……我是 AMD 的新手,因为Curl比我正在测试的其他产品快得多……我愿意花一些时间来更好地理解这一点。

最后...

即使 FireBug 显示错误......所有文件仍然异步加载!但是,因为有错误......代码的' then '部分永远不会被调用。

所以我的问题是:

  • 我是否必须更新要包含在“定义”中的所有 JavaScript 文件对象?(...希望不是)
  • 你能在语法上看到任何其他问题吗?

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 风格的代码缺乏经验造成的,但我仍然需要帮助...所以任何人都会受到赞赏。

4

2 回答 2

1

通常,如果这些模块没有依赖关系,您应该将模块包装在 a 中define()或在文件末尾附加 a 。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 除了“承诺未完成”之外至少会引发一个错误。

此外,请检查 Net 选项卡 (Firebug) 或 Network 选项卡 (Chrome) 以检查 curl.js 是否在正确的位置查找模块。

FWIW,我打算删除别名require--> curl。原因是全局require函数是非标准的(并且在 AMD 提案中明确没有标准化)。我建议你使用curl()而不是require().

如果您真的非常想使用名称“require”,curl.js 还允许通过“apiName”配置参数显式地为其顶级 api 设置别名。:)

<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
    });
});

- 约翰

于 2011-05-19T14:36:50.500 回答
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。

于 2011-05-19T18:18:37.033 回答