最新文章專題視頻專題關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
新手求教:我的floatDIV空白了_html/css_WEB-ITnose 瀏覽器樣式問題_html/css_WEB-ITnose 天氣預(yù)報(bào)插件屏蔽超鏈接_html/css_WEB-ITnose 新手,請(qǐng)教個(gè)問題,_html/css_WEB-ITnose 瀏覽器地址欄網(wǎng)址始終只顯示主域名問題_html/css_WEB-ITnose 來說說比較一個(gè)那位的方法是最高效的:當(dāng)頁面因html標(biāo)簽錯(cuò)誤(少/多/錯(cuò)匹配)而錯(cuò)亂時(shí)_html/css_WEB-ITnose 新手求助:如何讓javascript,css等代碼適合跨瀏覽器預(yù)覽_html/css_WEB-ITnose 織夢(mèng)會(huì)員后臺(tái)發(fā)表說說帶圖片就會(huì)出現(xiàn)亂碼_html/css_WEB-ITnose 瀏覽器CSSHack收集_html/css_WEB-ITnose 瀏覽器不兼容的問題_html/css_WEB-ITnose 說說移動(dòng)前端中viewport(視口)_html/css_WEB-ITnose 瀏覽器Lexer與XSS-HTML編碼_html/css_WEB-ITnose 史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose 新手一枚,望大神幫忙看一下啊代碼,html+js,為嘛js代碼不起作用_html/css_WEB-ITnose CSS魔法堂:說說Float那個(gè)被埋沒的志向_html/css_WEB-ITnose 瀏覽器的工作原理:新式網(wǎng)絡(luò)瀏覽器幕后揭秘_html/css_WEB-ITnose 新手,新寫的INPUT函數(shù)的VALUE值顯示不了。_html/css_WEB-ITnose 瀏覽器hack總結(jié)詳細(xì)的瀏覽器兼容性解決方法 虎扯:純css3各方向小三角的制作原理分析-小老虎的牙 瀏覽器內(nèi)部工作原理-jerrylsxu 瀏覽器顯示tomcat的favicon.ico問題_html/css_WEB-ITnose 瀏覽器CSS兼容問題匯總及解決_html/css_WEB-ITnose 史上最全前端面試題(含答案)_html/css_WEB-ITnose 瀏覽器工作原理_html/css_WEB-ITnose 瀏覽器兼容性常見_html/css_WEB-ITnose 新手的成長記錄點(diǎn)滴(十)_html/css_WEB-ITnose 瀏覽器得到地址欄的相關(guān)信息_html/css_WEB-ITnose 新手求一個(gè)div排版_html/css_WEB-ITnose 瀏覽器渲染原理_html/css_WEB-ITnose 新手關(guān)于canvas的問題_html/css_WEB-ITnose 瀏覽器內(nèi)核總結(jié) 瀏覽器緩存分析_html/css_WEB-ITnose 新手求教:關(guān)于定位和z-index不起作用的問題,請(qǐng)各位大神幫忙,在線等_html/css_WEB-ITnose 瀏覽器縮小后頁面變形_html/css_WEB-ITnose 新手提問,菜單瀏覽效果的問題_html/css_WEB-ITnose 說說css3布局_html/css_WEB-ITnose 瀏覽器兼容性問題及常見的解決方法_html/css_WEB-ITnose 史上最全的csshack(ie6-9,firefox,chrome,opera,safari)_html/css_WEB-ITnose 新手問個(gè)小問題,_html/css_WEB-ITnose 瀏覽器端Less_html/css_WEB-ITnose
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

瀏覽器緩存,想說愛你不容易_html/css_WEB-ITnose

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 16:30:06
文檔

瀏覽器緩存,想說愛你不容易_html/css_WEB-ITnose

瀏覽器緩存,想說愛你不容易_html/css_WEB-ITnose:。今天小微開店寶在測試環(huán)境發(fā)布更新的時(shí)候,同事問:為什么我需要手動(dòng)清理瀏覽器緩存才能看到變更?難道系統(tǒng)上線后也需要客戶自己清理瀏覽器緩存嗎!看來,這個(gè)坑需要我來填了。 什么是瀏覽器緩存 瀏覽器緩存(Brower Caching)是瀏覽器在本地磁盤對(duì)用戶
推薦度:
導(dǎo)讀瀏覽器緩存,想說愛你不容易_html/css_WEB-ITnose:。今天小微開店寶在測試環(huán)境發(fā)布更新的時(shí)候,同事問:為什么我需要手動(dòng)清理瀏覽器緩存才能看到變更?難道系統(tǒng)上線后也需要客戶自己清理瀏覽器緩存嗎!看來,這個(gè)坑需要我來填了。 什么是瀏覽器緩存 瀏覽器緩存(Brower Caching)是瀏覽器在本地磁盤對(duì)用戶

??今天小微開店寶在測試環(huán)境發(fā)布更新的時(shí)候,同事問:“為什么我需要手動(dòng)清理瀏覽器緩存才能看到變更?難道系統(tǒng)上線后也需要客戶自己清理瀏覽器緩存嗎!”看來,這個(gè)坑需要我來填了。

