1.強緩存(Expires和Cache-Control)
a.強緩存是瀏覽器直接從本地緩存中加載資源,而不發(fā)送請求到服務(wù)器。
i.Expires頭部: 服務(wù)器響應(yīng)時,通過設(shè)置Expires頭部指定資源的到期時間,瀏覽器會在到期時間之前直接從緩存加載資源。這個時間是資源到期的絕對時間,由服務(wù)器返回。
ii.Cache-Control頭部: Cache-Control頭部提供了更加靈活和景區(qū)的緩存控制,可以通過設(shè)置max-age指令來制定資源緩存的最大時間(秒)。例如,Cache-Control: max-age=3600表示資源將在3600秒后過期
2.協(xié)商緩存(Last-Modified和ETag)
a.協(xié)商緩存是瀏覽器在本地緩存中儲存資源的驗證表示(通常是最后修改時間或者實體標(biāo)簽),在下次請求資源師,瀏覽器會發(fā)送一個條件請求到服務(wù)器,通過驗證表示檢查資源是否已經(jīng)被修改,從而決定是否使用緩存的資源。
i.Last-Modified和If-Modified-Since頭部: 服務(wù)器響應(yīng)時,通過設(shè)置Last-Modified頭部指定資源的最后修改時間。瀏覽器在后續(xù)請求時會發(fā)送If-Modified-Since頭部,如果資源在此時間之后未發(fā)生改變,服務(wù)器會返回304 Not Modified狀態(tài)碼,告訴瀏覽器可以使用緩存的資源
ii.ETag和If-None-Match頭部: 服務(wù)器響應(yīng)時,通過設(shè)置ETag頭部提供資源的實體標(biāo)簽。瀏覽器在后續(xù)請求時會發(fā)送If-None-Match頭部,如果資源的實體標(biāo)簽未發(fā)生改變,服務(wù)器會返回304 Not Modified狀態(tài)碼。
備注:選擇緩存策略
1.強緩存通常優(yōu)先于協(xié)商緩存,因為它不需要服務(wù)器的驗證,直接從本地獲取資源。這對于靜態(tài)資源或者不經(jīng)常更新的資源非常有效
2.協(xié)商緩存在資源更新時更具靈活性,它依賴于服務(wù)器的驗證,可以確保客戶端獲取到的是最新版的資源。經(jīng)常用于更新的資源或者需要動態(tài)生成的資源。
部署前端 (html 協(xié)商 css之類 強緩存 覆蓋式更新可以通過上cdn的方式解決)
注:
- Cache-Control 并不是專門用于強緩存,它可能作用于瀏覽器、代理服務(wù)器或者任何中間服務(wù),它本身標(biāo)識了內(nèi)容的可緩存性質(zhì)。Expires作用類似,但已經(jīng)被廢棄。目前能精準(zhǔn)控制的強緩存是利用Cache API和Service worker實現(xiàn)的,上一代的技術(shù)App manifest也能做到,但已經(jīng)被廢棄
- 現(xiàn)代架構(gòu)中,靜態(tài)資源一般不會直接部署到CDN邊緣節(jié)點上,而是部署在源站,邊緣節(jié)點按需拉取,有些大型的CDN網(wǎng)絡(luò)還會有分層緩存。