在最近的面試中,發現屢次被問到關於瀏覽器緩存的知識。畢竟緩存是前端性能優化中一個蠻重要的點,雖然我很懶,可是仍是打算抽出一些時間對知識點作了下整理,今天終於行動起來!css
咱們知道,訪問網頁的時候,須要從服務器下載一些頁面渲染所需的資源,好比html文檔,css,js,圖片等,有的資源是不多變更的,好比表明公司的logo圖。若是把這些資源緩存下來,很天然減小了服務器的負載,並且頁面加載時間也會縮短。 可是,要不要使用緩存,這個資源瀏覽器又要緩存多久,這些瀏覽器怎麼知道?別急,這都是服務器控制的,http的返回頭( http response header )中會有一些字段來控制,下面咱們來具體聊聊這些字段。html
強緩存是利用 Expires 和 Cache-Control 這2個字段來控制的,控制資源緩存的時間,在有效期內不會去向服務器請求了。前端
Expires: Wed, 25 Jul 2028 19:19:42 GMT
複製代碼
表示資源會在2028-07-25 19:19:42後過時,到時候須要再次請求資源了。因爲 Expires 是依賴於客戶端系統時間,當修改了本地時間後,緩存可能會失效,因此通常狀況,咱們認爲使用 Cache-Control 是更好的選擇。面試
Cache-control: max-age=259200
複製代碼
表示資源3天后過時,須要向服務器再次請求資源了。瀏覽器
Cache-Control 與 Expires 能夠在服務端配置同時啓用,也就是說在 response header 中,Expires 和Cache-Control 是能夠同時存在,當它們同時啓用的時候Cache-Control 優先級更高。緩存
協商緩存是由服務器來肯定緩存資源是否可用,固然了,須要服務器和客戶端一塊兒配合。服務器可在 response header 中包含Last-Modified字段或者ETag字段。性能優化
不知道前面內容我是否表達清楚了,沒事,我在這裏再作個總結吧。總之,瀏覽器會根據 http response header 中的 Expires 和cahe-control 字段判斷是否命中強緩存,如若命中,則直接從緩存中取資源,不會再去向服務器請求了。不然(沒有命中強緩存),瀏覽器會發出一個條件請求,瀏覽器會在請求頭中包含 If-Modified-Since 或 If-None-Match 字段,If-Modified-Since 即瀏覽器當初獲得的 Last-Modified;If-None-Match即瀏覽器當初獲得的 ETag。當服務器發現資源的更新時間晚於 If-Modified-Since 所提供的時間,或者資源在服務器端當前的 ETag 和 If-None-Match 提供的不符時,說明該資源須要向服務器從新請求了。不然,瀏覽器將不須要從新下載整個資源,只須要從緩存中去加載這個資源,這時響應的http code 爲 304(304 Not Modified)。bash
面試時候,有被問到用戶進行一些操做的時候,對緩存是有什麼影響的,以下。服務器
用戶操做 | Expires/Cache-Control | Last-Modified/Etag |
---|---|---|
地址欄回車 | ☑️ | ☑️ |
頁面連接跳轉 | ☑️ | ☑️ |
新開窗口 | ☑️ | ☑️ |
前進回退 | ☑️ | ☑️ |
F5刷新 | ✖️ | ☑️ |
Ctrl+F5強制刷新 | ✖️ | ✖️ |
最近由於準備面試,因此打算整理下知識點,方便進行知識整理鞏固,文中若有不正確的地方,煩請溫柔的批評指正~
PS: 在這個2019年寒冬,我這個前端古力師,終於收穫到滿意的offer了。開心,下午看電影去了。晚點抽時間整理下,我以前爲了面試準備的複習題目,和你們一塊兒分享,共同進步!前端性能
站在巨人的肩膀上,讓我看的更遠,謝謝如下文章的做者。
一、瀏覽器緩存,想說愛你不容易
二、網站優化:瀏覽器緩存控制簡介及配置策略