极速了解浏览器缓存(速通面试)

29 阅读3分钟

意义:浏览器在向服务器请求资源的时候比较耗时,为了优化就将服务器里一些不会经常改变的资源缓存下来 流程: 浏览器每次请求资源的时候都会向缓存中寻找,如果没有再向服务器请求,服务器返回资源,浏览器再把资源缓存到缓存中,下次请求的时候就可以直接从缓存中获取资源。

浏览器的缓存按位置来讲有四种类型

  1. Service Worker缓存
  2. Memory Cache缓存
  3. Disk Cache缓存
  4. Push缓存

Service Worker缓存

  1. Service Worker 会拦截浏览器的所有请求,由Service Worker来决定是否缓存请求,缓存哪些资源,如何缓存,缓存的有效期等。

  2. Service Worker具有最高拦截权,并且编程可控性。如果浏览器缓存过期,只要Service Worker决定请求缓存也会请求缓存

  3. Service Worker需要自己注册

Memory Cache缓存

  1. Memory Cache 是浏览器将资源直接缓存在系统内存中
  2. Memory Cache 具有极快速度响应,
  3. 但是因为缓存在内存,所以标签页一旦关闭,缓存就失效了、浏览器如果内存空间不够也会主动清理缓存,
  4. 主要缓存一些频繁使用的存储较小且高频访问的资源(js,css,图标)。

Memory Cache 速度快,但是是临时性缓存,开发者无法控制哪些资源会被缓存。

Disk Cache缓存

  1. Disk Cache 是浏览器将资源缓存在磁盘中,
  2. 具有较高的容量,可以缓存更多的资源,
  3. Disk Cache可以长久保存,即使标签页关闭,缓存也不会失效。
  4. 但是因为需要磁盘IO,所以速度比Memory Cache慢,

强缓存和协商缓存

强缓存:浏览器会检查缓存中expire时间和Cache-Control:max-age是否过期,如果没有过期,则直接从缓存中读取资源,不再向服务器请求。 协商缓存:

  1. 浏览器向缓存请求资源,强缓存过期只返回缓存标识
  2. 向服务器发送请求携带缓存标识
  3. 服务器返回304
  4. 浏览器继续使用缓存

这个缓存标识就是服务器之前发送过来的Last-ModifiedEtag

Last-Modified: 服务器响应请求时,告诉浏览器资源的最后修改时间。浏览器下次请求的时候会带上这个时间(If-Modified-Since) Etag: 服务器响应请求时,告诉浏览器资源的唯一标识。浏览器下次请求的时候会带上这个标识(If-None-Match)

启发式缓存

如果服务器返回没有明确的expire和Cache-Control:max-age,但是有Last-Modified,浏览器会根据当前时间和Last-Modified的差值的10%作为启发式缓存

Push缓存

Push缓存是HTTP2.0的新特性,可以让服务器主动推送资源到浏览器缓存中,不需要浏览器主动请求。

Push缓存可以减少浏览器请求服务器的次数,提高性能。

请求资源详细流程

  1. 查看注册的Service Worker是否激活并且返回了请求
  2. 查看menmory cache是否有请求的资源
  3. 查看disk cache有强缓存
  4. 如果强缓存没有过期返回200
  5. 如果强缓存过期了,查看disk cache是否协商缓存返回304
  6. 如果disk cache没有强缓存
  7. 最后试一试push cache有没有请求的资源
  8. 如果以上都没有,向服务器请求资源