面试官:说一下前端缓存

3,489 阅读4分钟

简单回答

缓存对于前端性能优化来说是个很重要的点,良好的缓存策略可以降低资源的重复加载提高网页的整体加载速度。 通常浏览器缓存策略分为两种:强缓存和协商缓存

  1. 强缓存:通过两种响应头实现:expires 和 cache-control 。强缓存表示在缓存期间不需要请求,state code 为 200
expires: Sun, 27 Oct 2030 14:45:38 GMT
cache-control: max-age=30
  • expires:HTTP/1.0的产物,表示资源过期时间,和本地时间也有关系
  • cache-control:HTTP/1.1的产物,max-age=30表示资源30秒后过期
  • cache-control > expires
  1. 协商缓存:通过两种响应头实现:last-modified 和 etag 。协商缓存需要请求,如果缓存有效会返回 304
etag: "5ff3e6e5-264a"
last-modified: Tue, 05 Jan 2021 04:11:17 GMT

对应的第二次请求头:

if-none-match: "5ff3e6e5-264a"
if-modified-since: Tue, 05 Jan 2021 04:11:17 GMT
  • last-modified 和 if-modified-since:表示本地文件最后修改日期,有更新就返回新资源
  • etag 和 if-none-match:类似于文件指纹,有更新就返回新资源
  • etag > last-modified

追问:为什么服务器优先用etag做协商缓存判断?

  1. 一些文件也许会周期性的更改,但是他的内容并不改变
  2. 某些文件修改非常频繁,比如在秒以下的时间内进行修改,而If-Modified-Since能检查到的粒度是秒级的

追问:知道pragma吗?

pragma是旧产物,已经逐步抛弃,有些网站为了向下兼容还保留了这个字段。pragma的值为no-cache时,表示禁用缓存。优先级是 pragma > cache-control > expires

追问:cache-control还有哪一些属性

Cache-Control字段是http报文中的通用首部字段,既存在于请求报文中,也存在于响应报文中。部分字段值是共有的,但是具体的处理也会有差异。

共有字段:

  • no-cache:无论缓存是否过期,都要对请求进行校验
  • no-store:请求报文中可能存在机密信息,不可缓存 (缓存字段中优先级最高)
  • max-age=[秒]:资源x秒后过期,未过期则使用缓存
  • no-transform:禁止代理改变实体主体的媒体类型,也包括压缩
  • cache-extension: 自定义拓展值,如果缓存服务器不能理解,则忽略

请求报文私有字段值:

  • max-stale(=[秒]): 提示缓存服务器,即使缓存过期也使用;或者在过期后的指定时间内依然使用缓存
  • min-fresh(=[秒]): 提示缓存服务器,如果缓存在指定时间内还没过期,则返回
  • only-if-cache: 提示服务器如果有缓存就返回,不需要确认有效性。如果没有,则返回504网关超时

响应报文私有字段值:

  • public: 明确指明缓存可以给所有用户使用
  • private: 明确指明缓存不可以给其他用户使用
  • must-revalidate: 如果缓存未过期,则返回;否则代理在返回缓存数据之前,必须向源服务器发起请求,验证缓存是否有效。如果无法连接上源服务器,则返回504网关超时
  • proxy-revalidate: 所有缓存服务器在返回缓存数据前,都要向源服务器发起请求验证有效性
  • s-maxage=[秒]: 缓存资源的时间小于指定时间时,直接返回缓存

追问:http请求头还知道哪些?

  1. Content-Type 内容类型
    常见的媒体格式类型
    • text/html : HTML格式
    • text/plain :纯文本格式
    • text/xml : XML格式
    • image/gif :gif图片格式
    • image/jpeg :jpg图片格式
    • image/png:png图片格式 以application开头的媒体格式类型:
    • application/xhtml+xml :XHTML格式
    • application/xml : XML数据格式
    • application/atom+xml :Atom XML聚合格式
    • application/json : JSON数据格式
    • application/pdf :pdf格式
    • application/msword : Word文档格式
    • application/octet-stream : 二进制流数据(如常见的文件下载)
    • application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式) 另外一种常见的媒体格式是上传文件之时使用的:
    • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
  2. accept-encoding:可接受的数据格式,例如常见的gzip
  3. referer
  4. user-agent
  5. cookie
  6. accept-languag: 接受的语言,例如zh-CN,zh;q=0.9
  7. Range:只请求实体的一部分,指定范围 例如bytes=500-999