一文搞懂->浏览器缓存和各种字段名

549 阅读9分钟

❤️整理不易,小主们动动小手,点赞再看、养成习惯❤️

一、基本概念

1、什么是浏览器缓存

浏览器缓存是指浏览器在访问网页时将网页的一些资源(如HTML、CSS、JavaScript文件、图像等)临时存储在本地(内存或者硬盘)的一种机制。它的目的是在再次访问同一网页时,能够直接从本地缓存中加载这些资源,而无需重新下载。

2、为什么需要浏览器缓存

浏览器缓存的好处包括:

  • 加速网页加载:由于从本地缓存加载资源比从服务器下载资源更快.当再次访问同一网页时,可以直接从缓存中加载这些资源,而不需要重新下载。这样可以显著减少网络请求的数量和网页加载时间,因此浏览器缓存能够加速网页的加载速度,提供更快的用户体验。
  • 减少网络流量:使用缓存可以可以避免重复下载相同的资源,进而减少了需要通过网络传输的数据量,从而减少了网络流量消耗,节省了用户的流量费用。
  • 减少服务器负载:使用缓存意味着减少了对服务器的请求,降低了服务器的负载压力,提高了服务器的性能和响应能力。

尽管浏览器缓存带来了很多好处,但在开发和调试过程中,有时也需要注意缓存的影响。为了确保在开发过程中能够看到最新的更改,可以使用开发者工具禁用缓存,或使用类似于时间戳或版本号的技术来确保资源的更新。

3、浏览器是如何进行缓存的

3.1 基本工作原理

浏览器缓存的工作原理如下:

  1. 第一次访问:当你第一次访问一个网页时,浏览器会下载网页的各种资源,并将这些资源存储在缓存中。同时,浏览器会根据网页服务器的响应头中的缓存控制信息,设置这些资源的缓存策略,如过期时间等。
  2. 再次访问:当你再次访问相同的网页时,浏览器会首先检查缓存中是否已经存在这些资源。如果资源存在【且】缓存策略允许使用缓存【且】资源没过期,浏览器会直接从缓存中加载资源,而不再向服务器发送请求。这样可以节省带宽并提高页面加载速度。

3.2 具体控制的手段

【接口响应头】中可以包含缓存控制信息,用于指示浏览器如何处理缓存。常见的缓存控制指令(字段)包括:

  • Cache-Control: 用于定义缓存的行为,例如public(可以被任何人缓存)、private(仅限用户自己缓存)、max-age(表示资源的有效时间)、 no-cache(不缓存)等。
  • Expires: 指定资源的过期时间,浏览器在该时间之前可以直接从缓存中加载资源。
  • ETag: 是服务器为资源生成的唯一标识符,用于检查资源是否发生了变化。
  • Last-Modified: 指示资源的最后修改时间,用于与服务器上的资源进行比较。

浏览器进行缓存时使用了一些策略和机制。以下是一些常见的浏览器缓存策略

  • 强缓存(Expires 和 Cache-Control):网页服务器通过在响应头中设置 Expires 或 Cache-Control 字段来指定资源的缓存时间。浏览器在第一次请求资源时,会将这些信息存储在缓存中,并在资源未过期时直接从缓存加载,而无需再次请求服务器。
  • 协商缓存(Last-Modified 和 ETag):当浏览器首次请求资源时,服务器会在响应头中添加 Last-Modified 字段,表示资源的最后修改时间。当浏览器再次请求相同资源时,会在请求头中添加 If-Modified-Since 字段,将上次响应中的 Last-Modified 时间发送给服务器。如果资源在这段时间内没有修改,服务器会返回一个 304 Not Modified 的响应,浏览器则会直接从缓存加载该资源。类似地,服务器还可以使用 ETag(实体标签)字段来标识资源的唯一标识符,进行协商缓存。
  • 缓存位置(浏览器缓存和代理缓存):浏览器缓存是指将资源存储在用户本地的缓存中。而代理缓存是指位于用户和服务器之间的代理服务器(如CDN),可以缓存资源并为多个用户提供相同的缓存副本。代理缓存可以减少对服务器的请求,提高访问速度。

