2017-07-29 32 views
1

我建立一個web應用程序和服務過來http2。然而,當我使用谷歌瀏覽器(版本59.0.3071.115(官方版本)(64位))的開發人員工具分析網絡時,顯然多路複用不起作用,因爲只有6個活動連接(如使用http1.1)其餘的連接都在排隊。谷歌Chrome瀏覽器不會做複用http2

這是爲什麼?或者我的期望不正確?

的截圖(你可以看到,協議是http2):

Chrome's network tab showing only 6 active connections with the rest queued in spite of using http2

更新#1:

  • 後端上的nginx 1.13運行;
  • 我使用的一次性加載所有腳本自定義模塊加載器(通過在循環與async屬性創建腳本標籤);
  • 截圖顯示,8號線和超越瀏覽器接收到的請求,開始下載資源而行的白色部分顯示,該腳本排隊和實際下載纔開始當插槽面世(見怎麼行8,一旦第2,3和4行完成,7和9開始加載;第11,12,13和5,6,7行也是如此)。
+1

您是否能夠通過您可以共享的最小示例重現此問題? –

+1

@FrederikDeweerdt感謝您的回覆;我無法顯示當前的環境,但我會爲此設置另一個環境,只需檢查確認問題即可。 –

回答

1

我認爲這是瀏覽器的錯誤,或至少是不必要的限制。

這是很容易進行測試。

我創建了一個簡單的例子,HTML文件,該文件下載相同的JavaScript文件的25份(以查詢參數,使它看起來像一個不同的資源):

<!DOCTYPE HTML> 
<html> 
<head> 
     <title>Test for Lots of JS files</title> 
     <meta name="robots" content="noindex"> 
<body> 
</body> 
     <h1>This is a test for Lots of JS files</h1> 

     <script src="/assets/js/test.js?v=01"></script> 
     <script src="/assets/js/test.js?v=02"></script> 
     <script src="/assets/js/test.js?v=03"></script> 
     <script src="/assets/js/test.js?v=04"></script> 
     <script src="/assets/js/test.js?v=05"></script> 
     <script src="/assets/js/test.js?v=06"></script> 
     <script src="/assets/js/test.js?v=07"></script> 
     <script src="/assets/js/test.js?v=08"></script> 
     <script src="/assets/js/test.js?v=09"></script> 
     <script src="/assets/js/test.js?v=10"></script> 
     <script src="/assets/js/test.js?v=11"></script> 
     <script src="/assets/js/test.js?v=12"></script> 
     <script src="/assets/js/test.js?v=13"></script> 
     <script src="/assets/js/test.js?v=14"></script> 
     <script src="/assets/js/test.js?v=15"></script> 
     <script src="/assets/js/test.js?v=16"></script> 
     <script src="/assets/js/test.js?v=17"></script> 
     <script src="/assets/js/test.js?v=18"></script> 
     <script src="/assets/js/test.js?v=19"></script> 
     <script src="/assets/js/test.js?v=20"></script> 
     <script src="/assets/js/test.js?v=21"></script> 
     <script src="/assets/js/test.js?v=22"></script> 
     <script src="/assets/js/test.js?v=23"></script> 
     <script src="/assets/js/test.js?v=24"></script> 
     <script src="/assets/js/test.js?v=25"></script> 

</html> 

然後我也一樣,但再次但與defer屬性

 <script src="/assets/js/test.js?v=01" async=""></script> 
     <script src="/assets/js/test.js?v=02" async=""></script> 
     ....etc. 

和相同:

加入異步屬性,如果Chrome會決定阻止下載在處理JavaScript的

/assets/js/test.js文件爲空。所以不會有執行延遲,也不會有依賴性,除了那些瀏覽器添加的。

我看到了一些有趣的結果!這些都是Chrome 60.0.3112.78或60.0.3112.101,我使用的是Apache,但看到了與Nginx相同的結果。

隨着HTTP/2服務器我們看到以下結果:

隨着純script標籤的所有腳本被並行加載(但據推測執行按順序)。有沒有6連接限制爲在HTTP/1.1: Javascript with no async or defer

