1. 程式人生 > >f5到底重新整理了點什麼,你知道嗎

f5到底重新整理了點什麼,你知道嗎

引言

前面翻到了http快取相關內容,關於強制快取和協商快取,他們之間的差別可能大家比較清楚。
並且常規情況下是否該使用快取以及使用哪種快取,
相關文章多且全,這裡不再贅述。
不過使用者的不同行為會打破原有規範,
本文就會去探究下不同行為下的瀏覽器快取表現。也就是f5到底重新整理了哪些內容

瀏覽器快取

說道瀏覽器快取,腦海中常見的應該是那麼幾種關鍵詞:
Cache-Control、Expires、ETag、If-Match、If-None-Match、Last-Modified等。
根據不同標識的作用,再次訪問某個資源時,
需要快取的情況下,主要有下面兩種快取方式

強快取

一旦資源命中強快取, 瀏覽器便不會向伺服器傳送請求, 而是直接讀取快取.
Chrome下的現象是 200 OK (from disk cache) 或者 200 OK (from memory cache).

協商快取

也就是我們常見的304狀態碼。

快取過期後, 繼續請求該資源,
對於現代瀏覽器, 存在如下兩種做法:

  • 根據上次響應中的ETag_value, 自動往request header中新增If-None-Match欄位.
    伺服器收到請求後, 拿If-None-Match欄位的值與資源的ETag值進行比較, 若相同, 則命中協商快取, 返回304響應.
  • 根據上次響應中的Last-Modified_value, 自動往request header中新增If-Modified-Since欄位. 伺服器收到請求後, 拿If-Modified-Since欄位的值與資源的Last-Modified值進行比較, 若相同, 則命中協商快取, 返回304響應.

ETag是http/1.1新增標識,也是為了解決Last-Modified存在的一些問題。
例如伺服器和客戶端時間不同步等問題,
所以比Last-Modified的優先順序高。

因此常見情況下,資源的快取就是按照上面的順序,強快取=>協商快取=>重新獲取。
但是,快取策略是與使用者的操作相關的,平時不可避免會用到重新整理。
重新整理的方式是多種多樣的。重新整理按鈕,command+r,shift+command+r等。他們之間的區別是什麼呢。以xxdy.tech/作為例子來看一下。

再次訪問(位址列回車)

可以看到資源分下面幾類: 先看下直觀的請求 大部分都是200強快取,只有文稿是304

  1. 無快取的,maxage=0的資源

此類資源,請求的時候總會從服務端重新載入

  1. status為200,但是後面有提示from memory cache 或者disk cache的標識。 這種快取的字型為灰色,跟上面的200還是比較容易看出來差別的。

css資源的響應,來自硬碟快取。

js的響應,即來自memory的快取

這裡就是強快取,直接從本地快取中讀取。
因為Cache-Control:max-age=600 重新整理時未過期,所以會從本地快取中獲取。

這裡截兩張圖的原因在於兩者快取存放的位置是不同。 概述一下(詳細請找資料細究)

  • 記憶體快取(from memory cache):記憶體快取具有兩個特點,分別是快速讀取和時效性 快速讀取:記憶體快取會將編譯解析後的檔案,直接存入該程序的記憶體中,佔據該程序一定的記憶體資源,以方便下次執行使用時的快速讀取
    時效性:一旦該程序關閉,則該程序的記憶體則會清空。

  • 硬碟快取(from disk cache):硬碟快取則是直接將快取寫入硬碟檔案中,讀取快取需要對該快取存放的硬碟檔案進行I/O操作,然後重新解析該快取內容,讀取複雜,速度比記憶體快取慢。

在瀏覽器中,大部分情況下瀏覽器會在js和圖片等檔案解析執行後直接存入記憶體快取中,
那麼當重新整理頁面時只需直接從記憶體快取中讀取(from memory cache);
而css檔案則會存入硬碟檔案中,所以每次渲染頁面都需要從硬碟讀取快取(from disk cache)

  1. 協商快取

status為304,意為與服務端對比之後檔案未改變,返回原有快取資源。

此資源請求頭裡面有Cache-Control: max-age=0 ,
所以每次請求都回去服務端詢問,不會走強快取,因為服務端也未更新,etag相同,所以返回快取資源。

總結

位址列回車的話,就是我們正常訪問,遵循瀏覽器的快取策略。

f5重新整理(mac 即command + r)

f5重新整理的時候,會有什麼不同嗎,先直觀對比下。

好像沒什麼不同,具體到檔案也是與直接回車相同的狀態。

總結

那麼f5的重新整理到底是什麼呢,
可以看到f5可以被稱為soft refresh 其只是reload page而已。
即與回車地址相同,正常規則下的快取還是會涉及到。

強制重新整理(command+shift+r)

此時可以看下請求結果,前面列出的304和from cache的專案都是重新load。

具體檢視相應請求可以看到,
在request中多了個屬性: 都有Cache-Control: no-cache的標識。
這表明每次都需要伺服器評估是否有效,不要理解為直接不使用快取。
此外可以注意到request中沒有可以匹配response中ETag的If-None-Match屬性,
所以會重新載入。

總結而言

此時的重新整理可以稱為hard refresh,
請求會加上一個Cache-Control:no-cache的標識來表明突破cache-control的限制,
需要服務端重新判斷有效性,即不走強快取。
另外請求header中去掉If-None-Match,這樣就不能使用協商快取。拉到新的資源

tip

這裡硬性重新載入,有些檔案是依舊使用快取的,我這邊看到是有些小的image,沒有找到合理的解釋。具體我需要在研究一下,後面補上

停用快取並重新整理

針對上面提到的哪些檔案,此時就需要到下面這種清空快取並硬性重新載入了。

操作完之後就完全不使用快取了。

規則

上面提到那麼幾種重新整理方式對應的效果,可能不同瀏覽器的實現也不同。找了個相對完善的大家可以參考一下。

結束語

到這裡,關於重新整理與快取的個人一些關掉就結束了,拋磚引玉,希望能對有需要的人有所幫助,也希望有大神有所指教。更多個人部落格請移步
此外感謝下面的參考文章:
stackoverflow.com/questions/8…
stackoverflow.com/questions/3…