赞
踩
大家好,我是 灰臂麒麟 。
大家有没有遇到前端面试中有以下场景:
面试官:你好,请详细说一下浏览器缓存机制;
内心独白:心想,这道题我准备过。"浏览器分强缓存、协商缓存..."。这道题肯定没问题,拿下;
自己:浏览器在对资源文件的缓存机制分强缓存、弱缓存。强缓存优先于协商缓存,强缓存生效则直接使用强缓存,强缓存不生效则进行协商缓存。
面试官:很好,那详细说一下。浏览器缓存位置和详细的缓存过程吧。
内心独白:哇靠,这没准备啊。这下完蛋了。
自己:嗯....;
面试官:好的,那我们进行下一题吧。
不知道大家有没有遇到上面的情况。反正我是遇到过。本该对知识点了解不够透彻,导致我们给面试官留下知识面不彻底的影响,从而影响我们在面试官的面试印象;
下面我们就详细的说说浏览器缓存机制。话不多说,干点正事:
目录
强制缓存优先于协商缓存进行,若强缓存生效则直接使用强缓存,若强缓存不生效则进行协商缓存
协商缓存由 服务器 决定是否使用缓存;若协商缓存失效,那么就返回 200 ,重新返回资源和缓存标识,在存入浏览器缓存中;若协商缓存生效则返回 304 ,继续使用缓存。
注: HTTP2 的服务器推送功能,在 chrome106 版本后不可用;
强缓存 可以通过设置两种 HTTP Header 实现: Expires 和 Cache-Control 。强缓存标识在缓存期限不需要发送请求
Expires 是 HTTP/1.0 的产物。值代表的是服务器的时间,并且 Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效。
Cache-Control 出现于 HTTP/1.1 ,优先级高于 Expires 。该属性值标识支援会在 多少秒 后过期,需要再次请求。
字段 | 协议本版 | 缓存类型 | 响应头 | 请求头 |
---|---|---|---|---|
Expires | HTTP1.0 | 强缓存 | √ | × |
Cache-Control | HTTP1.1 | 强缓存 | √ | × |
Cache-Control 首部字段是 HTTP/ 1.1 中定义的缓存字段,其用于控制缓存的行为,可以组合使用多种指令,多个指令之前可以通过 “,” 分割
- // eg:
- Cache-Control: max-age: 3600, s-maxage=3600, public
- Cache-Control: no-cache
如果首次请求是没有 Cache-Control 和 Expires ;或者 Cache-Control 的属性设置为 no-cache 时 ,又或者如果 缓存过期了 。就需要发起请求验证资源是否需要更新。向服务器发送请求时,服务器会根据这个请求的 请求头 里的 If-Modified-Since 和 If-None-Match 来判断是否命中协商缓存,如果命中,则返回 304 状态码并且更新浏览器缓存有效期
字段 | Header类型 | 协议版本 | 缓存类型 |
---|---|---|---|
Last-Modified | Response(响应头) | HTTP1.0 | 协商缓存 |
If-Modified-Since | Request(请求头) | HTTP1.0 | 协商缓存 |
ETag | Responese(响应头) | HTTP1.1 | 协商缓存 |
If-None-Match | Request(请求头) | HTTP1.1 | 协商缓存 |
在资源请求的响应式头中没有出现 Expires 和 cache-control:max-age 字段值,并且没有限制 no-store ,并且设置了 Last-Modified ,那么浏览器默认会采用一个启发式的强缓存算法。
通常会根据响应头的 Date 减去 Last-Modified 值的 10% 作为缓存时间。
至此,本篇文章的内容结束了。文章有不对或不完整的地方,望多指点;
如果对你学习有所帮助,还请 点赞、评论、关注 ;
希望可爱你动动小手 关注订阅 ,一起进步期待你的三连支持;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。