浏览器缓存是一种将已下载的资源存储在本地设备上,以便在将来访问相同资源时能够更快地加载的机制。这可以显著提高网页的性能和用户体验。浏览器缓存通常分为两种类型:HTTP缓存和浏览器本地缓存。
HTTP缓存:
-
缓存控制头:
- 服务器通过 HTTP 头部信息控制浏览器缓存。常见的控制头包括:
Cache-Control
: 指定缓存策略,如max-age
表示资源有效期。Expires
: 指定资源的过期时间。ETag
和Last-Modified
: 用于验证资源是否已经发生变化。
- 服务器通过 HTTP 头部信息控制浏览器缓存。常见的控制头包括:
-
状态码:
- 服务器通过响应状态码来指示浏览器是否应该缓存资源。
200 OK
表示资源已被缓存,而304 Not Modified
表示资源未发生变化,浏览器可以使用缓存。
- 服务器通过响应状态码来指示浏览器是否应该缓存资源。
缓存过程:
-
首次加载:
- 当浏览器首次请求一个资源时,服务器通过响应头告知浏览器如何缓存该资源。
-
缓存检查:
- 浏览器在发送请求时会检查本地缓存,如果存在并且有效(未过期),则直接使用缓存,不再请求服务器。
-
过期检查:
- 如果缓存过期或者需要进行验证(使用
ETag
或Last-Modified
),浏览器会发送一个条件请求到服务器,服务器会返回304 Not Modified
或者新的资源。
- 如果缓存过期或者需要进行验证(使用
-
资源更新:
- 如果资源已经更新,服务器返回新的资源,浏览器更新本地缓存。
控制缓存策略:
-
强缓存(Expires 和 Cache-Control):
Expires
和Cache-Control
的max-age
指定资源在多长时间内是强制缓存的,不需要向服务器发起请求。
-
协商缓存(Last-Modified 和 ETag):
- 服务器通过
Last-Modified
或ETag
标识资源的版本,如果资源未发生变化,浏览器可以使用本地缓存,否则服务器返回新的资源。
- 服务器通过
清除缓存:
-
手动清除:
- 用户可以手动清除浏览器缓存,以删除所有已保存的资源。
-
强制刷新(Ctrl + F5):
- 强制刷新页面时,浏览器会忽略缓存,重新请求所有资源。
-
缓存清除策略:
- 通过设置合适的缓存清除策略,使得浏览器在特定条件下自动清除缓存。
浏览器缓存是 Web 性能优化的重要手段之一,合理配置缓存策略可以减轻服务器负载,加快页面加载速度。
缓存相关头部详解
以下是一些常用的缓存控制头部:
-
Cache-Control:
Cache-Control
是最常用的缓存控制头部,用于定义资源的缓存策略。一些常见的指令包括:public
:表示资源可以被任何中间缓存(如CDN)缓存。private
:表示资源仅能被终端用户的浏览器缓存。max-age=<seconds>
:表示资源在指定的秒数内有效,超过这个时间则需要重新请求。no-cache
:表示缓存可以存在,但必须在使用之前重新验证缓存的有效性。no-store
:表示终端用户和中间缓存都不应该存储资源的任何副本。
httpCache-Control: public, max-age=3600
-
Expires:
Expires
是一个老旧的头部,用于指定资源的过期时间。它的值是一个 GMT 格式的日期字符串。但由于存在时区和缓存服务器的时间同步问题,Cache-Control
的使用更为推荐。
httpExpires: Tue, 01 Jan 2030 00:00:00 GMT
时区和缓存服务器的时间同步问题 :当使用
Expires
头部时,服务器会返回一个指定资源过期的时间戳,浏览器会将此时间戳与本地时间戳进行比较,以确定资源是否过期。 然而,问题在于不同的计算机和服务器可能处于不同的时区,因此它们的本地时间戳可能是不同的。这可能导致一个在服务器上看起来已经过期的资源,在客户端可能仍然被认为是有效的,或反之亦然。 这种时区差异可能会导致缓存机制的不准确性,使得资源在实际过期之前或之后就被认为是过期的。为了解决这个问题,更现代的缓存控制机制通常使用Cache-Control
头部的max-age
指令,该指令表示资源在指定的秒数内有效,而不依赖于时区。
-
ETag:
ETag
是一个唯一标识符,服务器可以通过它判断资源是否发生了变化。浏览器在发送请求时可以通过If-None-Match
头部携带上次请求时服务器返回的ETag
值,服务器会比较这个值来决定是否返回新的资源。
httpETag: "abc123"
-
Last-Modified:
Last-Modified
是资源的最后修改时间,服务器可以通过它来判断资源是否发生了变化。浏览器在发送请求时可以通过If-Modified-Since
头部携带上次请求时服务器返回的Last-Modified
值,服务器会比较这个值来决定是否返回新的资源。
httpLast-Modified: Wed, 12 Feb 2020 12:30:00 GMT
这些头部可以根据具体的需求和场景进行灵活配置。合理设置缓存头部可以减轻服务器负载,提高页面加载性能。在实际应用中,通常通过服务器配置或后端代码来设置这些头部。
浏览器本地缓存:
-
localStorage 和 sessionStorage:
localStorage
和sessionStorage
是浏览器提供的两种本地存储方式,可以将数据存储在用户设备上。这些数据可以在页面刷新或关闭后仍然保持存在。- 两者的区别在于,
sessionStorage
提出了窗口的概念,数据只在同源同窗口内共享。而localStorage
在同源所有窗口共享。
-
IndexedDB:
IndexedDB
是一种更强大的本地数据库,允许开发者存储和检索大量结构化数据。与localStorage
和sessionStorage
不同,IndexedDB
允许存储更大的数据集,并支持更复杂的查询。