**HTTP/2 的 Server Push 的特性是怎樣的?有什么用?**
答:瀏覽器為了不浪費帶寬,會先分析完文檔再下載資源。而由于各個資源的相互掣肘依賴,其中還會有某個資源阻塞的情況。當然,現代瀏覽器也不是傻瓜,它們會通過預加載來提速。通常瀏覽器預加載提速有兩種方法:
1.?分析文檔,提前加載;
2.?根據用戶行為預加載,如鼠標在鏈接上的 hover 懸停動作等。
除此之外,前端開發工程師也可以通過 dns-prefetch 等屬性指定瀏覽器的預加載行為,更流行的方法是放棄緩存帶來的便利性,將幾個特別重要的資源內聯在 HTML 文檔中。
[](http://www.bokeyy.com/wp-content/uploads/2015/12/exportfile-1.jpg)
沒有 Server Push,HTTP/1.1 的資源加載流
HTTP/2 的 Server Push 特性把這些包袱從瀏覽器或者前端工程師手里拿過來,直接丟給了應用層。使用 HTTP/2 的 Server Push 就相當于使用升級版的內聯資源。首先,瀏覽器在完全不清楚 HTML 文檔是什么情況的前提下,就可以得到服務器推送的資源文件。而且,與內聯資源不同的是,客戶端也可以選擇暫停、或者拒絕這份推送。
[](http://www.bokeyy.com/wp-content/uploads/2015/12/IMG_0318-0.jpg)
有 Server Push 的 HTTP/2 資源加載流
還有,將內聯資源換成 Server Push 的好處還有很多,可以被緩存、被多個頁面共用、和其它資源一起多路復用,還可以享受服務器端指定的優先級權重和次序(如圖)。
[](http://www.bokeyy.com/wp-content/uploads/2015/12/exportfile-2.jpg)
Server Push 中,每個資源(每個資源都是一個 steam )都可以有權重和優先次序
作為一個前端工程師,我認為 HTTP/2 的 Server Push 特性解決了 HTTP/1.x 的無腦順序加載資源,導致前端不得不為了預加載、首屏時間、省流量延遲加載等問題,用有限的標簽和內聯 JavaScript 腳本的方式去彌補的這個問題。由于 Server Push 觸發的時機遠早于內聯 JavaScript Loader ,而且從 HTTP 協議等語義上定義了資源優先權重和 先后次序,允許客戶端啟動或暫停 Server Push,有望從根本上讓加載時機和次序的控制變得既高效又容易。雖然 Server Push 不會暴露接口給 JavaScript ,但是可以和 Sever Sent Event 協同合作([參考文獻](https://www.igvita.com/2013/06/12/innovating-with-http-2.0-server-push/))。
[](http://www.bokeyy.com/wp-content/uploads/2015/12/CNYFaJlUkAA7oS9.jpg)
HTTP/2 Server Push 的實測效果