?。。。∽约簩W(xué)習(xí)理解用,僅供參考?。。。?/h3>
瀏覽器緩存策略分為兩種 強(qiáng)緩存(本地緩存) 和 協(xié)商緩存(弱緩存)。
瀏覽器在發(fā)請(qǐng)求前,先檢查強(qiáng)緩存,若沒有需要的內(nèi)容(未命中),則發(fā)起請(qǐng)求判斷是否需要用弱緩存。
1、簡(jiǎn)單的概括
強(qiáng)緩存是不發(fā)起請(qǐng)求,直接使用緩存內(nèi)的內(nèi)容的。瀏覽器將js、css、image、font-family等存到內(nèi)存(存小文件)或者磁盤(存大文件)中,下次用戶再訪問的時(shí)候就從內(nèi)存中取,以便提升性能。
協(xié)商緩存需要往后臺(tái)發(fā)請(qǐng)求, 通過判斷來(lái)決定是使用協(xié)商緩存。如果請(qǐng)求內(nèi)容沒發(fā)生變化,則請(qǐng)求返回304(服務(wù)器收到請(qǐng)求,但內(nèi)容無(wú)變化),瀏覽器就用緩存內(nèi)的內(nèi)容。
2、強(qiáng)緩存如何觸發(fā)
http1.0 使用 Expires 響應(yīng)標(biāo)頭
如果服務(wù)器返回的響應(yīng)標(biāo)頭中包含Expires(時(shí)間戳),那么客戶端發(fā)起請(qǐng)求的時(shí)間在Expires之前的話,就觸發(fā)強(qiáng)緩存。
http1.1 使用 Cache-Control 響應(yīng)標(biāo)頭
同樣是服務(wù)器返回的一個(gè)響應(yīng)標(biāo)頭, 提供一些配置選項(xiàng),其優(yōu)先級(jí)比Expires高。(來(lái)源:百度百科)

常用的配置就是
public、private、max-age。 下面這個(gè)例子是從某個(gè)網(wǎng)站的請(qǐng)求中copy來(lái)的,僅供參考。
cache-control: 'private, must-revalidate, no-cache, no-store, max-age=0, post-check=0, pre-check=0'
3、協(xié)商緩存怎么觸發(fā)
http1.0 使用 請(qǐng)求頭:If-Modified-Since , 響應(yīng)頭:Last-Modified
服務(wù)器在上一次響應(yīng)請(qǐng)求時(shí),返回一個(gè)帶Last-Modified的響應(yīng)頭,值為一個(gè)時(shí)間戳,表示該資源最后一次在服務(wù)器修改的時(shí)間。當(dāng)客戶端再一次請(qǐng)求這個(gè)資源的時(shí)候, 請(qǐng)求頭就會(huì)帶上If-Modified-Since,值為上次服務(wù)器發(fā)來(lái)的Last-Modified, 服務(wù)器收到后,就和該資源最后修改時(shí)間比對(duì), 沒變化就返回304, 觸發(fā)協(xié)商緩存。
弊端: 時(shí)間間隔最小為1s,如果請(qǐng)求的資源在1s內(nèi)發(fā)生了改變,是可能會(huì)觸發(fā)協(xié)商緩存的, 導(dǎo)致無(wú)法獲取到最新的資源。
http1.1 使用 請(qǐng)求頭:If-None-Match , 響應(yīng)頭: Etag
為解決間隔最小1s的問題, If-None-Match和Etag就誕生了。 Etag是由服務(wù)器生成的, 是每個(gè)資源的唯一標(biāo)識(shí)字符串, 隨資源變化而改變。 判斷過程和http1.0的一致,請(qǐng)求的時(shí)候攜帶 If-None-Match,然后服務(wù)器比較這兩個(gè)值,沒變化就返回304, 觸發(fā)協(xié)商緩存。
弊端: 占用服務(wù)器資源較多, 雖然準(zhǔn)確度高,但是性能上不如Last-Modified & If-Modified-Since的方法。不過實(shí)際的影響不會(huì)很大, 基本上可以忽略不計(jì)。
補(bǔ)充
即便我們沒有配置緩存策略,瀏覽器也會(huì)采用自己的算法來(lái)緩存資源。