Web前端之路

前端123:浏览器缓存的工作方式

2021-01-29  本文已影响0人  nojsja

浏览器缓存的工作流程


     通过网络获取内容既速度缓慢又开销巨大。较大的响应需要在客户端与服务器之间进行多次往返通信,这会延迟浏览器获得和处理内容的时间,还会增加访问者的流量费用。因此,缓存并重复利用之前获取的资源的能力成为性能优化的一个关键方面。

     这里先看张大家最熟悉的Devtools网络图:

image

图中青色、绿色和橙色圈出的部分分别是来自内存(memory缓存)、磁盘(disk缓存)和Http请求拿到的数据(非缓存),还有一种返回码304的请求也是从缓存(memory/disk)中获取数据。304跟memory/disk缓存的区别是:在浏览器判断资源已经过期的情况下会去服务器查询资源是否更新,如果资源没更新则返回304码,浏览器收到304码就会更新资源的过期时间并直接从之前disk/memory缓存中拿到当前资源,换言之如果资源没过期,那么浏览器就会跳过向服务器校验资源这一步并直接去拿memory/disk缓存获取。

image

大致流程如下:

     Service Worker Cache具有较高的优先级,数据控制更为复杂,操作自由度最高;Memory Cache更多的强调了一种缓存存储方式和浏览器内存缓存策略;HTTP Cache相对于Memory Cache根据存储方式的不同也能叫做Disk Cache,它依赖于整个HTTP缓存校验流程(强缓存和协商缓存),并通过校验来最终确定何时从缓存读取,何时从服务器更新资源;Push Cache资料较少,应用得不多,暂时只做介绍。

Service-Worker Cache(优先级最高)


     Service Worker 是运行在浏览器背后的独立线程,一般可以用来实现缓存功能。使用 Service Worker 的话,传输协议必须为 HTTPS。因为 Service Worker 中涉及到请求拦截,所以必须使用 HTTPS 协议来保障安全。Service Worker 的缓存与浏览器其他内建的缓存机制不同,它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的。

     Service Worker 实现缓存功能一般分为三个步骤:首先需要先注册 Service Worker,然后监听到 install 事件以后就可以缓存需要的文件,那么在下次用户访问的时候就可以通过拦截请求的方式查询是否存在缓存,存在缓存的话就可以直接读取缓存文件,否则就去请求数据。

     当 Service Worker 没有命中缓存的时候,我们需要去调用 fetch 函数获取数据。也就是说,如果我们没有在 Service Worker 命中缓存的话,会根据缓存查找优先级去查找数据。但是不管我们是从 Memory Cache 中还是从网络请求中获取的数据,浏览器都会显示我们是从 Service Worker 中获取的内容。

Memory Cache(优先级次之)


     Memory Cache 也就是内存中的缓存,主要包含的是当前中页面中已经获取到的资源,例如页面上已经下载的样式、脚本、图片等。读取内存中的数据肯定比磁盘快,内存缓存虽然读取高效,可是缓存持续性很短,会随着进程的释放而释放。 一旦我们关闭 Tab 页面,内存中的缓存也就被释放了。内存缓存在缓存资源时并不关心返回资源的HTTP响应头部 Cache-Control 是什么值,换句话说这是一种强依赖于浏览器本地内存管理策略的缓存方式,各个浏览器对内存缓存的处理方式也略有区别。

     Memory Cache遵循这些策略:

* HTTP Cache(优先级次之)


     HTTP缓存根据工作方式分为强缓存协商缓存,浏览器首先会判断强缓存是否命中,命中失败才会尝试进行协商缓存

image

1)强缓存

2)协商缓存

     协商缓存依赖于服务端与浏览器之间的通信,在第一次获取资源时浏览器会存储HTTP请求的response headers字段:Last-Modified / Etag,当强缓存未命中的时候,它的值作为浏览器和服务器通信时携带的标志位用于判断资源是否过期,如果服务器判断资源过期的话就会重新下载资源,并更新相应标志位。如果判断资源未更新的话,会返回304状态码,浏览器就会复用客户端缓存资源。

Push Cache(优先级最低)


Push Cache 是指 HTTP2 在 server push 阶段存在的缓存:

上一篇下一篇

猜你喜欢

热点阅读