[深刻01] 執行上下文
[深刻02] 原型鏈
[深刻03] 繼承
[深刻04] 事件循環
[深刻05] 柯里化 偏函數 函數記憶
[深刻06] 隱式轉換 和 運算符
[深刻07] 瀏覽器緩存機制(http緩存機制)
[深刻08] 前端安全
[深刻09] 深淺拷貝
[深刻10] Debounce Throttle
[深刻11] 前端路由
[深刻12] 前端模塊化
[深刻13] 觀察者模式 發佈訂閱模式 雙向數據綁定
[深刻14] canvas
[深刻15] webSocket
[深刻16] webpack
[深刻17] http 和 https
[深刻18] CSS-interview
[react] Hooks前端
[部署01] Nginx
[部署02] Docker 部署vue項目
[部署03] gitlab-CIvue
[源碼-webpack01-前置知識] AST抽象語法樹
[源碼-webpack02-前置知識] Tapable
[源碼-webpack03] 手寫webpack - compiler簡單編譯流程react
會顯示 from-cache (from-disk-cache),(from-memory-cache)
Expires的原理
1. 瀏覽器第一次向服務器請求資源,瀏覽器在請求資源的同時,在responder響應頭中加上Expires字段
2. 瀏覽器在接收到這個資源後,將這個資源和全部response header一塊兒緩存起來
- 因此,緩存命中的請求返回的header並非來自服務器,而是來自以前緩存的header
3. 瀏覽器再次請求這個資源時,先從緩存中尋找,找到這個資源後,拿出Expires跟當前的請求時間作比較
- 若是當前請求時間,在Expires指定的時間以前,就能命中強緩存,不然不能
- 注意:Expires是和瀏覽器本地時間做對比
4. 若是未命中緩存,則瀏覽器直接從服務器獲取資源,並更新response header中的Expires
複製代碼
表示該資源僅僅屬於發出請求的最終用戶,這將禁止中間服務器(如代理服務器)緩存此類資源,對於包含用戶我的信息的文件,能夠設置private
容許全部服務器緩存該資源
Cache-Control的原理
1. 瀏覽器第一次向服務器請求資源,服務器在返回資源的同時,在responder的header中加上Cache-Control字段
2. 瀏覽器在接收到這個資源後,會將這個資源和全部的response header一塊兒緩存起來
- 因此,緩存命中的請求返回的header並非來自服務器,而是來自以前緩存的header
3. 瀏覽器再次請求這個資源時,先從緩存中尋找,找到這個資源後,拿出Cache-Control和當前請求的時間作比較
- 若是當前請求時間,在Cache-Control表示的時間段內,就能命中強緩存,不然不能
4. 若是緩存未命中,則瀏覽器直接從服務器獲取資源,並更新response header中的 Cache-Control
複製代碼
Last-Modified If-None-Match
1. 瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在response的header加上Last-Modified的header
- 這個header表示這個資源在服務器上的最後修改時間
2. 瀏覽器再次跟服務器請求這個資源時,在request的header上加上If-Modified-Since的header
- 這個header的值就是上一次請求時返回的Last-Modified的值
3. 服務器再次收到資源請求時,根據瀏覽器傳過來If-Modified-Since和資源在服務器上的最後修改時間判斷資源是否有變化
- 若是沒有變化則返回304 Not Modified,可是不會返回資源內容;
- 若是有變化,就正常返回資源內容。
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 當服務器返回304 Not Modified的響應時,response header中不會再添加Last-Modified的header
// 由於既然資源沒有變化,那麼Last-Modified也就不會改變
4. 瀏覽器收到304的響應後,就會從緩存中加載資源
5. 若是協商緩存沒有命中,瀏覽器直接從服務器加載資源時,Last-Modified Header在從新加載的時候會被更新
- 下次請求時,If-Modified-Since會啓用上次返回的Last-Modified值
複製代碼
ETag 和 If-None-Match
1. 瀏覽器第一次跟服務器請求一個資源,服務器在返回這個資源的同時,在response的header加上ETag的header
- 這個header是服務器根據當前請求的資源生成的一個惟一標識,這個惟一標識是一個字符串
- 只要資源有變化這個串就不一樣,跟最後修改時間沒有關係,因此能很好的補充Last-Modified的問題
2. 瀏覽器再次跟服務器請求這個資源時,在request的header上加上If-None-Match的header,
- 這個header的值就是上一次請求時返回的ETag的值
3. 服務器再次收到資源請求時,根據瀏覽器傳過來If-None-Match而後再根據資源生成一個新的ETag
- 若是沒有變化則返回304 Not Modified,可是不會返回資源內容
- 若是有變化,就正常返回資源內容。
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 與Last-Modified不同的是,當服務器返回304 Not Modified的響應時
// 因爲ETag從新生成過,response header中還會把這個ETag返回,即便這個ETag跟以前的沒有變化
4. 瀏覽器收到304的響應後,就會從緩存中加載資源。
複製代碼
可是ETag相對於Last-Modified也有其優點,能夠更加準確的判斷文件內容是否被修改,從而在實際操做中實用程度也更高。
juejin.im/post/5b9346…webpack