浏览器缓存
拿缓存的优先级
Memory Cache -> Service Worker Cache -> Disk Cache -> HTTP Cache -> Push Cache
Memory Cache
内存缓存,速度快,和渲染进程关联,tab关闭,内存数据拜拜 Base64图片、体积小的js、css文件一般在Memory Cache
Service Worker Cache
独立于主线程之外的js线程,无法直接访问DOM,可以实现离线缓存、消息推送和网络代理功能 协议必须时https
生命周期:install、active、worki。一旦install,始终存在,除非主动终止
Disk Cache
慢一些、体积较大的js、css文件
HTTP Cache
拿缓存的优先级
强缓存 -> 协商缓存
强缓存
命中强缓存,请求状态码是:200
利用Expires和Cache-Control字段控制
- 命中Expires缓存(是一个时间戳):浏览器对比本地时间和和这个时间,没超过Expires时间,就不用去请求服务器,使用浏览器缓存(本地内存缓存...)
- 问题:浏览器改本地时间,就能绕过缓存(为弥补之,诞生Cache-Control)
命中Cache-Control:里面规定了一个max-age,是一个数字(时间长度,单位秒),在这段时间里,命中Cache-Control。里面也规定了一个s-maxage,是一个数字,在这段时间里,使用代理服务器(cache CDN)的缓存
同时有Cache-Control、Expires,以Cache-Control为准,同时有s-maxage、max-age,以s-maxage为准
不缓存
no-store与no-cache
- no-store就是不应用缓存(包括服务器缓存),每次都请求服务器并响应
- no-cache是不应用浏览器缓存,每次请求去问一下服务器资源过没过期,往协商缓存走
协商缓存
每次请求,浏览器都问问服务器,我的资源过期没
服务器说没过期,则资源重定向到浏览器缓存,请求状态码:304
Last-Modified和Etag
命中Last-Modified:是一个时间戳,服务器放在响应头里,浏览器请求时,会将它作为If-Modified-Since的值再发给服务器,服务器就去对比这个资源的最后修改时间,来判断资源有没有更改,改了则返回新的资源+新的Last-Modified时间戳,没改则返回304命中缓存
问题:文件改了,但没有完全改(内容没变化)、光速操作(改文件只用了0.1S,Last-Modified只能以秒为单位计算)。为弥补之,诞生Etag
命中Etag:响应头里放一个Etag,根据文件内容计算(耗费服务器性能)出来的编码,请求时,再用If-None-Match字段传给服务器,服务器根据文件内容生成的编码对比瞅改没改
Push Cache
以上都没命中,才到Push Cache 浏览器推送资源给客户端缓存 会话阶段的缓存,session终止,缓存释放 不同页面只要共享一个http2连接,则共享一个Push Cache