摘要:原文鏈接關(guān)于瀏覽器緩存我知道多少歡迎在前端開發(fā)中,我們在提到性能優(yōu)化的時候總會提到一點合理設(shè)置緩存。如果相等,則說明資源未修改,返回,瀏覽器使用本地緩存。
原文鏈接:關(guān)于瀏覽器緩存我知道多少
歡迎star~
在前端開發(fā)中,我們在提到性能優(yōu)化的時候總會提到一點:合理設(shè)置緩存。我們該如何從這方面入手來考慮提高網(wǎng)站性能呢?
前言我們都知道 HTML5 引入了應(yīng)用程序緩存,可以在沒有網(wǎng)絡(luò)的情況下進(jìn)行訪問,同時,HTML5 還引入了 storage 本地存儲。這些都屬于應(yīng)用緩存。
本篇文章主要內(nèi)容是和瀏覽器緩存相關(guān)的,也可以說是 HTTP 緩存。
什么是瀏覽器緩存MDN 上是這樣解釋瀏覽器緩存的:
A browser cache holds all document downloaded via HTTP by the user 。。。 without requiring an additional trip to the server.
意思就是,瀏覽器緩存保存著用戶通過 HTTP 獲取的所有資源,再下一次請求時可以避免重復(fù)向服務(wù)器發(fā)出多余的請求。
通俗的說,就是在你訪問過一次某個網(wǎng)站之后,這個站點的文字、圖片等所有資源都被下載到本地了,下次再訪問該網(wǎng)站時判斷是否滿足緩存條件,如果滿足就不用再花費時間去等待資源的獲取了。
瀏覽器緩存的分類一般來說瀏覽器緩存可以分為兩類:
強緩存
協(xié)商緩存(對比緩存)
我們需要知道的是,瀏覽器在加載資源時,會先判斷是否命中強緩存再驗證是命中協(xié)商緩存。
其它的的具體細(xì)節(jié),稍后會展開來說。
強緩存瀏覽器在加載資源時,會先根據(jù)本地緩存資源的 header 中的信息判斷是否命中強緩存,如果命中則直接使用緩存中的資源不會再向服務(wù)器發(fā)送請求。
從圖中可以看出,強緩存一般是這樣一個流程:
查看 header 頭中的 Expire 和 Cache-control 來判斷是否滿足規(guī)則;
如果滿足規(guī)則,就返回緩存的數(shù)據(jù);
如果不滿足規(guī)則,就向服務(wù)器發(fā)送請求;
服務(wù)器返回數(shù)據(jù);
將新數(shù)據(jù)存入緩存。
所以我們主要就是關(guān)注 Expire 和 Cache-control 這兩個字段。
Expire同樣地,我們看看MDN中如何解釋這個字段:
The Expires header contains the date/time after which the response is considered stale.
這個字段包含了一個時間,過了這個時間,響應(yīng)將會失效。
也就是說,Expire 這個字段表示緩存到期時間,我們來打開一個網(wǎng)站并查看 Response Header 看看這個字段:
Expires:Fri, 27 Oct 2017 07:55:30 GMT
可能在你查看這的時候發(fā)現(xiàn)時間不對啊,怎么都已經(jīng)是過去了 ~
GMT 表示的是格林威治時間,和北京時間相差8小時。
上面的這個時間表示的是 2017年10月27日15:55:30。
通過設(shè)置 Expire 來設(shè)置緩存有一個致命缺點:
可以看出,這個是個絕對時間,也就是說,如果我修改了客戶端的本地時間,是不是就會導(dǎo)致判斷緩存失效了呢。
Cache-Control既然不能設(shè)置絕對時間,那我就設(shè)置個相對時間唄。
在 HTTP/1.1 中,增加了一個字段 Cache-Control ,它包含一個 max-age 屬性,該字段表示資源緩存的最大有效時間,這就是一個相對時間。
Cache-Control:max-age=600
這個表示的就是最大有效時間是 600s ,對的,它的單位是秒。
Cache-Control 除了 max-age 屬性之外還有一些屬性:
no-cache:需要進(jìn)行協(xié)商緩存,發(fā)送請求到服務(wù)器確認(rèn)是否使用緩存。
no-store:禁止使用緩存,每一次都要重新請求數(shù)據(jù)。
public:默認(rèn)設(shè)置。
private:不能被多用戶共享。
現(xiàn)在基本上都會同時設(shè)置 Expire 和 Cache-Control ,Cache-Control 的優(yōu)先級別更高。
協(xié)商緩存當(dāng)強緩存沒有命中的時候,瀏覽器會發(fā)送一個請求到服務(wù)器,服務(wù)器根據(jù)請求頭中的部分信息來判斷是否命中緩存。如果命中,則返回 304 ,告訴瀏覽器資源未更新,可使用本地的緩存。
從圖中可以看出,協(xié)商緩存一般是這樣一個流程:
把資源標(biāo)識,比如 If-Modify-Since 或 Etag 發(fā)送到服務(wù)器,確認(rèn)資源是否更新;
如果資源未更新,請求響應(yīng)返回的http狀態(tài)為 304 并且會顯示一個 Not Modified 的字符串,告訴瀏覽器使用本地緩存;
如果資源已經(jīng)更新,返回新的數(shù)據(jù);
將新數(shù)據(jù)存入緩存。
Last-Modified,If-Modified-Since瀏覽器第一次請求資源的時候,服務(wù)器返回的 header 上會帶有一個 Last-Modified 字段,表示資源最后修改的時間。
Last-Modified: Fri, 27 Oct 2017 07:55:30 GMT
同樣的,這是一個 GMT 的絕對時間。
當(dāng)瀏覽器再次請求該資源時,請求頭中會帶有一個 If-Modified-Since 字段,這個值是第一次請求返回的 Last-Modified 的值。服務(wù)器收到這個請求后,將 If-Modified-Since 和當(dāng)前的 Last-Modified 進(jìn)行對比。如果相等,則說明資源未修改,返回 304,瀏覽器使用本地緩存。
well,這個方法也是有缺點的:
最小單位是秒。也就是說如果我短時間內(nèi)資源發(fā)生了改變,Last-Modified 并不會發(fā)生變化;
周期性變化。如果這個資源在一個周期內(nèi)修改回原來的樣子了,我們認(rèn)為是可以使用緩存的,但是 Last-Modified 可不這樣認(rèn)為。
所以,后來又引入一個 Etag。
EtagEtag 一般是由文件內(nèi)容 hash 生成的,也就是說它可以保證資源的唯一性,資源發(fā)生改變就會導(dǎo)致 Etag 發(fā)生改變。
同樣地,在瀏覽器第一次請求資源時,服務(wù)器會返回一個 Etag 標(biāo)識。當(dāng)再次請求該資源時, 會通過 If-no-match 字段將 Etag 發(fā)送回服務(wù)器,然后服務(wù)器進(jìn)行比較,如果相等,則返回 304 表示未修改。
Last-Modified 和 Etag 是可以同時設(shè)置的,服務(wù)器會優(yōu)先校驗 Etag,如果 Etag 相等就會繼續(xù)比對 Last-Modified,最后才會決定是否返回 304。
總結(jié)當(dāng)瀏覽器再次訪問一個已經(jīng)訪問過的資源時,它會這樣做:
看看是否命中強緩存,如果命中,就直接使用緩存了;
如果沒有命中強緩存,就發(fā)請求到服務(wù)器檢查是否命中協(xié)商緩存;
如果命中協(xié)商緩存,服務(wù)器會返回 304 告訴瀏覽器使用本地緩存;
否則,返回最新的資源。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61894.html
摘要:在一個成熟的系統(tǒng)中,能夠運用到緩存的地方其實并不是一處。那么在以終端用戶為起點,系統(tǒng)所用的數(shù)據(jù)庫為終點的這條道路上可以作為緩存設(shè)立點的位置大致有以下這些。緩存也有一系列的副作用需要考慮。 如果這是第二次看到我的文章,歡迎文末掃碼訂閱我個人的公眾號(跨界架構(gòu)師)喲~ 本文長度為3578字,建議閱讀10分鐘。堅持原創(chuàng),每一篇都是用心之作~ 此前的「伸縮性」章節(jié)結(jié)束了,此文是「高性能」章...
摘要:前言秋招宣告結(jié)束,面試了接近家公司,有幸拿到,感謝這段時間一起找工作面試的朋友和陪伴我的人。一定要提前準(zhǔn)備好,不然面試官叫你說遇到的難點,或者直接問問題時可能會懵逼。 前言 秋招宣告結(jié)束,面試了接近20家公司,有幸拿到offer,感謝這段時間一起找工作面試的朋友和陪伴我的人。這是一段難忘的經(jīng)歷,相信不亞于當(dāng)年的高考吧,也許現(xiàn)在想起來高考不算什么,也許只有經(jīng)歷過秋招的人才懂得找工作的艱辛...
摘要:前言秋招宣告結(jié)束,面試了接近家公司,有幸拿到,感謝這段時間一起找工作面試的朋友和陪伴我的人。一定要提前準(zhǔn)備好,不然面試官叫你說遇到的難點,或者直接問問題時可能會懵逼。 前言 秋招宣告結(jié)束,面試了接近20家公司,有幸拿到offer,感謝這段時間一起找工作面試的朋友和陪伴我的人。這是一段難忘的經(jīng)歷,相信不亞于當(dāng)年的高考吧,也許現(xiàn)在想起來高考不算什么,也許只有經(jīng)歷過秋招的人才懂得找工作的艱辛...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W(wǎng)發(fā)布的真實大廠前端面經(jīng)題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復(fù),但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@??途W(wǎng)發(fā)布的真實大廠前端面經(jīng)題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復(fù),但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...
閱讀 3425·2021-09-22 16:00
閱讀 3468·2021-09-07 10:26
閱讀 3029·2019-08-30 15:55
閱讀 2869·2019-08-30 13:48
閱讀 1376·2019-08-30 12:58
閱讀 2178·2019-08-30 11:15
閱讀 958·2019-08-30 11:08
閱讀 534·2019-08-29 18:41