這部分主要是想談談,關於檔案快取的幾個標誌以及它們的優先順序,另外還想談談 react 中的快取使用
當使用本地快取的時候,可以根據是否需要向伺服器驗證本地快取是否依舊有效,而將快取分為協商快取和強快取,根據名字的字面意思,可以知道那些需要向伺服器驗證的是協商快取。
這裡,想簡單聊一下,幾個標註的優先順序以及它們如何衍進的,為什麼需要這麼多種標誌用來判斷是否快取的了。
對於我們常用的 http 請求,我們一般通過控制 cache-control 和 expire 兩個欄位來控制快取,對於 expires 的使用,可以如「expires:過期時間」的格式使用;對於 cache-control 可以通過如值「public,max-age=*** 秒」的格式使用,表示在 *** 秒內再次訪問該資源,均使用本地快取。這兩者都是強快取,但優先順序 expires 低於 cache-control。看到這裡,好像關於快取的問題應該解決的七七八八了,但其實這兩種方式還存在乙個致命的問題,如果在 *** 秒後檔案未更新,是不是還要請求了?如果是在毫秒內更新又該怎麼辦了?
接下來,來就讓我們從全鏈路的角度來看看,看看為了使得檔案可以在毫秒級別的程度進行更新,幾個標誌依次是如何做的。
1. 首先,我們約定過期時間(expires/cache-control,後者相比前者更加穩定,_前者可以在瀏覽器端隨意修改_),但如果時間到了,內容並沒有更新,那該如何解決了 _檔案+expires_
2. 那就在新增乙個檔案最新修改時間的對比,伺服器告訴瀏覽器乙個字段 last-modified,當瀏覽器向伺服器請求時候,就帶上字段 if-last-modified(也就是上次伺服器給的 last-modified),如果伺服器發現與現在自己的 last-modified 不一致就更新,但是這種方式只能精確到秒,所以這之間的改變是無法感知的 _檔案+expires+last-modified_
3. 接下來新增乙個檔案內容唯一對比標記 etag(伺服器告訴瀏覽器,響應頭),與瀏覽器告訴伺服器的標誌頭(if-none-match,請求頭,其實就是上次伺服器給的 etag)進行比對 _檔案+expires+last-modified+max-age+etag_ (由於 expires 不太穩定,帶上 max-age 且優先順序更高,etag 優先順序也高於 last-modified)。但如果過期時間未到,檔案有更新了,瀏覽器本身無法主動感知伺服器檔案的變化,那又該如何解決了?
4. 接下來,不快取 html,為靜態檔案新增 md5/hash 標誌,解決瀏覽器無法跳過快取過期時間主動感知檔案變化的問題(本質就是名字不同,就不會去判斷快取)。(其他亦或者 cdn 的方式進行快取)
特別地,位址列回車,頁面鏈結跳轉、新開視窗以及前進後退,expires/cache control 和 last-modified/etag 都是有效的。但f5重新整理會使得expires/cache control無效,f5+ctrl則會讓以上都失效
在上一段落,談到了一些關於快取的標誌,接下來聊聊如何使用。關於在常用的 http 請求中的使用,如 axios 中的使用,可以查閱文件解決,這裡不在討論,只要理解了幾種欄位頭表述的含義,使用起來應該就沒有什麼問題了。
output: ,
談談瀏覽器http快取
最近面試,被問到了http的相關知識,深知自己的不足,於是惡補了一下。user agent pragma cache control referer accept cookit if modified since if none match content type date etag last m...
談談我理解的Http快取機制
前幾天看到老鐵們分享的面經,談到 http 快取機制的問題,痛下決心,一口氣研究個明白,分享給大家。前端的發展越來越迅速,能做的事情越來越多,承擔的責任越來越重,通過了解 http 快取機制,可以幫助廣大前端開發工作者提高 的訪問效率,也能有效減輕伺服器的壓力。http 快取規則 http快取機制有...
App PHP快取抓取http快取
解決方案方案分為兩部分 業務線中讀取php快取,寫入redis 在指令碼中,取出redis快取 寫入log檔案 如下。var繼承的子類如有構造方法 記得呼叫父類方法 驗證登入 public function construct 記錄日誌 public function destruct page層使...