面试官:说一下浏览器缓存?

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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。

image.png

image.png