jQuery 1.7 +,AMD(RequireJS)和全球范围

时间:2012-01-07 06:06:06

标签: jquery requirejs amd

我正在尝试与AMD进行更多的合作,而且我在jQuery源代码中遇到过一些我不太喜欢的东西。

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

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

从我所看到的,AMD的一个主要观点是保持全球范围的清洁。然而,jQuery选择将对自身的引用作为模块返回,但仍会感染全局空间。

在我看来,添加“jQuery.noConflict();”就在返回之前解析它并仍然将对象作为模块返回。

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

我的问题是2部分:

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

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

1 个答案:

答案 0 :(得分: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'别名而不是仅引用代理中的完全限定位置的原因是因为我使用的是支持AMD的分支机构,它依赖于这个别名:

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

作者已经接受了Document Cloud的一些提交,并且希望这个修改也被吸引。

有趣的是,看看AMD测试中是否存在任何此类或其他答案的缺陷。