为什么在require / AMD模块中传递jquery引用是可选的?

时间:2013-05-08 00:00:34

标签: javascript jquery requirejs amd

为什么在requirejs模块中传递对jQuery的引用是可选的?例如,请考虑以下代码与第一行的不同版本

define(['jquery'],function ($) {

    var initialize=function(){
        console.log($.fn.jquery);
    };

    return {
        initialize: initialize
    };

});

对于这一行,您希望console.log可以正常工作

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

'jquery'被加载并传递给后面带有$作为引用的代码

对于这一行,您会期望console.log失败

define(function () { ...

但是为什么这条线工作 - 也就是为什么console.log知道$是什么

define(['jquery'],function () {

现在我想你会说......因为你正在使用全局引用来查询$但是不是那么......不安全?如果$是全局可用的,为什么你还需要['jquery']依赖,如果你正在做这样的事情......

define(['jquery','classA','classB] ...

如果你继续......

define(['jquery','classA','classB],function(ClassA,ClassB){

那么你不必包含$引用,否则它会认为ClassA引用['jquery']依赖?

那么,为什么它是可选的,更重要的是,这是最佳实践?

//编辑

抱歉,这意味着要添加配置详细信息

require.config({

paths: {
    "jquery": "//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min"
}

});

2 个答案:

答案 0 :(得分:1)

不应该将其视为"可选"。始终将AMD模块的结果绑定到参数。

在这种情况下,当通过AMD加载jQuery时,jQuery是而不是调用noConflict,所以它仍然是clobbers window.$。这就是它"工作"即使它没有绑定到$参数。

根据end of the source file评论中的措辞,可能是AMD垫片(或模块)会调用noConflict本身:

// Do this after creating the global so that if an AMD module wants to call
// noConflict to hide this version of jQuery, it will work.

将jQuery(或任何其他模块,包括不会返回有用值的jQuery插件等)一致地绑定到参数。这将避免定义列表中的混淆和不匹配。 (使用多个版本的jQuery是有潜在危险的。)

就个人而言,我通过<script>加载jQuery并将其填充到AMD模块中,因为我喜欢控件。我还手动调用noConflict,因此我需要$作为参数进行访问。

答案 1 :(得分:0)

虽然jQuery将自己定义为AMD模块,但它也将jQuery$导出到全局命名空间(如果需要,每个模块都可以这样做,但是没有人这样做,因为这正是与模块化事物相反)。我不知道有什么优势,但似乎认为它将帮助开发人员使用混合AMD /全局代码。

以下是对jQuery的这种行为的一个很好的解释:https://github.com/cujojs/curl/wiki/Using-curl.js-with-jQuery#-and-jquery-are-still-available-as-global-variables