2

我正在尝试与 AMD 保持一致,并且我在 jQuery 源代码中遇到了一些我无法完全理解的东西。

这是部分(在文件末尾之前找到):

if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
    define( "jquery", [], function () { return jQuery; } );
}

据我所知,AMD 的一大重点是保持全局范围的清洁。然而 jQuery 选择以模块的形式返回对自身的引用,但仍会感染全局空间。

在我看来,添加“jQuery.noConflict();” 就在 return 将解决此问题并仍将对象作为模块返回之前。

我知道 RequireJS 有一些专门用于 jQuery 的特殊文件,但我不确定 1.7+ 是否需要它。

我的问题是两部分:

1)有谁知道为什么做出这个决定?

2) 由于这种方法对升级不友好,有没有人熟悉使用标准版 RequireJS 和 jQuery 的更优雅的解决方案?

4

1 回答 1

3

好的,在发布之后,我才意识到我可以通过另一个文件代理它:

//main.js
require.config({
    paths : {
    jquery : 'my/libs/jquery-1.7.1.min',
    jQuery : 'my/src/jquery'
}

//my/src/jquery.js

define([
        'jquery'
    ],
    function($) {
        $.noConflict(true);

        return $;
    }
);

主文件的“jquery”别名而不是仅引用代理中的完全限定位置的原因是因为我正在使用依赖于此别名的 Backbone 的 AMD 就绪分支:

https://github.com/jrburke/backbone/blob/2b0cfb4282f071cffb14a9573d703da6acc5febd/backbone.js

作者已经接受了 Document Cloud 的一些提交,并希望这种修改也能被纳入。

看看这是否有任何缺陷或者从 AMD 战斗测试中可能有什么额外的答案将会很有趣。

于 2012-01-07T06:45:41.710 回答