服務端只能根據客戶端請求返回額外的Push流,Push流和正常的響應流需要在同一個TCP連接中,所以一般要求要Push的資源和主頁面由同一個服務端輸出。HTTP/2中的ServerPush被設計為替代HTTP/1.x中為了節省連接數所引入的「資源inline」方案。因為inline無法被緩存,會導致第二次訪問浪費了流量,多頁面之間的公共資源被inline后也無法利用緩存;圖片base64后還會變大1/3。這些問題,可以通過將inline資源寫入用戶的localStorage,并通過Cookie標記用戶當前版本,達到優化第二次訪問頁面體積的效果。詳細可以查看我的這篇文章《HTTP/2與WEB性能優化(一)》。另外HTTP/2的ServerPush主要目的是為了減少時延,服務端要推送資源時,會發送一個PUSH_PROMISE幀,然后接著發出HEADER和DATA幀,客戶端如果發現服務端要推送的資源本地有緩存,可以返回一個RST_STREAM終止流,節省傳輸。這個過程可能會造成一定程度的流量浪費,但是時延還是減少了。這部分內容,可以查看我的這篇文章《HTTP/2中的ServerPush討論》。這里有H2O的作者KazuhoOku,aria2的作者TatsuhiroTsujikawa,以及《High-PerformanceBrowserNetworking》的作者IlyaGrigorik關于ServerPush的討論。