2013-05-08 50 views
0

爲什麼在requirejs模塊中傳遞對jQuery的引用是可選的?例如,考慮使用不同版本的拳頭線爲什麼在require/AMD模塊中傳遞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']依賴關係?

那麼,爲什麼它是可選的,更重要的是,這是最佳實踐?

// EDIT

抱歉,意味着添加配置細節

require.config({

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

});

回答

1

它不應被認爲是「可選」。始終將AMD模塊的結果綁定到參數。

正在發生的事情是,jQuery是通過AMD在這種情況下加載所以還是則會覆蓋window.$時不調用noConflict。這就是爲什麼它「起作用」,即使它沒有綁定到$參數。

推測的AMD墊片(或模塊)將在end of the source file調用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,所以我需要通過$作爲參數綁定來訪問它。

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

相關問題