首次訪問或已清除快取時,(瀏覽器無快取資料),(向伺服器請求資源),伺服器在返回(資源)和(快取策略),http狀態碼為200;客戶端拿到後將資料和快取策略快取到瀏覽器。
快取策略
存在於響應頭里,
快取策略主要有:強制快取 和 協商(對比)快取,
快取策略 快取到瀏覽器
或者
強制快取
伺服器響應頭會有2個字段來表示,expires/cache-control。
response cache-control
cache-control欄位解析:
ps:優先順序: max-age > expires 。
max-age,max-stale 和 min-fresh 的關係:age (已快取的時間) (伺服器首次發出或最後一次被伺服器再驗證 之後過去的時間),
如果 age + min-fresh < max-age,快取未過期;
如果 age + min-fresh >= max-age && age + min-fresh < max-age + max-stale,則雖然快取過期了,但是快取繼續可以使用,只是在頭部新增 110 警告碼;
如果 age + min-fresh >= max-age + max-stale,則快取過期且不可使用。快取使用期 age 的計算可以參考《http 權威指南》的 7.11.2 節,具體關於快取使用期和新鮮生存期的問題可以參考 7.11 節。
no-cache 和 no-store 區別:no-cache 實際會進行快取,只是在快取響應之前會先進行一次新鮮度再驗證(瀏覽器的 f5 重新整理);
no-store 不會進行快取,每次都是向獲取伺服器的最新資料(瀏覽器的強制重新整理)
有兩種實現方式最近修改日期( last-modified ) 和實體標籤( etag )驗證。(優先順序:etag > last-modified)
相關字段
最近修改日期(if-modified-since)驗證:
last-modified (伺服器資源 最近修改日期
)>= if-modified-since(本地快取資源 最近修改日期) 則新鮮度過期。也可配合 if-unmodified-sinece。
實體標籤(etag)驗證:
通過特定標籤對比進行驗證,比如 etag 可以用來存版本號,這樣就可以通過版本號對比檢視新鮮度,可以配合 if-none-match 來使用,不同則修改過,返回新資源200,否則使用本地快取304
試探性過期
當 response 中沒有 cache-control:max-age 和 expires 的時候,快取可以計算出乙個試探性最大使用期。常用演算法 lm—factor 演算法。
快取位置
我們可以在 chrome 的開發者工具中,network -> size 一列看到
乙個請求最終的處理方式:
它們的優先順序是:(由上到下尋找,找到即返回;找不到則繼續)
service worker、
memory cache、
硬碟 cache、
網路請求
memory cache(記憶體中的快取)
幾乎所有的 網路請求資源 都會被瀏覽器自動加入到 memory cache 中。 因為數量很大且不斷擴充套件,只能是個「短期儲存」,瀏覽器的本標籤關閉後失效;極端情況下 ,如果乙個頁面占用記憶體太大,在關閉前,排在前面的快取就已經失效了;
disk cache(http cache,儲存在硬碟上的快取)
絕大部分的 快取都來自disk cache。持久儲存的,(網路請求《讀取速度《記憶體),是實際存在於檔案系統中的。而且它允許相同的資源在跨會話,甚至跨站點的情況下使用,例如兩個站點都使用了同一張。disk cache 會嚴格根據 http頭資訊中的各類欄位來判定哪些資源可以快取,哪些資源不可以快取;哪些資源是仍然可用的,哪些資源是過時需要重新請求的。
serviceworker
探索中,詳情參考:
這個快取是永久性的,即關閉 tab 或者瀏覽器,下次開啟依然還在。
有兩種情況會導致這個快取中的資源被清除:手動呼叫 apicache.delete(resource)
或者容量超過限制,被瀏覽器全部清空。
注意:經過 service worker 的fetch()
方法獲取的資源,即便它並沒有命中 service worker 快取,甚至實際走了網路請求,也會標註為from serviceworker
。
如果乙個請求在上述 3 個位置都沒有找到快取,那麼瀏覽器會正式傳送網路請求去獲取內容。之後容易想到,為了提公升之後請求的快取命中率,自然要把這個資源新增到快取中去。具體來說:
根據 service worker 中的 handler 決定是否存入 cache storage (額外的快取位置)。
根據 http 頭部的相關字段(cache-control
,pragma
等)決定是否存入 disk cache
memory cache 儲存乙份資源 的引用,以備下次使用。
HTTP 快取策略
瀏覽器一般快取 css js等靜態檔案,因為這些檔案的更新頻率相對來說比較低,合理利用瀏覽器的快取對 的效能提公升有很大幫助。http快取分為兩部分,分別是本地快取和快取協商,當本地快取不生效時會啟用快取協商。http快取主要由http協議的頭 header 資訊來制定。本地快取 本地快取是指瀏覽器...
HTTP快取策略
瀏覽器一般快取 css js等靜態檔案,因為這些檔案的更新頻率相對來說比較低,合理利用瀏覽器的快取對 的效能提公升有很大幫助。http快取分為兩部分,分別是本地快取和快取協商,當本地快取不生效時會啟用快取協商。http快取主要由http協議的頭 header 資訊來制定。本地快取是指當瀏覽器請求資源...
HTTP 快取策略
前端開發的同學大家都知道,專案中的靜態檔案等資訊,都要做快取處理,這裡,我們就來說一下http的快取策略。快取,顧名思義,其實就把是拿到的資源存起來,下次要用的時候就可以直接使用啦。有什麼作用呢?重用已獲取的資源能夠有效的提公升 與應用的效能。快取其實是乙個很廣義的概念,用到的地方很多,當然作用只有...