先思考乙個問題,我們知道,前端和後端通過 ajax 傳送請求來進行資料的互動。那麼是不是每次通過請求 url 獲取資源都要發請求,在伺服器端返回對應的新資料呢 ? 答案是不會,為了提高頁面效能,瀏覽器提供了快取策略。
瀏覽器每次發起請求時,先在本地快取中查詢結果已經快取標識,根據快取標識來判斷是否使用本地快取。如果快取有效,則使用本地快取,否則則向伺服器發起請求並攜帶快取標識。根據是否需向伺服器發起 http 請求,將快取過程劃分為兩個部分:強制快取和協商快取,強快取優於協商快取。
第一次請求資源時,伺服器返回資源,並在 response header 中返回資源的緩存策略。第二次請求時,瀏覽器判斷這些請求引數,擊中強快取就直接 200,否則就把請求引數加到 request header 頭中傳給伺服器,看是否擊中協商快取,擊中則返回 304,否則瀏覽器返回新的資源。
強快取:伺服器通知瀏覽器乙個快取時間,在快取事件內,下次請求,直接用快取,不在時間內,執行比較快取策略。
該字段是伺服器響應訊息頭欄位,告訴瀏覽器在過期時間之前可以直接在瀏覽器快取中讀取資料。exprirs 是 http1.0 的字段,表示快取到期時間,是乙個絕對時間(當前時間+快取時間)。在響應訊息頭中,設定這個字段之後,就可以告訴瀏覽器,在未過期之前不需要再次請求。
由於是絕對時間,使用者可能會將客戶端本地時間進行修改,而導致瀏覽器判斷快取失效,重新請求該資源。
優勢:http1.0 產物,可以在 http1.0 和 1.1 中使用,簡單易用。
缺點:時間由伺服器傳送的(utc),如果伺服器時間和客戶款時間不一致,可能會出現問題。存在版本問題。
已知 expirs 的缺點之後,在 http1.1 中,新增了乙個 cache-control 字段,該欄位表示資源快取的最大有效時間。在該時間內,客戶端不需要向伺服器端發請求。cache-control 常用的值:mdn 查詢 。。。。。。
優勢:http1.1 產物,一時間間隔標識失效時間,解決了exprirs伺服器和客戶端相對時間問題。比 exprirs 多了很多選項設定。
缺點:存在版本問題,到期之前的修改客戶端是不可知的。
協商快取:讓客戶端與伺服器之間能實現快取檔案是否更新的驗證,提公升快取的復用率,將快取資訊中的,etag 和 last-modified 通過請求傳送給伺服器,由伺服器校驗,返回 304 狀態碼時,瀏覽器直接使用快取。
伺服器通過 last-modified 字段告知客戶端,資源最後一次被修改的時間。瀏覽器將這個值和內容一起記錄在快取資料庫中。
下一次請求相同資源的時,瀏覽器從自己的快取中找出不確定是否過期的快取,因此在請求頭上將上次 last-modified 值寫入 if-modified-since 字段。
伺服器會對 last-modified / if-modified-since 進行對比,相等,未修改,響應 304。反之,修改,響應 200,返回資料。
優勢:不存咋版本問題。
缺點:只要資源修改,無論內容有無發生實質性的變化,都會將該資源返回客戶端。以時刻作為標識,無法識別一秒內進行多次修改的情況。
etag 儲存的是檔案的特殊標識,一般都是hash生成的。伺服器儲存著 etag 字段。etag 優先順序高於 last-modified。
優勢:可以更加精確的判斷資源是否被修改,可以識別一秒內多次修改的情況。不存在版本問題,每次請求都會去伺服器驗證。
缺點:計算 etag 的值需要效能消耗。
瀏覽器快取策略
1.三種區別在哪 from memory cache 字面理解是從記憶體中,其實也是字面的含義,這個資源是直接從記憶體中拿到的,不會請求伺服器一般已經載入過該資源且快取在了記憶體當中,當關閉該頁面時,此資源就被記憶體釋放掉了,再次重新開啟相同頁面時不會出現from memory cache的情況 f...
前端瀏覽器快取策略
通常瀏覽器快取策略分為兩種 強快取和協商快取,並且快取策略都是通過設定http header來實現的 強快取 強快取可以通過設定兩種http header實現 expires和cache control。強快取表示在快取期間不需要請求,state code為200 expires expires w...
瀏覽器快取策略詳解
1 伺服器會存在大量重複請求 比如我們每次重新整理頁面的時候都會傳送一次請求到伺服器,而多次請求的引數和響應的內容都完全一致,其實這種請求完全就是多餘的,我們完全可以就用上一次的響應內容。2 提高響應的速度 對於重複的請求,我們將響應內容儲存到本地,下一次請求時可以直接返回而無需請求伺服器,那麼會提...