什么是瀏覽器緩存

瀏覽器緩存(Brower Caching)是瀏覽器在本地磁盤對(duì)用戶最近請(qǐng)求過的文檔進(jìn)行存儲(chǔ),當(dāng)訪問者再次訪問同一頁面時(shí),瀏覽器就可以直接從本地磁盤加載文檔。

瀏覽器緩存的優(yōu)點(diǎn)有:

  1. 減少了冗余的數(shù)據(jù)傳輸,節(jié)省了網(wǎng)費(fèi)
  2. 減少了服務(wù)器的負(fù)擔(dān),大大提升了網(wǎng)站的性能
  3. 加快了客戶端加載網(wǎng)頁的速度

在前端開發(fā)面試中,瀏覽器緩存是web性能優(yōu)化面試題中很重要的一個(gè)知識(shí)點(diǎn),從而說明瀏覽器緩存是提升web性能的一大利器,但是瀏覽器緩存如果使用不當(dāng),也會(huì)產(chǎn)生很多問題,正所謂是,想說愛你,并不是很容易的事。所以,結(jié)合最近遇到的案例,本文對(duì)瀏覽器緩存相關(guān)的知識(shí)進(jìn)行總結(jié)歸納,希望對(duì)讀者有所幫助。

瀏覽器緩存的分類

瀏覽器緩存主要有兩類:緩存協(xié)商和徹底緩存,也有稱之為協(xié)商緩存和強(qiáng)緩存。

瀏覽器在第一次請(qǐng)求發(fā)生后,再次請(qǐng)求時(shí):

  1. 瀏覽器會(huì)先獲取該資源緩存的header信息,根據(jù)其中的expires和cahe-control判斷是否命中強(qiáng)緩存,若命中則直接從緩存中獲取資源,包括緩存的header信息,本次請(qǐng)求不會(huì)與服務(wù)器進(jìn)行通信;
  2. 如果沒有命中強(qiáng)緩存,瀏覽器會(huì)發(fā)送請(qǐng)求到服務(wù)器,該請(qǐng)求會(huì)攜帶第一次請(qǐng)求返回的有關(guān)緩存的header字段信息(Last-Modified/IF-Modified-Since、Etag/IF-None-Match),由服務(wù)器根據(jù)請(qǐng)求中的相關(guān)header信息來對(duì)比結(jié)果是否命中協(xié)商緩存,若命中,則服務(wù)器返回新的響應(yīng)header信息更新緩存中的對(duì)應(yīng)header信息,但是并不返回資源內(nèi)容,它會(huì)告知瀏覽器可以直接從緩存獲?。环駝t返回最新的資源內(nèi)容

強(qiáng)緩存

強(qiáng)緩存是利用http的返回頭中的Expires或者Cache-Control兩個(gè)字段來控制的,用來表示資源的緩存時(shí)間。

Expires
該字段是http1.0時(shí)的規(guī)范,它的值為一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串,比如Expires:Mon,18 Oct 2066 23:59:59 GMT。這個(gè)時(shí)間代表著這個(gè)資源的失效時(shí)間,在此時(shí)間之前,即命中緩存。這種方式有一個(gè)明顯的缺點(diǎn),由于失效時(shí)間是一個(gè)絕對(duì)時(shí)間,所以當(dāng)服務(wù)器與客戶端時(shí)間偏差較大時(shí),就會(huì)導(dǎo)致緩存混亂。

