這裏主要記錄在平常中對知識的學習,經過結合筆記與自身理解的方式嘗試寫下總結
文章對細節可能不會一一介紹解釋,內容僅做參考
複製代碼
前些日子在面試的時候被問到有關前端優化的,其中回答了利用前端緩存,接着就被追問有關緩存的一些問題,但回答得不是很好,有必要再整理理解一下。因爲目前只查閱了有關客戶端緩存相關的知識,因此接下來內容都是圍繞着它來說。固然了,其餘方式的緩存也是要學習的javascript
平時中通常說的都是客戶端緩存,固然啦,還有其餘類別的。此處提供瞭解:html
使用緩存有以下優化:前端
緩存有時候也可能會帶來不想要的結果,好比使用了緩存的數據致使沒法實時呈現效果
也不能說是好壞,能夠當成一個工具,想發揮什麼樣的做用,關鍵是看咱們怎麼使用它java
客戶端緩存方式主要分爲強緩存和協商緩存兩種面試
客戶端緩存操做過程以下:ajax
1.瀏覽器首次請求資源:後端
2.瀏覽器後續請求資源:api
能夠用圖來更具體地說明一下:瀏覽器
瀏覽器首次請求資源 緩存
瀏覽器後續請求資源
與強緩存主要相關的header字段有expires和cache-control:max-age=number。而且若是cache-control與expires同時存在的話,cache-control的優先級高於expires
與協商緩存相關的header字段有Last-Modified/If-Modified-Since和Etag/If-None-Match
協商緩存是由服務器來肯定緩存資源是否可用的,因此客戶端與服務器端要經過某種標識來進行通訊,從而讓服務器判斷請求資源是否能夠緩存訪問,這主要涉及到上面兩組header字段,這兩組搭檔都是成對出現的
即第一次請求的響應頭帶上某個字段(Last-Modified或者Etag),則後續請求則會帶上對應的請求字段(If-Modified-Since或者If-None-Match),若響應頭沒有Last-Modified或者Etag字段,則請求頭也不會有對應的字段
Last-Modified和Etag的區別 在描述中對於Last-Modified和Etag的使用能夠說是差很少的,可是,Etag(http1.1)的出現是爲了解決幾個Last-Modified比較難解決的問題:
Last-Modified與ETag是能夠一塊兒使用的,服務器會優先驗證ETag,一致的狀況下,纔會繼續比對Last-Modified,最後才決定是否返回304
緩存的位置大體分爲如下三類:Service Worker,Memory Cache,Disk Cache 而且它們的優先級就是按照這個順序,從前日後尋找,找到即返回;找不到則繼續。若最後資源在這些地方都沒有找到的話,再去服務器請求資源
service worker
用戶自定義緩存哪些資源到硬盤上,什麼狀況下使用緩存(路由匹配規則),緩存匹配並返回
清空緩存的狀況分兩種:一是手動調用api,二是容量超過限制,被瀏覽器清除
這種方式緩存的資源查看方式:開發者工具 -> Application -> Cache Storage
當資源請求被髮起的時候,瀏覽器首先從service worker中查找資源,若是緩存爲命中,通常狀況會使用fetch()方法繼續獲取資源,這時瀏覽器就去memory cache 或disk cache中進行下一次找緩存的工做
特別注意:通過fetch()方法獲取的資源,都會顯示 from ServiceWorker,無論資源實際狀況是從memory cache 或disk cache,仍是從網絡從新請求獲取的
memory cache
內存中的緩存,幾乎全部的網絡請求資源都會被瀏覽器自動加入到memory cache中,被短時間存儲,關閉瀏覽器窗口後memory cache就失效了
從memory cache中獲取緩存內容的時候,瀏覽器會忽視例如max-age=0,no-cache等頭部配置
但若是頭部配置設置了no-store,那麼資源就不會進入memory-cache
disk cache
硬盤上的緩存,持久存儲,容許相同資源跨回話跨站點的使用
嚴格根據HTTP頭部字段斷定該緩存哪些資源,哪些資源可用,以及哪些資源過時了須要從新請求
當請求命中緩存時,就從硬盤中讀取資源。絕大多數的緩存都來自disk cache
查詢諮詢來源:
Chrome開發工具 -> network -> 查看size那一列的值
xxk:網絡請求
form memory cache
disk cache
from ServiceWorker
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="0">
複製代碼
If-Modified-Since: 0
Cache-Control: no-cache
複製代碼
url + ? ran = Math.random()/new Date().getTime()
複製代碼