以下是个人理解和知识整合 有不对的地方欢迎jym 斧正 三克油!!!
前言:http缓存优化是前端处理性能优化直观简单的一种,主要分为两种:一种是强缓存一种是协商缓存,主要是可以加快浏览器资源获取速度,提升用户体验,减少网络传输,减轻服务端压力eg:不管是强缓存还是协商缓存都是在请求第一次才会有可能会发生,第一次请求是没有缓存这种东西的
缓存运作的一个整体流程图:
强缓存
如果请求命中强缓存 那就直接使用本地缓存不需要重新发送请求,是否命中强缓存是由请求头中的几个属性进行控制的
Expires
这个是http1.0 时期 的产物 它的值是一个有效时间,更改本地时间会影响到它,它是和系统时间做对比的,它的优先级是最低的 基本是用来兼容http1.0
Cache-Control
这个是http1.1版本新增的属性,在请求头和响应头中都可以使用,它的值有以下几种(列举几种常用的)
- max-age: 单位是秒,计算方式是从距离第一次发起的时间过的秒数,超过则缓存失效
- no-cache:使用协商缓存,需要发送请求,让服务端进行验证是否使用缓存
- no-store:不使用缓存,每次请求都是向服务端请求最新的资源
- private: 私有的,标明只能被单个用户缓存,不能作为共享缓存(即代理服务器等不能缓存)
- public 表明响应可以被任何对象
Pragma
Pragma 只有一个属性值,就是 no-cache ,效果和 Cache-Control 中的 no-cache 一致,不使用强缓存,需要与服务器验证缓存是否新鲜,在 3 个头部属性中的优先级最高。
协商缓存
当浏览器强缓存失效的时候或者请求头中设置了不走强缓存,并且请求头中设置了If-Modified-Since 或者 If-None-Match 的时候,会将这两个属性值到服务端去验证是否命中协商缓存,如果命中了协商缓存,会返回 304 状态,加载浏览器缓存,并且响应头会设置 Last-Modified 或者 ETag 属性
ETag/If-None-Match
值是一串hash 码,当服务器端资源变化时 该值也会发生变化 所以 服务端通过比对该值 和该文件的hash 值 来判断是否命中协商缓存
Last-Modified/If-Modified-Since
Last-Modified/If-Modified-Since 的值代表的是文件的最后修改时间,第一次请求服务端会把资源的最后修改时间放到 Last-Modified 响应头中,第二次发起请求的时候,请求头会带上上一次响应头中的 Last-Modified 的时间,并放到 If-Modified-Since 请求头属性中,服务端根据文件最后一次修改时间和 If-Modified-Since 的值进行比较,如果相等,返回 304 ,并加载浏览器缓存