Cache-Control
Cache-Control是http1.1時(shí)出現(xiàn)的header信息,主要是利用該字段的max-age值來進(jìn)行判斷,它是一個(gè)相對(duì)時(shí)間,例如Cache-Control:max-age=3600,代表著資源的有效期是3600秒。cache-control除了該字段外,還有下面幾個(gè)比較常用的設(shè)置值:

  • no-cache:不使用本地緩存。需要使用緩存協(xié)商,先與服務(wù)器確認(rèn)返回的響應(yīng)是否被更改,如果之前的響應(yīng)中存在ETag,那么請(qǐng)求的時(shí)候會(huì)與服務(wù)端驗(yàn)證,如果資源未被更改,則可以避免重新下載。
  • no-store:直接禁止游覽器緩存數(shù)據(jù),每次用戶請(qǐng)求該資源,都會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,每次都會(huì)下載完整的資源。
  • public:可以被所有的用戶緩存,包括終端用戶和CDN等中間代理服務(wù)器。
  • private:只能被終端用戶的瀏覽器緩存,不允許CDN等中繼緩存服務(wù)器對(duì)其緩存。
  • Cache-Control與Expires可以在服務(wù)端配置同時(shí)啟用,同時(shí)啟用的時(shí)候Cache-Control優(yōu)先級(jí)高。

    協(xié)商緩存

    協(xié)商緩存就是由服務(wù)器來確定緩存資源是否可用,所以客戶端與服務(wù)器端要通過某種標(biāo)識(shí)來進(jìn)行通信,從而讓服務(wù)器判斷請(qǐng)求資源是否可以緩存訪問,這主要涉及到下面兩組header字段,這兩組搭檔都是成對(duì)出現(xiàn)的,即第一次請(qǐng)求的響應(yīng)頭帶上某個(gè)字段(Last-Modified或者Etag),則后續(xù)請(qǐng)求則會(huì)帶上對(duì)應(yīng)的請(qǐng)求字段(If-Modified-Since或者If-None-Match),若響應(yīng)頭沒有Last-Modified或者Etag字段,則請(qǐng)求頭也不會(huì)有對(duì)應(yīng)的字段。

    Last-Modify/If-Modify-Since

    瀏覽器第一次請(qǐng)求一個(gè)資源的時(shí)候,服務(wù)器返回的header中會(huì)加上Last-Modify,Last-modify是一個(gè)時(shí)間標(biāo)識(shí)該資源的最后修改時(shí)間,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。

    當(dāng)瀏覽器再次請(qǐng)求該資源時(shí),request的請(qǐng)求頭中會(huì)包含If-Modify-Since,該值為緩存之前返回的Last-Modify。服務(wù)器收到If-Modify-Since后,根據(jù)資源的最后修改時(shí)間判斷是否命中緩存。

    如果命中緩存,則返回304,并且不會(huì)返回資源內(nèi)容,并且不會(huì)返回Last-Modify。

    ETag/If-None-Match

    與Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一個(gè)校驗(yàn)碼。ETag可以保證每一個(gè)資源是唯一的,資源變化都會(huì)導(dǎo)致ETag變化。服務(wù)器根據(jù)瀏覽器上送的If-None-Match值來判斷是否命中緩存。

    與Last-Modified不一樣的是,當(dāng)服務(wù)器返回304 Not Modified的響應(yīng)時(shí),由于ETag重新生成過,response header中還會(huì)把這個(gè)ETag返回,即使這個(gè)ETag跟之前的沒有變化。

    為什么要有Etag

    你可能會(huì)覺得使用Last-Modified已經(jīng)足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還需要Etag呢?HTTP1.1中Etag的出現(xiàn)主要是為了解決幾個(gè)Last-Modified比較難解決的問題:

  • 一些文件也許會(huì)周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了,而重新GET;
  • 某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改,(比方說1s內(nèi)修改了N次),If-Modified-Since能檢查到的粒度是s級(jí)的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒);
  • 某些服務(wù)器不能精確的得到文件的最后修改時(shí)間。
  • Last-Modified與ETag是可以一起使用的,服務(wù)器會(huì)優(yōu)先驗(yàn)證ETag,一致的情況下,才會(huì)繼續(xù)比對(duì)Last-Modified,最后才決定是否返回304。

    強(qiáng)緩存與協(xié)商緩存的區(qū)別可以用下表來表示:
    ?|獲取資源形式|狀態(tài)碼|發(fā)送請(qǐng)求到服務(wù)器
    ------|------------|------|----------------
    強(qiáng)緩存|從緩存取 |200(from cache)|否,直接從緩存取
    協(xié)商緩存|從緩存取|304(Not Modified)|否,通過服務(wù)器來告知緩存是否可用

    用戶行為對(duì)緩存的影響 用戶操作 Expires/Cache-Control Last-Modied/Etag
    地址欄回車 有效 有效
    頁面鏈接跳轉(zhuǎn) 有效 有效
    新開窗口 有效 有效
    前進(jìn)回退 有效 有效
    F5刷新 無效 有效
    Ctrl+F5強(qiáng)制刷新 無效 無效
    實(shí)際問題分析

    如文章開頭所屬,代碼更新到線上后用戶瀏覽器不能自行更新,我們不能要求客戶在系統(tǒng)更新后都進(jìn)行一次緩存清理的操作。

    到底該如何解決呢?

    在資源請(qǐng)求的URL中增加一個(gè)參數(shù),比如:js/mian.js?ver=0.7.1。這個(gè)參數(shù)是一個(gè)版本號(hào),每一次部署的時(shí)候變更一下,當(dāng)這個(gè)參數(shù)變化的時(shí)候,強(qiáng)緩存都會(huì)失效并重新加載。這樣一來,靜態(tài)資源,部署以后就需要重新加載。這樣就比較完美的解決了問題。

    進(jìn)一步思考

    這樣做是不是最完美的呢?很遺憾,不是。

    百度張?jiān)讫埥o出了這樣做的弊端,有興趣可參照下文:
    靜態(tài)資源版本更新與緩存

    謝謝!

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:0731-84117792 E-MAIL:11247931@qq.com

    文檔

    瀏覽器緩存,想說愛你不容易_html/css_WEB-ITnose

    瀏覽器緩存,想說愛你不容易_html/css_WEB-ITnose:。今天小微開店寶在測試環(huán)境發(fā)布更新的時(shí)候,同事問:為什么我需要手動(dòng)清理瀏覽器緩存才能看到變更?難道系統(tǒng)上線后也需要客戶自己清理瀏覽器緩存嗎!看來,這個(gè)坑需要我來填了。 什么是瀏覽器緩存 瀏覽器緩存(Brower Caching)是瀏覽器在本地磁盤對(duì)用戶
    推薦度:
    標(biāo)簽: 瀏覽器 緩存 不會(huì)
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top