0. 缓存位置
会依次查找 Service Worker
、Memory Cache
、Disk Cache
、网络请求
1. 强制缓存
HTTP1.0
通过响应头设置 Pragma: no-cache;
,表示每次都会向服务器发送请求
Expires
可以设置具体时间,还未到此时间点则不发起请求,但此时间是相对于服务器时间而言的,如果客户端时间和服务器时间不一致那就没什么用了
HTTP1.1
Cache-Control: max-age=3600;
资源缓存的最大时间,该时间内不会发起请求
区分 max-age=0、no-cache、no-store
max-age=0,会检验 ETag/Last-Modified,并通过对应的请求头携带
no-cache 会缓存内容,每次会发起请求,是否使用此内容由后续的对比决定
no-store 不缓存,所有内容不走缓存直接发起请求
优先级
Pragma > Cache-Control > Expires
2. 对比缓存
对比缓存又叫协商缓存!
当强制缓存失效(超过规定时间)时,就需要使用对比缓存,由服务器决定缓存内容是否失效。对比缓存在请求数上和没有缓存是一致的,返回 304 仅仅是一个状态码,并没有实际的内容,在响应体体积上的节省是它的优化点
Last-Modified 和 If-Modified-Since
1. 服务器响应 Last-Modified 字段标记最后一次被修改的时间
2. 浏览器下一次请求相同资源时,在请求头中将上次的 Last-Modified 的值写入到请求头的 If-Modified-Since 字段
3. 服务器会将 If-Modified-Since 的值与 Last-Modified 字段进行对比,相等则响应 304,反之则响应 200 状态码,并返回修改后的数据
缺陷:如果资源更新的速度是秒以下单位,那么该缓存是不能被使用的,因为它的时间单位最低是秒
Etag 和 If-None-Match
1. 服务器响应文件的特殊标识(摘要)Etag
2. 浏览器下一次请求相同资源时,通过请求头 If-None-Match 带上 Etag
3. 服务器同样进行比较,命中返回 304, 不命中返回新资源和 200。
Etag 的优先级高于 Last-Modified
3. 做个总结
当浏览器要请求资源时,查看 Service Worker、memory cache、disk cache,如果有强制缓存且未失效(Cache-Control),则使用强制缓存,这时的状态码是 200;如果有强制缓存但已失效,则使用对比缓存,比较后确定 304 还是 200