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等。他們之間的區別是什麼呢。以 ofollow,noindex" target="_blank">http://xxdy.tech/ 作為例子來看一下。
再次訪問(位址列回車)
可以看到資源分下面幾類:
先看下直觀的請求

大部分都是200強快取,只有文稿是304
-
無快取的,maxage=0的資源
此類資源,請求的時候總會從服務端重新載入
- status為200,但是後面有提示from memory cache 或者disk cache的標識。這種快取的字型為灰色,跟上面的200還是比較容易看出來差別的。
js的響應

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

這裡截兩張圖的原因在於兩者快取存放的位置是不同。
概述一下(詳細請找資料細究)
-
記憶體快取(from memory cache):記憶體快取具有兩個特點,分別是快速讀取和時效性
快速讀取:記憶體快取會將編譯解析後的檔案,直接存入該程序的記憶體中,佔據該程序一定的記憶體資源,以方便下次執行使用時的快速讀取
時效性:一旦該程序關閉,則該程序的記憶體則會清空。
-
硬碟快取(from disk cache):硬碟快取則是直接將快取寫入硬碟檔案中,讀取快取需要對該快取存放的硬碟檔案進行I/O操作,然後重新解析該快取內容,讀取複雜,速度比記憶體快取慢。
在瀏覽器中,大部分情況下瀏覽器會在js和圖片等檔案解析執行後直接存入記憶體快取中,那麼當重新整理頁面時只需直接從記憶體快取中讀取(from memory cache);而css檔案則會存入硬碟檔案中,所以每次渲染頁面都需要從硬碟讀取快取(from disk cache)
-
協商快取
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,沒有找到合理的解釋。具體我需要在研究一下,後面補上

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

操作完之後就完全不使用快取了。
規則
上面提到那麼幾種重新整理方式對應的效果,可能不同瀏覽器的實現也不同。找了個相對完善的大家可以參考一下。

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