为了减少浏览器访问服务器时重复请求同一资源的次数,浏览器提供了对应的缓存机制,使浏览器在第一次发送请求后,本地暂时存储部分资源,再次请求该资源时能有效利用本地缓存,减少网络请求。而这些缓存策略依据缓存位置,主要分为三大类:Memory Cache,Disk Cache,Service Woker。
缓存调用顺序
浏览器在请求网络资源时,将先后通过以下方式查找对应资源,若查找到对应缓存资源则返回该资源,不再继续向下查找。
- Service Worker
- Memory Cache
- Disk Cache
- 网络请求
Memory Cache
Memory Cache 是内存中的缓存(与之相对 disk cache 就是硬盘上的缓存)。按照操作系统的常理:先读内存,再读硬盘。几乎所有的网络请求资源都会被浏览器自动加入到 Memory Cache 中。然而,由于内存可缓存的资源数量极其有限, Menmory Cache 只能作为 短期缓存 ,一旦浏览器TAB关闭,其对应的所有 Memory Cache 即刻失效。此外,当内存中的缓存数据超过一定数量之后,浏览器也会清楚部分旧的数据。
在从Memory Cache获取缓存内容时,浏览器会忽视例如max-age=0,no-cache等头部配置。例如页面上存在几个相同src的图片,即便它们可能被设置为不缓存,但依然会从Memory Cache中读取。这是因为Memory cache只是短期使用,大部分情况生命周期只有一次浏览而已。而max-age=0在语义上普遍被解读为“不要在下次浏览时使用”,所以和Memory Cache并不冲突。如果不想让一个资源进入缓存,就连短期也不行,那就需要使用no-store。存在这个头部配置的话,即便是Memory Cache也不会存储,自然也不会从中读取了。
preloader
preloader是浏览器解析、加载静态资源的一种机制,它能够让浏览器在部分js、css在解析的同时,继续加载其他js、css资源并加入到Memory Cache中,以便后续快速解析。各个浏览器对该机制的实现略有不同。
preload
prload是对各个资源的预加载机制,由它指定的资源将被预先加载到Memory Cache中,在使用到该资源时就去缓存中读取。
Disk Cache
Disk Cache也叫HTTP Cache,顾名思义是存储在硬盘上的缓存,因此它是持久存储的,是实际存在于文件系统中的。而且它允许相同的资源在跨会话,甚至跨站点的情况下使用,例如两个站点都使用了同一张图片。开发者主要通过HTTP头部的缓存相关字段来定义哪些资源需要被Disk Cache缓存,缓存时间是多久,失效之后是否重新请求并缓存等等。虽然Disk Cache的存储量比Memory Cache大,但是,只要存储内容超过一定限制,浏览器还是会清理“陈年”的内容。
Service Worker
Servie Worker是面向开发者提供的缓存管理机制,它使得开发者能够在浏览器端自行定义缓存内容和时效。详见 《PWA》
参考
《一文读懂前端缓存》——前端早读课