隨着腳本加載在平行的6組異步script標籤 - 完全按照您注意: Javascript with async

點擊它們顯示了他們通過HTTP/2下載。

使用推遲script標記的腳本與使用異步標記的結果相同 - 一次限制6次下載。

這沒有任何意義 - Chrome會限制您的Javascript下載,但前提是您使用異步或延遲來改善您的下載阻止呈現!

正如sbordet所說,視口中的圖像不會發生同樣的情況 - 所以多重處理能夠在Chrome上工作,它似乎對異步或延遲模式的Javascript有不必要的限制。這是一個真正的限制,如果你正考慮不再使用HTTP/2捆綁腳本,許多人建議你不再需要這樣做。

不是發生在Firefox上,也不是Edge。雖然它確實發生在Opera(基於Chromium的瀏覽器)上。

所以這是個壞消息。好消息是他們「可能」修復了它。當我嘗試Chrome Canary(62.0.3190.0)時,我無法重複這種行爲。但是,當我使用金絲雀網頁測試(它給用戶代理字符串62.0.3190.1,所以應該幾乎相同),它可重複,所以不是100%肯定他們已經修復了這一切...

都提出了與Chrome團隊對這個bug,因此會看到他們在說什麼:https://bugs.chromium.org/p/chromium/issues/detail?id=757191

總而言之,HTTP/2服務器和客戶端上,則在此刻顯得有點通量,因爲雙方調整和調整它們的實現,以便從這個相對較新的協議中獲得最佳使用。儘管如此,由於谷歌以其SDPY實施(HTTP/2嚴重依賴於此)開始實施,因此您可以預計Chrome會在這種情況下領先於此,令人驚訝,因此您可以預期它們將領先於未落後的曲線......

* *更新**

Chrome團隊回來並確認這是目前在Chrome中實施HTTP/2的限制。他們看到了性能問題,因爲HTTP/2允許一次性訪問許多資產,因此不會將重要項目(包括異步/延遲和項目在視口中不可見)限制爲HTTP/1.1的極限值爲6.

甚至儘管HTTP/2在發送請求後具有優先級請求的概念,但是在優先級和發送(例如,檢查緩存,cookie等等)之前就已經看到了性能問題,所以HTTP/2優先級在這裏沒有幫助。

他們希望在將來改善這一點。

所以,我猜對了,這是一個實施問題,因爲我們習慣了新的HTTP/2世界,不得不優化我們的瀏覽器和服務器!

+1

添加了來自Chrome團隊的反饋。 –

1

Chrome在使用HTTP/2時決定限制多路複用可能有多種原因。

例如,行爲是非常不同的,當你正在下載一個網頁有大量圖片,這取決於,是否顯示圖像或無法在瀏覽器窗口。

您正在下載的文件是腳本和腳本可能會阻止,或依賴於對方,或以其他方式改變的方式瀏覽器的下載資源。實際上,如果您使用HTTP/2的在線示例(例如https://http2.golang.org/gophertiles?latency=0),您會發現Chrome確實能夠很好地複用圖像的下載(但只有當它們顯示在視口中時)。

因此,對於你的情況下,它可能是一些與腳本;也許它們彼此之間有依賴關係,這就是爲什麼Chrome無法將它們多次複用到6以上的原因。

,我不會感到驚訝,如果這是假定HTTP/1.1,現在過時了與HTTP/2的JavaScript裝載機的限制。

您可以使用Chrome開發工具中的「性能」選項卡,以進一步瞭解你的頁面的性能。

您也想看看工具,如Page Speed,那給你如何優化你的網頁的想法。

總之,我不認爲它與Chrome瀏覽器如何在您的應用程序/沒有針對HTTP/2優化腳本實現HTTP/2,而是一些問題。

+0

感謝您的回覆,但我不認爲您的任何評論適用於我的情況。請參閱原始帖子中的更新#1。另外,Page Speed沒有給出任何有意義的結果(我得到了100/100)。 –