HTTP緩存( ETag、Cache-Control)——谷歌開發者
HTTP緩存有利於web性能優化css
假設咱們首頁有一個請求,請求js文件<script src="./main.js"></script>
如何讓CSS和JS請求速度加快?web
此時打開首頁
發現這個文件大小爲279KB,使用時間爲382ms算法
若是再次刷新首頁,那麼這個文件還會被再次請求一次。那麼如何重複利用以前獲取的資源而不用反覆請求呢?答案是HTTP緩存,這是性能優化的一個重要方面。瀏覽器
接下來在響應裏設置響應頭Cache-Control: max-age=30
刷新兩次首頁緩存
第二次的時間爲0
響應頭中的Cache-Control: max-age=30
表示客戶端將這個緩存最多 保存30 秒,30秒後再次請求文件將會再次下載。性能優化
即:
設置這個響應頭以後,瀏覽器請求時發現是相同的URL,瀏覽器直接從內存裏返回已經緩存的main.js,沒有向服務器發出請求服務器
<script src="./main.js?v=2"></script>
,來保證URL的不一樣,從新獲取新的js文件。這樣便可以緩存好久,又能夠隨時更新
例如知乎的網頁裏的請求:網絡
經過網絡獲取內容既速度緩慢又開銷巨大。較大的響應須要在客戶端與服務器之間進行屢次往返通訊,這會延遲瀏覽器得到和處理內容的時間,還會增長訪問者的流量費用。所以,緩存並重複利用以前獲取的資源的能力成爲性能優化的一個關鍵方面。好在每一個瀏覽器都自帶了 HTTP 緩存實現功能。您只須要確保每一個服務器響應都提供正確的 HTTP
標頭指令,以指示瀏覽器什麼時候能夠緩存響應以及能夠緩存多久。性能
Expires: Wed, 21 Oct 2015 07:28:00 GMT
注意: 由於過時標準的時間用的是本地時間,因此不靠譜,因此要遊俠使用Cache-Control代替Expires優化
MD5是消息摘要算法。用於確保信息傳輸完整一致。
具體做用這樣
接受一個String 或 Buffer,返回一個固定的String
若是接受的String改變,那麼返回的String也會改變
例如將1.txt中的其中一個1改成0,那麼返回值以下
可見返回至徹底改變了
這個特性能夠用來判斷兩次信息傳輸是否完整一致
例如咱們請求一個js文件。
設置一個ETag響應頭
設置的ETage響應頭爲這個JS文件的MD5值
查看響應:
那麼:下一次請求這個JS的時候,瀏覽器會把上一次響應的那個ETage的值放到If-None-Match裏面,如圖:
這樣作的做用是:若是請求和響應的MD5同樣,說明不須要從新下載這個js文件。這時咱們修改代碼:
若是MD5同樣,說明文件沒改過,那麼返回304
304 Not Modified:
HTTP 304 未改變說明 無需再次傳輸請求的內容,也就是說能夠 使用緩存的內容。
HTTP 304 沒有響應體,由於不須要下載響應內容,直接用緩存就好了
假設咱們請求兩個文件,CSS文件使用Cache-Control緩存,js文件使用ETag。
代碼以下:
兩個請求區別:
因此:
個人博客即將同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/dev...