2012-01-07 70 views
2

我试图得到更多符合W/AMD的,我碰到过jQuery源代码的东西,我只是不能完全承认。jQuery 1.7+,AMD(RequireJS)和全局范围

下面是部分(只在文件结束前找到):

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的更优雅的解决方案?

+0

http://stackoverflow.com/questions/4858431/use-requirejs-and-jquery-without-clobbering-global-jquery/9593868#9593868 – 2012-03-07 00:14:26

回答

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测试的测试结果会有什么额外的答案会很有趣。

+0

你如何处理jQuery插件与此设置?我认为他们在全球范围内离开美元的原因是他们的插件(他们最大的优势)不是为AMD设计的,它仍然有效。 – nicholas 2012-03-30 18:56:37

+1

有没有办法使$本地和仍然使用插件? – ThomasReggi 2013-03-22 16:14:08

+0

你有没有看过[对非AMD库的Shim支持](http://requirejs.org/docs/api.html#config-shim)?当这个问题最初发布时,这是不可用的。所以也许这个功能会做到这一点。不过,我还没有测试过它。 – 2013-03-25 16:46:36