摘要:主要可分為強制緩存字段字段對比緩存字段標識瀏覽器行為引起的緩存變化移動端的緩存策略其實,在講述移動端的緩存策略時,并沒有分析的特別詳細,只是大致的講解了一下目前大家都在使用的緩存策略。
前言
在前端開發中,緩存有利于加快網頁的加載速度,同時緩存能夠被反復利用,所以可以減少流量和帶寬的開銷。
緩存的分類有很多種,CDN緩存、數據庫緩存、代理服務器緩存和瀏覽器緩存。本篇將來講解一下Web開發中的瀏覽器緩存。這個在實際開發環境中往往也會被問到,或者使用到。如何去準確認清楚緩存的概念,是前端必須要去學習的。如果你喜歡我的文章,歡迎評論,歡迎Star~。歡迎關注我的github博客
正文瀏覽器的緩存問題,主要指的是http的緩存——即協議層。而h5新增的storage和數據庫緩存,那是應用層緩存,并不被計入本篇的分析內容里面。下面我們正式開始來進行緩存的分析。
協議層的緩存,其實,可以被分成強制緩存和對比緩存。
強制緩存首先,我們先來看一張強制緩存時的時序圖,來了解一下強制緩存在不同情況下的請求模式:
從圖中,我們不難看出,只有當緩存失效時,才會去服務器獲取最新資源的方式,就是強制緩存。而在協議層的字段中,可以造成強制緩存的字段有兩個Expires和Cache-Control。
1.0的時候見到我——Expires最早使用的是Expires字段,該字段表示緩存到期時間,即有效時間+當時服務器的時間,然后將這個時間設置在header中返回給服務器。因此,該時間是一個絕對時間,舉例說明:
Expires: Thu, 10 Nov 2017 08:45:11 GMT
圖片示例:
![expires](
http://lhbzimo.oss-cn-shenzhe...
在響應消息頭中,設置這個字段之后,就可以告訴瀏覽器,在未過期之前不需要再次請求。
但是,這個字段設置時有缺點:
由于是絕對時間,用戶可能會將客戶端本地的時間進行修改,而導致瀏覽器判斷緩存失效,重新請求該資源,同時,還導致客戶端與服務端的時間不一致,致使緩存失效。
1.1的時候我來了——Cache-Control已知Expires的缺點之后,在HTTP/1.1中,增加了一個字段Cache-Control,該字段表示資源緩存的最大有效時間,在該時間內,客戶端不需要向服務器發送請求
這兩者的區別就是前者是絕對時間,而后者是相對時間。我們不妨舉個例子來說明一下:
Cache-Control: max-age=2592000
圖片示例:
下面列舉一下Cache-Control的字段可以帶的值:
max-age:即最大有效時間,在上面的例子中我們可以看到
no-cache:表示沒有緩存,即告訴瀏覽器該資源并沒有設置緩存
s-maxage:同max-age,但是僅用于共享緩存,如CDN緩存
public:多用戶共享緩存,默認設置
private:不能夠多用戶共享,HTTP認證之后,字段會自動轉換成private。
總結一下,自從http1.1開始,Expires逐漸被Cache-Control取代。Cache-Control是一個相對時間,即使客戶端時間發生改變,相對時間也不會隨之改變,這樣可以保持服務器和客戶端的時間一致性。而且Cache-Control的可配置性比較強大。
對比緩存扯完強制緩存,我們來看看對比緩存。在解釋這個之前,是否可以先猜想一下,強制緩存是,緩存在未過有效期時,不需要請求資源。那么,對比緩存的原理又該如何呢?
廢話不多說,我們也先從對比緩存的時序圖講起,如圖:
對比緩存的過程是,先從緩存中獲取對應的數據標識,然后向服務器發送請求,確認數據是否更新,如果更新,則返回新數據和新緩存;反之,則返回304狀態碼,告知客戶端緩存未更新,可繼續使用。
這正好彌補了一些強制緩存的缺陷。對比緩存主要應用于一些時常需要動態更新的資源文件。
對比緩存在協議里的字段是Last-Modified和If-Modified-Since。
別人的好伙伴——Last-ModifiedLast-Modified:服務器告知客戶端,資源最后一次被修改的時間,例如
Last-Modified: Thu, 10 Nov 2015 08:45:11 GMT
If-Modified-Since:再次請求時,請求頭中帶有該字段,服務器會將If-Modified-Since的值與Last-Modified字段進行對比,如果相等,則表示未修改,響應304;反之,則表示修改了,響應200狀態碼,返回數據。
這個字段可以和Cache-Control配合使用。
但是他還是有一定缺陷的:
如果資源更新的速度是秒以下單位,那么該緩存是不能被使用的,因為它的時間單位最低是秒。
如果文件是通過服務器動態生成的,那么該方法的更新時間永遠是生成的時間,盡管文件可能沒有變化,所以起不到緩存的作用。
我來完善它——Etag由于Last-modified還是存在缺陷的,盡管大多數情況下,會使用它,但當遇到我們上面所說的場景時,我們可能就需要了解一下,我們另一個小伙伴了——Etag。
Etag存儲的是文件的特殊標識(一般都是hash生成的),服務器存儲著文件的Etag字段,可以在與每次客戶端傳送If-no-match的字段進行比較,如果相等,則表示未修改,響應304;反之,則表示已修改,響應200狀態碼,返回數據。
最后,通過一張原理圖,我們來加深一下記憶:
至此為止,兩種緩存類型的緩存方式已經闡述完成了,不知你是否已經心中已經有個大致的印象,當別人問起時,你可以對答如流。希望我們一同進步吧,fighting。
瀏覽器行為引起的不同最后,我們來聊聊瀏覽器行為會引起緩存的變化吧。
下面說一下瀏覽器的行為會產生怎樣的請求:
刷新網頁 => 如果緩存沒有失效,瀏覽器會直接使用緩存;反之,則向服務器請求數據
手動刷新(F5) => 瀏覽器會認為緩存失效,在請求服務器時加上Cache-Control: max-age=0字段,然后詢問服務器數據是否更新。
強制刷新(Ctrl + F5) => 瀏覽器會直接忽略緩存,在請求服務器時加上Cache-Control: no-cache字段,然后重新向服務器拉取文件。
移動端的緩存處理在PC端或許這樣子的緩存機制就已經足夠了,因為PC端不需要為網絡的問題擔心。
但是,移動端卻不行,任何一個網絡請求的增加,對于移動端的加載消耗時間都是比較大的(誰叫移動端的網太差呢,3G、2G)。那么,上述的緩存有什么問題呢?其實,強制緩存是沒有太大問題的,因為只要緩存不到期,是不會想服務器發送請求的;但是如果是對比緩存的情況下,304的問題就比較巨大,因為它會造成無用的請求。每次在使用緩存前,都會向服務器發送請求確認,導致網絡的延時。
一次完美的緩存必須保證兩點:
數據緩存之后,盡量減少服務器的請求
如果資源更新的話,必須使得客戶端的資源一起更新。
所以,一般我們會運用的方式是:
在資源文件后面加上表示,如config.f1ec3.js、config.v1.js之類的,然后給資源設置較長的緩存時間,如一年
Cache-Control: max-age=31536000
這樣子,就不會造成304的回包現象。
然后一旦資源發生更新時,我們可以改變資源后面的標識符,實現靜態資源非覆蓋式更新。
本篇大致分析了瀏覽器緩存部分的分類情況,以及細化分析。主要可分為:
強制緩存
Expires字段
Cache-Control字段
對比緩存
Last-Modefied字段
Etag標識
瀏覽器行為引起的緩存變化
移動端的緩存策略
其實,在講述移動端的緩存策略時,并沒有分析的特別詳細,只是大致的講解了一下目前大家都在使用的緩存策略。可能之后,還會寫一篇移動端緩存的細分文章。
最后,如果你對我寫的有疑問,可以與我討論。如果我寫的有錯誤,歡迎指正。你喜歡我的博客,請給我關注Star~呦。大家一起總結一起進步。歡迎關注我的github博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91888.html
摘要:瀏覽器緩存只存在于每個單獨的客戶端,因此它是私有緩存。表示該資源既能被瀏覽器緩存,也能被任何中間人比如代理服務器等緩存。普通刷新會啟用協商緩存,忽略強緩存。只有在地址欄或收藏夾輸入網址通過鏈接引用資源等情況下,瀏覽器才會啟用強緩存。 前言 在訪問一個網頁時,客戶端會從服務器下載所需的資源。但是有些資源很少發生變動,例如 HTML、JS、CSS、圖片、字體文件等。如果每次加載頁面都從源服...
摘要:接下來的內容中我們將通過緩存位置緩存策略以及實際場景應用緩存策略來探討瀏覽器緩存機制。是運行在瀏覽器背后的獨立線程,一般可以用來實現緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說是性能優化中簡單高效的一種優化方式了。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,并且由于緩存文件可以重復利用,還可以減少帶寬,降低網絡負荷。對于一個數據請求來說,可以分為...
摘要:接下來的內容中我們將通過緩存位置緩存策略以及實際場景應用緩存策略來探討瀏覽器緩存機制。是運行在瀏覽器背后的獨立線程,一般可以用來實現緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說是性能優化中簡單高效的一種優化方式了。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,并且由于緩存文件可以重復利用,還可以減少帶寬,降低網絡負荷。 對于一個數據請求來說,可以分...
摘要:接下來的內容中我們將通過緩存位置緩存策略以及實際場景應用緩存策略來探討瀏覽器緩存機制。是運行在瀏覽器背后的獨立線程,一般可以用來實現緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說是性能優化中簡單高效的一種優化方式了。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,并且由于緩存文件可以重復利用,還可以減少帶寬,降低網絡負荷。 對于一個數據請求來說,可以分...
摘要:接下來的內容中我們將通過緩存位置緩存策略以及實際場景應用緩存策略來探討瀏覽器緩存機制。是運行在瀏覽器背后的獨立線程,一般可以用來實現緩存功能。在所有瀏覽器緩存中,覆蓋面基本是最大的。 一、前言 緩存可以說是性能優化中簡單高效的一種優化方式了。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,并且由于緩存文件可以重復利用,還可以減少帶寬,降低網絡負荷。 對于一個數據請求來說,可以分...
閱讀 1122·2021-09-22 15:32
閱讀 1722·2019-08-30 15:53
閱讀 3253·2019-08-30 15:53
閱讀 1404·2019-08-30 15:43
閱讀 453·2019-08-28 18:28
閱讀 2567·2019-08-26 18:18
閱讀 669·2019-08-26 13:58
閱讀 2528·2019-08-26 12:10