摘要:瀏覽器讀取資源的流程瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的和判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。實(shí)際上是會(huì)被緩存的,只不過(guò)每次在向客戶端瀏覽器提供響應(yīng)數(shù)據(jù)時(shí),緩存都要向服務(wù)器評(píng)估緩存響應(yīng)的有效性。
瀏覽器讀取資源的流程
瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的expires和cache-control判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。
如果沒(méi)有命中強(qiáng)緩存,瀏覽器一定會(huì)發(fā)送一個(gè)請(qǐng)求到服務(wù)器,通過(guò)last-modified或者etag驗(yàn)證資源是否命中協(xié)商緩存,如果命中,服務(wù)器會(huì)將這個(gè)請(qǐng)求返回,但是不會(huì)返回這個(gè)資源的數(shù)據(jù),依然是從緩存中讀取資源
如果前面兩者都沒(méi)有命中,直接從服務(wù)器加載資源
強(qiáng)制緩存(不發(fā)送請(qǐng)求)
如何設(shè)置
通常我們會(huì)同時(shí)設(shè)置expires和cache-control兩種,保證無(wú)論在http1還是1.1的情況下都有效
expires
過(guò)期時(shí)間,如果設(shè)置了時(shí)間,則瀏覽器會(huì)在設(shè)置的時(shí)間內(nèi)直接讀取緩存,不再請(qǐng)求
cache-control
http1.1新標(biāo)準(zhǔn),包括這些屬性:
(1)max-age:用來(lái)設(shè)置資源(representations)可以被緩存多長(zhǎng)時(shí)間,單位為秒; (2)s-maxage:和max-age是一樣的,不過(guò)它只針對(duì)代理服務(wù)器緩存而言; (3)public:指示響應(yīng)可被任何緩存區(qū)緩存; (4)private:只能針對(duì)個(gè)人用戶,而不能被代理服務(wù)器緩存; (5)no-cache:強(qiáng)制客戶端直接向服務(wù)器發(fā)送請(qǐng)求,也就是說(shuō)每次請(qǐng)求都必須向服務(wù)器發(fā)送。服務(wù)器接收到請(qǐng)求,然后判斷資源是否變更,是則返回新內(nèi)容,否則返回304,未變更。這個(gè)很容易讓人產(chǎn)生誤解,使人誤以為是響應(yīng)不被緩存。實(shí)際上Cache-Control:no-cache是會(huì)被緩存的,只不過(guò)每次在向客戶端(瀏覽器)提供響應(yīng)數(shù)據(jù)時(shí),緩存都要向服務(wù)器評(píng)估緩存響應(yīng)的有效性。 (6)no-store:禁止一切緩存(這個(gè)才是響應(yīng)不被緩存的意思)。
緩存的兩種表現(xiàn)形式
memory cache
來(lái)自于內(nèi)存的數(shù)據(jù),會(huì)隨著進(jìn)程的結(jié)束而清除,讀取速度相對(duì)快(0ms)
一般存放腳本,圖片,字體等文件
disk cache
來(lái)自于硬盤(pán)的數(shù)據(jù),不會(huì)隨著進(jìn)程的結(jié)束而清除,讀取速度慢于memory cache(2-10ms 硬盤(pán)讀寫(xiě)的IO操作)
一般存放css文件
根據(jù)經(jīng)驗(yàn)情況來(lái)看:瀏覽器的實(shí)際處理邏輯是這樣的
首次加載資源 -> 200 -> 關(guān)閉標(biāo)簽頁(yè)
再次進(jìn)入 -> 200 from disk cache -> 刷新 -> 200 from memory cache
(不過(guò)好像css都是from disk cache, base64都是from memory cache)
客戶端向服務(wù)端發(fā)送請(qǐng)求時(shí)候(沒(méi)有命中強(qiáng)制緩存),服務(wù)端會(huì)檢查是否有對(duì)應(yīng)的標(biāo)識(shí),沒(méi)有則返回200并生成一個(gè)新的標(biāo)識(shí)帶到header,下次在請(qǐng)求的時(shí)候服務(wù)端檢查到對(duì)應(yīng)的這個(gè)標(biāo)識(shí)并做相應(yīng)的校驗(yàn),通過(guò)則返回304,讀取緩存。
Last-modify / If-modify-since
瀏覽器首次請(qǐng)求資源的時(shí)候,服務(wù)器會(huì)返回一個(gè)last-Modify到header中. Last-Modify 含義是最后的修改時(shí)間。
當(dāng)瀏覽器再次請(qǐng)求的時(shí)候,request header會(huì)帶上 if-Modify-Since,該值為之前返回的 Last-Modify。服務(wù)器收到if-Modify-Since后,根據(jù)資源的最后修改時(shí)間(last-Modify)和該值(if-Modify-Since)進(jìn)行比較,如果相等的話,則命中緩存,返回304,否則, 則會(huì)給出200響應(yīng),并且更新Last-Modify為新的值
Etag / If-none-match(http1.1規(guī)范)
ETag的原理和上面的last-modified是類(lèi)似的。ETag對(duì)當(dāng)前請(qǐng)求的資源做一個(gè)唯一的標(biāo)識(shí)。該標(biāo)識(shí)可以是一個(gè)字符串,文件的size,hash等。只要能夠合理標(biāo)識(shí)資源的唯一性并能驗(yàn)證是否修改過(guò)就可以了。ETag在服務(wù)器響應(yīng)請(qǐng)求的時(shí)候,返回當(dāng)前資源的唯一標(biāo)識(shí)(它是由服務(wù)器生成的)。但是只要資源有變化,ETag會(huì)重新生成的。瀏覽器再下一次加載的時(shí)候會(huì)向服務(wù)器發(fā)送請(qǐng)求,會(huì)將上一次返回的ETag值放到request header 里的 if-None-Match里面去,服務(wù)器端只要比較客戶端傳來(lái)的if-None-Match值是否和自己服務(wù)器上的ETag是否一致,如果一致說(shuō)明資源未修改過(guò),因此返回304,如果不一致,說(shuō)明修改過(guò),因此返回200。并且把新的Etag賦值給if-None-Match來(lái)更新該值。
在精度上,ETag要優(yōu)先于 last-modified。
last-modified這種方式精度差在哪里:
a. 一些文件也許會(huì)周期性的更改,但是他的內(nèi)容并不改變(僅僅改變的修改時(shí)間),這個(gè)時(shí)候我們并不希望客戶端認(rèn)為這個(gè)文件被修改了
b. 某些文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改,(比方說(shuō)1s內(nèi)修改了N次),If-Modified-Since能檢查到的粒度是s級(jí)的,這種修改無(wú)法判斷(或者說(shuō)UNIX記錄MTIME只能精確到秒);
在性能上,Etag要遜于Last-Modified,Last-Modified需要記錄時(shí)間,而Etag需要服務(wù)器通過(guò)算法來(lái)計(jì)算出一個(gè)hash值。
在優(yōu)先級(jí)上,服務(wù)器校驗(yàn)優(yōu)先考慮Etag。
如何設(shè)置index.html不被緩存文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/62101.html
摘要:瀏覽器讀取資源的流程瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的和判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。實(shí)際上是會(huì)被緩存的,只不過(guò)每次在向客戶端瀏覽器提供響應(yīng)數(shù)據(jù)時(shí),緩存都要向服務(wù)器評(píng)估緩存響應(yīng)的有效性。 瀏覽器讀取資源的流程 瀏覽器在加載資源時(shí),根據(jù)請(qǐng)求頭的expires和cache-control判斷是否命中強(qiáng)緩存,是則直接從緩存讀取資源,不會(huì)發(fā)請(qǐng)求到服務(wù)器。 如果...
摘要:對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn)信息今天我就來(lái)談?wù)勎覍?duì)的理解是什么全稱(chēng)是即內(nèi)容分發(fā)網(wǎng)絡(luò)。將網(wǎng)站內(nèi)容發(fā)布到接近用戶的服務(wù)器上。用戶訪問(wèn)網(wǎng)站時(shí),用戶訪問(wèn)就近服務(wù)器,然后加載這些資源。 對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn):CDN、HTTP header信息 今天我就來(lái)談?wù)勎覍?duì)cdn的理解 1、CDN是什么:CDN全稱(chēng)是Content Delivery Network,即內(nèi)容...
摘要:對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn)信息今天我就來(lái)談?wù)勎覍?duì)的理解是什么全稱(chēng)是即內(nèi)容分發(fā)網(wǎng)絡(luò)。將網(wǎng)站內(nèi)容發(fā)布到接近用戶的服務(wù)器上。用戶訪問(wèn)網(wǎng)站時(shí),用戶訪問(wèn)就近服務(wù)器,然后加載這些資源。 對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn):CDN、HTTP header信息 今天我就來(lái)談?wù)勎覍?duì)cdn的理解 1、CDN是什么:CDN全稱(chēng)是Content Delivery Network,即內(nèi)容...
摘要:對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn)信息今天我就來(lái)談?wù)勎覍?duì)的理解是什么全稱(chēng)是即內(nèi)容分發(fā)網(wǎng)絡(luò)。將網(wǎng)站內(nèi)容發(fā)布到接近用戶的服務(wù)器上。用戶訪問(wèn)網(wǎng)站時(shí),用戶訪問(wèn)就近服務(wù)器,然后加載這些資源。 對(duì)于前端性能優(yōu)化我們不得不了解的幾個(gè)知識(shí)點(diǎn):CDN、HTTP header信息 今天我就來(lái)談?wù)勎覍?duì)cdn的理解 1、CDN是什么:CDN全稱(chēng)是Content Delivery Network,即內(nèi)容...
閱讀 2572·2021-09-23 11:21
閱讀 1882·2021-09-22 15:15
閱讀 970·2021-09-10 11:27
閱讀 3440·2019-08-30 15:54
閱讀 651·2019-08-30 15:52
閱讀 1335·2019-08-30 15:44
閱讀 2349·2019-08-29 15:06
閱讀 2972·2019-08-28 18:21