0

为什么在 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'] 依赖项?

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

// 编辑

抱歉,是要添加配置详细信息

需要.config({

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

});

4

2 回答 2

1

它不应该被认为是“可选的”。始终将 AMD 模块的结果绑定到参数。

正在发生的是,在这种情况下,通过 AMD 加载时 jQuery没有调用noConflict,所以它仍然是 clobbers window.$。这就是为什么即使它没有绑定到$参数也能“工作”的原因。

据推测,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 是有潜在危险的。)

就个人而言,我通过加载 jQuery<script>并将其填充到 AMD 模块中,因为我喜欢该控件。noConflict我也手动调用,所以我需要$通过绑定作为参数来访问它。

于 2013-05-08T05:24:39.880 回答
0

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

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

于 2013-12-01T20:41:57.063 回答