2012-09-04 48 views
17

請requireJs不能重新加載jQuery我正在編寫一個腳本,意在嵌入到第三方網站以向其添加功能。我最近撕掉了我相當混亂的定製加載器代碼,並開始用requirejs替換它。其中一個有選擇性地爲我加載的庫(取決於傳入的一些參數)是jQuery。如果已經在第

這很好,直到我的腳本被包含在jQuery已經在的頁面上,在這種情況下,似乎發生的情況是部分插件部分加載,requirejs在頁面版本上加載jQuery,並且插件立即中斷。

要求客戶端重寫他們的頁面只是爲了使用這個腳本是不可能的,所以我想要做的是檢測jQuery是否已經加載,如果是,請跳過通過requirejs加載它,然後使用已經加載了一個(這可能會讓我碰到奇怪的邊緣情況和錯誤,當他們使用jQuery的老版本,但我沒有太多選擇)。

我以爲我會做的是寫一個新的模塊,它會先看看是否加載jQuery,如果是,只導出jQuery對象,如果不是,然後加載它,然後執行導出。然而,由於模塊的定義函數似乎需要與工作同步,因此我似乎很困難,所以我無法卸載並加載另一個腳本,這將是異步的,然後將導出填充到requirejs中。

我在文檔中丟失了什麼嗎?我試圖做不到?

+0

它會幫助[同時加載兩個不同版本的jQuery](http://stackoverflow.com/q/1566595/33732)? –

+0

這將解決版本控制問題。但是,這似乎並不能解決插件的踐踏問題,因爲頁面版本可能會在我的之前加載,而且沒有noconflict。我想我可以修改我服務的jQuery版本,不要踐踏$/jQuery對象,只是將自己暴露爲一個模塊,但我寧願將它作爲最後的手段,因爲那樣我就不得不記住要做到這一點當我更新jQuery時更改。 –

+1

這應該不重要。只有一個庫需要注意不衝突模式。當你在你的jQuery副本上調用'noConflict'時,$'和'jQuery'的值會從加載副本之前恢復到原始文件。使用原始實例的插件將繼續引用它。原來的jQuery實例會認爲它是唯一的,這很好。 –

回答

26

我對類似項目有同樣的問題,使用require.js打算在第三方網站上加載庫。你可以看到我的做法here,但這裏的簡化版本:

// check for existing jQuery 
var jQuery = window.jQuery, 
    // check for old versions of jQuery 
    oldjQuery = jQuery && !!jQuery.fn.jquery.match(/^1\.[0-4](\.|$)/), 
    localJqueryPath = libPath + 'jquery/jquery-1.7.2.min', 
    paths = {}, 
    noConflict; 

// check for jQuery 
if (!jQuery || oldjQuery) { 
    // load if it's not available or doesn't meet min standards 
    paths.jquery = localJqueryPath; 
    noConflict = !!oldjQuery; 
} else { 
    // register the current jQuery 
    define('jquery', [], function() { return jQuery; }); 
} 

// set up require 
require.config({ 
    paths: paths 
}); 

// load stuff 
require(['jquery', ... ], function($, ...) { 

    // deal with jQuery versions if necessary 
    if (noConflict) $.noConflict(true); 

    // etc 

}); 

正如你所看到的,這看起來jQuery的,然後無論是「jQuery的」模塊定義爲現有的庫,或包裝(如沒有jQuery或現有jQuery是舊版本)以noConflict加載特定於庫的jQuery。

這工作得很好。唯一的缺點是您在腳本中動態調用require(),這使得有效使用r.js優化器變得更加困難。

+0

不錯的代碼。但舊的jQuery正則表達式不適用於jQuery> = 1.10。 – Chris

+1

謝謝,@Chris - 更新了正則表達式。 – nrabinowitz

+0

我在這裏有一個類似的問題http://stackoverflow.com/questions/20291793/adding-requirejs-module-that-uses-jquery-on-a-page-that-already-has-jquery-as-a。你如何不使用API​​中建議的'map'?如果你想爲另一個模塊加載第三版jQuery,你會怎麼做? – gillyspy

3

我有一個類似的問題。我的劇本是重裝的jQuery兩次..用於從註釋中求解this article

工作就像一個魅力!

(評論這是工作:

「我把它放在我的配置文件中的requirejs.config後(...)和 前requirej([」 應用 「])和它的工作」 )

+1

比接受的答案簡單得多 – LostInComputer