2014-01-25 23 views
0

我正在一個擁有大量遺留代碼的大型網站上工作。內聯腳本,舊庫等等。這是我無法刪除的東西,因爲它被用在很多頁面上,但我們正朝着一個新的方向前進。需求,牽線木偶和骨幹。我不能把我們所有的數千行代碼重構它們。反正不是。所以,同時,我們會有一個雙頭怪物。遺產代碼的方式,主幹中的新代碼,木偶,requirejs應用程序。加載jquery的兩個版本,一個需要,一個只在普通的老頭裏

我的問題是在我當前的,非常基本的,基於requirejs的設置中加載jquery。我有jquery v1.9.1在require之前加載,但它似乎與從頭部加載的不同版本的jquery(1.7.2)相沖突。在全網範圍內,附加到舊版jQuery的所有功能(例如基於twitter bootstrap的jquery插件等)似乎都被我用require加載的jquery版本消滅了。我的猜測是shim,它加載了jQuery之前任何基於需求的代碼,據我瞭解反正,正在殺死我的舊jQuery對象。

我該如何避免這種情況?如何讓我的新版本的jquery包含到require.js對象中,而不會干擾舊的遺留代碼?

非常感謝。如果需要,可以提供代碼細節,但我希望這裏我想要做的事情的概念足夠清楚。

回答

0

您是否嘗試過的jQuery.noConflict例如...

<script src='jquery-1.3.2.js'></script> 
<script> 
var jq132 = jQuery.noConflict(); 
</script> 
<script src='jquery-1.4.2.js'></script> 
<script> 
var jq142 = jQuery.noConflict(); 
</script> 
0

的網站RequireJS documents的方法來配置的jQuery與noConflict加載。此方法允許您像通常那樣要求jQuery爲"jquery",即使您沒有使用noConflict也是如此。該配置如下(報價直接從DOC):

require.config({ 
    // Add this map config in addition to any baseUrl or 
    // paths config you may already have in the project. 
    map: { 
     // '*' means all modules will get 'jquery-private' 
     // for their 'jquery' dependency. 
     '*': { 'jquery': 'jquery-private' }, 

     // 'jquery-private' wants the real jQuery module 
     // though. If this line was not here, there would 
     // be an unresolvable cyclic dependency. 
     'jquery-private': { 'jquery': 'jquery' } 
    } 
}); 

而且jquery-private模塊如下(也由DOC直引號):

// and the 'jquery-private' module, in the 
// jquery-private.js file: 
define(['jquery'], function (jq) { 
    return jq.noConflict(true); 
}); 

加載這種方式,版本你要求RequireJS加載的jQuery不應該打亂任何其他的jQuery版本。但是,存在一個重要問題:RequireJS加載的任何東西以及需要訪問由RequireJS加載的jQuery版本的東西都必須是AMD模塊(即,它必須使用define並且在其依賴關係中使用"jquery"列出)​​。否則,它將使用在RequireJS之前加載的jQuery版本。而只有一個版本的jQuery被加載時,你可以在RequireJS的配置中使用shim來獲得這樣的軟件加載,如果你使用上面的方法,一個填充將不會在這裏剪切它。

line骨幹,例如,是有問題的:

Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$; 

所以你不得不修改骨幹把自己定義爲一個AMD模塊或找到一個版本,已經有人打包。 (像一個here。)

+0

優秀。這完全幫助我瞭解如何解決我的問題。我拿出我的jQuery Shim,用無衝突映射的方法將它加載到我的模塊中,現在我得到了一個不同於我的舊版jQuery的版本。大。謝謝您的幫助。 –

+0

就這樣我理解 - 如果要在js中加載一個修改我的無衝突jquery對象(例如twitter的bootstrap js插件)的requirejs模塊,我必須得到一個AMD版本,以便它可以引用no加載時衝突的jquery對象,是否正確?一個填充只會引用舊的jquery對象,並且新方法在我定義的模塊(骨幹視圖)中不可用,對嗎? –

+0

是的,你的理解是正確的。 – Louis

相關問題