持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
写在前面
关于浏览器缓存的考察,是面试过程最常遇见的问题了。其实问浏览器缓存,也就是想让你讲讲HTTP 缓存机制。
其实http缓存主要分为强缓存和协商缓存。
通过判断http相关头部Expires/Cache-Control是否命中强缓存,一旦命中,则浏览器直接读本地缓存,不会发起网络请求,浏览器状态码为200,form cache。
如不命中强缓存,协商缓存可以通过对比http相关头部Last-Modified / If-Modified-Since 和 Etag / If-None-Match,每次向服务器发送请求会带上缓存标识,如命中协商缓存服务器会返回304,Not Modified,表示浏览器可以使用本地缓存文件 ,否则返回200 OK正常请求最新数据。
强缓存
-
Expires
HTTP1.0 的产物。在 HTTP 1.1 的版本,Expires 被 Cache-Control 替代。
Expires 是由服务端返回的资源过期时间(GMT 日期格式/时间戳),若用户本地时间在过期时间前,则不 发送请求直接从本地获取资源。
-
Cache-Control
HTTP/1.1 产物。常见的取值有 private、public、no-cache、max-age,no-store,默认为 private。举个例子:cache-control: public, max-age= 31536000 表示这个资源会被缓存31536000秒(365天),在365天内再次请求这条数据,都会直接获取缓存数据库中的数据,直接使用。
Cache-Control 是用于页面缓存的通用消息头字段,可以通过指定指令来实现缓存机制。
协商缓存
-
ETag / If-None-Match
通过唯一标识来验证缓存。
优先级高于 Last-Modified / If-Modified-Since。
-
Last-Modified / If-Modified-Since
通过资源的最后修改时间来验证缓存。
优先级低于 ETag / If-None-Match。