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