彻底搞懂前端浏览器缓存

439 阅读3分钟

1.为什么需要浏览器缓存?

在浏览器与服务器通信的过程中,浏览器发送请求并等待服务器返回数据是一件非常耗时的事情。如果服务器性能不佳,或数据量过于庞大时,就会需要长时间等待。

并且在大量的返回数据中,有可能很多数据是没有被修改、重复加载的数据,这时为了提升网页加载效率,我们就需要浏览器缓存这些没有被修改的数据,便于规避数据请求,以达到性能优化的目的。

2 什么资源可以被缓存?

一定是静态资源,例如:JS、img、CSS

3.HTTP Header

在了解缓存之前,先了解几个跟缓存相关的状态码、请求、响应头

3.1 状态码

  • 304(表示所请求的数据未做修改)

3.2 相关请求、响应头

3.2.1 请求响应头
  • Cache-Control: 控制强制缓存的逻辑字段
    • max-age(缓存的最大时间,单位为毫秒)
    • no-cache(不使用缓存)
3.2.2 请求头(都表示浏览器通知服务器,所请求的资源最近修改时间)
  • last-Modified

  • If-Modified-Since

3.2.3 响应头(都表示服务器告知浏览器的一个资源标识)
  • Etag(优先使用,精度更准确)

  • Last-Modified(只能到秒)

小Tips:请求响应头需要搭配使用

If-Modified-Since -> Last-Modified

Etag -> If-None-Match

4 缓存策略

4.1 强制缓存

具体过程如下:

1.浏览器初次发起请求,如果服务器觉得资源适合被缓存时,会在返回资源时的Response Headers中加入Cache-Control字段

2.此时浏览器再次请求时,只要判断Cache-Control是否过期,若没有过期,则直接在本地缓存中返回资源。若缓存失效了,就会再次发送到服务器,并返回资源

4.2 协商缓存

协商缓存是一个服务端缓存策略,是通过服务端判断一个资源是否需要被缓存、客户端资源是否和服务端资源一致

具体过程如下:

1.浏览器初次请求时,服务器会返回资源和资源标识(Last-Modified/Etag)

2.浏览器再次请求(此时会带上资源标识(if-Modified-Since/If-Nono-Match)),服务器会根据资源标识判断该资源是否是最新资源,如果是,则返回304 ,如果不是则返回资源和新的资源标识(Last-Modified/Etag)

5 为什么需要两种缓存方式

原因在于,这跟浏览器刷新方式有关。

浏览器有三种刷新方式,并都会对缓存有所影响

  • 正常操作,地址输入url,跳转链接,前进后退等(强制缓存有效,协商缓存有效)

  • 手动刷新,F5,右击刷新(强制缓存失效,协商缓存有效)

  • 强制刷新Ctrl+F5(全部所有失效)

最后附上一张浏览器缓存全过程的流程图: