2012-08-27 46 views
9

編輯,以澄清:用RequireJS加載jQuery - 哪個更好,本地版本還是CDN?

性能(雖然這仍然是一個野生來看,我知道),這是更好的條件 - 加載本地版本,或jQuery的的CDN版本,在RequireJS?

爲了記錄在案,RequireJS online doc包含一些通道似乎CDN使用勸阻,但我真的不知道意味着什麼100%:

不要在構建墊片配置混合CDN負載。示例方案: 您從CDN加載的jQuery但使用墊片配置加載的東西 像股票版本骨幹依賴於jQuery的。當您執行 構建時,請務必在構建的文件中內聯jQuery,並且不要從CDN加載 。否則,Backbone將被內聯在構建文件 中,並且它將在加載CDN的jQuery之前執行。這是 ,因爲shim配置只是延遲加載文件,直到加載了 依賴項,但不執行任何自定義的自動換行。 構建完成後,依賴關係已經內聯,shim config 不能延遲執行非define()的d代碼,直到稍後。 限定()'d模塊也與CDN加載代碼的生成,因爲他們 妥善包裝的根源在於定義,直到依賴被加載,這將 不執行出廠功能後工作。所以課程:shim config 是針對非模塊化代碼,遺留代碼的一種權宜之計。 define()'d模塊更好。

從理論上講,使用CDN jQuery文件會導致多出1個HTTP請求(不能與使用r.js的其他JS文件合併),但有可能使您的訪問者緩存CDN來自其他網站的版本。

但是,如果我這樣做是正確的Google搜索信息,你仍然需要提供本地的jQuery複製到r.js,所得到的精縮JS文件仍然需要包含了jQuery的副本模塊來確保依賴性的一致性。這將導致通過本地和CDN加載jQuery。 (希望我得到這個部分吧?)

那麼,哪種方式更好?

回答

4

它不僅是一個事實,即人們緩存文件。用戶代理只能同時加載來自同一個域的幾個文件。所以從CDN加載JS文件可以確保文件同時加載。

這下一來,他benifit用戶已經有該文件的緩存版本。所以對於流行的文件(例如jQuery javascript),我總是會從CDN加載它。

你可以回退隨時添加到本地版本的情況下,CDN是下降無論出於何種原因。

儘管RFC規定,用戶代理應該做2所請求的最大數量的併發了大多數用戶代理時下忽略此規範。另請參見SO上的this old (2009) question。請注意,用戶代理目前做更多的請求並不會讓我感到驚訝。

+0

您是否考慮到如果他加載本地副本,它將被連接成一個signle js文件?因此,通過加載CDN版本,您將額外請求的開銷添加到另一個域... – JasonStoltz

6

答案很簡單:避免額外的HTTP請求和DNS查找

你最有可能最好使用自己的副本,讓RequireJS合併文件。換句話說,我認爲避免額外的http請求和DNS查找會更有價值。

確實,用戶可能已經在其他站點的緩存中存在該文件,但它們很可能不會。即使他們最近去過另一個站點,緩存大小通常也足夠小,以至於在正常瀏覽會話過程中,用戶可以輕鬆填滿緩存,在這種情況下,較舊的文件將被丟棄。

我想你只會真的在談論你的流量的1%,至多已經有緩存中的CDN文件,因此只有1%的用戶受益。但是,通過組合這些資源並避免額外的http請求,您將有99%的用戶受益。所以相反,如果不合並,你會傷害99%的用戶。只是看另一種方式。

另一個考慮因素是移動用戶...移動用戶有可怕的延遲,因此額外的http請求和dns查找的RTT的成本較高。

6

您的requirejs文檔引用特別針對使用具有用於jQuery的墊片配置的腳本。如果所有腳本都是AMD模塊,則從第三方CDN動態加載基本依賴關係是可以的。 (您可能認爲雅虎我沒有做過關於緩存與非緩存狀態的研究),這意味着您現在必須依賴另一個域進行加載。

好處可能取決於應用程序,分析它會導致最好的答案。例如,如果它是一個有很多圖片的網站,那麼針對jQuery的策略就不那麼重要了,因爲圖片加載可能是更明顯的性能問題。

我首先將jQuery優化到內置文件中,並使用AMD模塊處理所有事情,所以如果我想委託給CDN,我可以。但是,如果使用requirejs和shim配置,基礎依賴關係需要內置在構建文件中,因爲shimmed庫不調用define() - 它們不等待依賴加載,他們希望它們立即可用。

相關問題