需要注意的是

  • 不同的资源可以有不同的缓存策略。例如,静态资源(如图片、CSS和JavaScript文件)通常具有较长的缓存时间,而动态生成的内容(如HTML页面)通常会被标记为不缓存或具有较短的缓存时间。
  • 浏览器缓存可以提高网页的加载速度和用户体验,但也可能导致更新后的资源无法及时更新。为了确保在开发和调试过程中能看到最新的更改,可以使用浏览器的开发者工具来禁用缓存,或者在开发过程中使用类似于时间戳或版本号的技术来确保资源的更新。
  • 浏览器对缓存的处理也受到用户的操作影响,例如用户手动清除缓存、使用无痕模式浏览、禁用缓存等。此外,不同的浏览器可能对缓存策略的实现和支持程度有所不同,因此在开发中应谨慎考虑不同浏览器的兼容性。

4、如何禁止浏览器缓存

  • 强制刷新:使用浏览器的强制刷新功能(通常是按下Ctrl/Cmd + Shift + R),这会强制浏览器忽略缓存,并向服务器发送请求获取最新的资源。
  • 控制台勾选禁止缓存:打开F12控制台,找到缓存的开关,关闭即可。
  • 后台控制:接口资源响应头中设置为 不缓存

5、浏览器缓存的存储位置(不一定?)

浏览器的缓存既可以存在于本地磁盘中,也可以存在于内存中,具体取决于缓存的类型和大小。

  • 磁盘缓存:大多数浏览器将一部分缓存存储在本地磁盘上。这包括已下载的网页资源(如HTML、CSS、JavaScript文件、图像等)以及其他缓存文件。磁盘缓存的优点是可以存储较大的数据,使得浏览器可以在下次访问同一网页时直接从磁盘加载资源,提高网页的加载速度。磁盘缓存的缺点是访问速度相对较慢。

  • 内存缓存:浏览器还可以将一部分缓存存储在内存中。内存缓存的优点是读取速度快,可以更快地加载资源。内存缓存主要用于存储较小的资源,例如当前正在访问的网页的一些资源或者一些常用的样式表和脚本文件等。然而,内存缓存的容量较小,不能存储大量的数据。

浏览器通常会根据资源的大小、类型和访问频率等因素来决定将资源存储在磁盘缓存还是内存缓存中。较大的资源通常会被存储在磁盘缓存中,而较小且常用的资源可能会被存储在内存缓存中。此外,浏览器还会使用一些策略来管理缓存,例如LRU(最近最少使用)策略,以便在缓存空间不足时删除最少使用的资源。需要注意的是,浏览器缓存的具体实现可能因不同的浏览器而异,而且用户也可以通过浏览器的设置进行配置,包括设置缓存大小(决定浏览器在内存和磁盘之间分配缓存空间的比例)、清除缓存等。

6、浏览器的无痕模式与缓存的关系

浏览器的无痕模式和缓存是两个不同的概念,它们之间存在一些区别和关系。

  • 在无痕模式下,浏览器仍然使用了缓存来提高网页的加载速度。然而,与常规模式下的缓存不同,无痕模式下的缓存会在用户关闭浏览器tab窗口或者关闭浏览器时自动删除(不会存在本地),以保护用户的隐私。
  • 无痕模式下,浏览器不会保存网站设置的Cookie信息。这意味着在无痕模式下,你需要重新登录网站,网站无法识别你之前的身份信息。

二、浏览器缓存(核心分析)

  • 具体是采用强缓存、协商缓存还是强缓存+协商缓存,都是后台定的。
    • 因为在第一次请求的时候,response header中的值,是后台给的。而第二次请求的时候,在request header中追加哪些字段值,是浏览器根据第一次的response header自动追加相应字段的,无需前端程序手动干预。
    • 比如 如果后端接口没有返回 Etag 字段,浏览器在后续请求中就不会自动追加 If-None-Match 字段
  • 推荐:后台返回 Cache-Control + Last-Modify 或者 Cache-Control + Etag
    • 因为 Expires 采用的是绝对时间,可能会出错。
    • 如果 Last-Modify和Etag同时出现,那么优先判断Etag。即如果Etag相同则返回304;如果Etag不同,则不一定能说明文件内容变了(因为Etag的生成规则不一定文件内容或者文件修改时间有关)(不过Etag变了就直接更新,也合理),此时就会比对浏览器带上来的If-Modified-Since与服务器上当前资源的最后修改时间,如果后者时间晚,那么返回304,否则服务器会正常返回资源内容。
  • 存储在内存还是硬盘,等待进一步总结。可参考

❤️整理不易,小主们动动小手,点赞支持一下吧~❤️