[深入07] 浏览器缓存机制(http缓存机制)

2021-08-01  本文已影响0人  woow_wu7

导航

[深入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
[深入19] 手写Promise
[深入20] 手写函数

[react] Hooks

[部署01] Nginx
[部署02] Docker 部署vue项目
[部署03] gitlab-CI

[源码-webpack01-前置知识] AST抽象语法树
[源码-webpack02-前置知识] Tapable
[源码-webpack03] 手写webpack - compiler简单编译流程
[源码] Redux React-Redux01
[源码] axios
[源码] vuex
[源码-vue01] data响应式 和 初始化渲染
[源码-vue02] computed 响应式 - 初始化,访问,更新过程

缓存的重要性

浏览器缓存

强缓存

Expires

Expires的原理

1. 浏览器第一次向服务器请求资源,浏览器在请求资源的同时,在responder响应头中加上Expires字段
2. 浏览器在接收到这个资源后,将这个资源和所有response header一起缓存起来
   - 所以,缓存命中的请求返回的header并不是来自服务器,而是来自之前缓存的header
3. 浏览器再次请求这个资源时,先从缓存中寻找,找到这个资源后,拿出Expires跟当前的请求时间做比较
   - 如果当前请求时间,在Expires指定的时间之前,就能命中强缓存,否则不能
   - 注意:Expires是和浏览器本地时间作对比
4. 如果未命中缓存,则浏览器直接从服务器获取资源,并更新response header中的Expires

Cache-Control

Cache-Control的原理

1. 浏览器第一次向服务器请求资源,服务器在返回资源的同时,在responder的header中加上Cache-Control字段
2. 浏览器在接收到这个资源后,会将这个资源和所有的response header一起缓存起来
   - 所以,缓存命中的请求返回的header并不是来自服务器,而是来自之前缓存的header
3. 浏览器再次请求这个资源时,先从缓存中寻找,找到这个资源后,拿出Cache-Control和当前请求的时间做比较
   - 如果当前请求时间,在Cache-Control表示的时间段内,就能命中强缓存,否则不能
4. 如果缓存未命中,则浏览器直接从服务器获取资源,并更新response header中的 Cache-Control

强缓存Expires和Cache-Control总结

协商缓存

Last-Modified 和 If-Modified-Since

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

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的响应后,就会从缓存中加载资源。

Last-Modified(If-Modified-Since) 和 ETag(If-None-Match) 的区别

强缓存和协商缓存的区别

浏览器缓存判断的流程

  1. 第一次正常请求后,缓存了资源和所有header的前提下
  2. 在资源缓存后,在缓存过期失效之前,如果再次请求该资源,<font color=red>默认先检查强缓存</font>
    • 强缓存命中,则直接读取
    • 未命中强缓存,则发送请求到服务器,<font color=red>再检查是否命中协商缓存</font>
  3. 未命中强缓存,再发请求到服务器检查是否命中协商缓存
    • 协商缓存命中,则告诉浏览器还是可以从缓存读取
    • 未命中协商缓存,才从服务器返回最新的资源
image

https://juejin.im/post/6844903672556552205#heading-0

上一篇下一篇

猜你喜欢

热点阅读