意义:浏览器在向服务器请求资源的时候比较耗时,为了优化就将服务器里一些不会经常改变的资源缓存下来 流程: 浏览器每次请求资源的时候都会向缓存中寻找,如果没有再向服务器请求,服务器返回资源,浏览器再把资源缓存到缓存中,下次请求的时候就可以直接从缓存中获取资源。
浏览器的缓存按位置来讲有四种类型
- Service Worker缓存
- Memory Cache缓存
- Disk Cache缓存
- Push缓存
Service Worker缓存
-
Service Worker 会拦截浏览器的所有请求,由Service Worker来决定是否缓存请求,缓存哪些资源,如何缓存,缓存的有效期等。
-
Service Worker具有最高拦截权,并且编程可控性。如果浏览器缓存过期,只要Service Worker决定请求缓存也会请求缓存
-
Service Worker需要自己注册
Memory Cache缓存
- Memory Cache 是浏览器将资源直接缓存在系统内存中
- Memory Cache 具有极快速度响应,
- 但是因为缓存在内存,所以标签页一旦关闭,缓存就失效了、浏览器如果内存空间不够也会主动清理缓存,
- 主要缓存一些频繁使用的存储较小且高频访问的资源(js,css,图标)。
Memory Cache 速度快,但是是临时性缓存,开发者无法控制哪些资源会被缓存。
Disk Cache缓存
- Disk Cache 是浏览器将资源缓存在磁盘中,
- 具有较高的容量,可以缓存更多的资源,
- Disk Cache可以长久保存,即使标签页关闭,缓存也不会失效。
- 但是因为需要磁盘IO,所以速度比Memory Cache慢,
强缓存和协商缓存
强缓存:浏览器会检查缓存中expire时间和Cache-Control:max-age是否过期,如果没有过期,则直接从缓存中读取资源,不再向服务器请求。 协商缓存:
- 浏览器向缓存请求资源,强缓存过期只返回缓存标识
- 向服务器发送请求携带缓存标识
- 服务器返回304
- 浏览器继续使用缓存
这个缓存标识就是服务器之前发送过来的Last-Modified或Etag
Last-Modified: 服务器响应请求时,告诉浏览器资源的最后修改时间。浏览器下次请求的时候会带上这个时间(If-Modified-Since) Etag: 服务器响应请求时,告诉浏览器资源的唯一标识。浏览器下次请求的时候会带上这个标识(If-None-Match)
启发式缓存
如果服务器返回没有明确的expire和Cache-Control:max-age,但是有Last-Modified,浏览器会根据当前时间和Last-Modified的差值的10%作为启发式缓存
Push缓存
Push缓存是HTTP2.0的新特性,可以让服务器主动推送资源到浏览器缓存中,不需要浏览器主动请求。
Push缓存可以减少浏览器请求服务器的次数,提高性能。
请求资源详细流程
- 查看注册的Service Worker是否激活并且返回了请求
- 查看menmory cache是否有请求的资源
- 查看disk cache有强缓存
- 如果强缓存没有过期返回200
- 如果强缓存过期了,查看disk cache是否协商缓存返回304
- 如果disk cache没有强缓存
- 最后试一试push cache有没有请求的资源
- 如果以上都没有,向服务器请求资源