HTML5缓存是一种在客户端存储资源的技术,它可以提高网站的性能和用户体验,通过使用HTML5缓存,浏览器可以在用户再次访问同一页面时,直接从本地缓存中加载资源,而不需要重新从服务器请求,这样可以减少网络传输的延迟,提高页面加载速度,节省带宽资源。
HTML5缓存可以分为两类:强制缓存和协商缓存。
1、强制缓存
强制缓存是浏览器自动进行的缓存策略,当请求一个资源时,浏览器会先检查本地是否存在该资源的缓存版本,如果存在,则直接使用缓存版本,不会向服务器发送请求,强制缓存的控制是通过设置HTTP响应头的Cache-Control和Expires字段来实现的。
- Cache-Control字段
Cache-Control是一个通用的缓存控制字段,它可以用来指定缓存的行为,常见的取值有:
- no-cache:表示资源不应被缓存,每次请求都需要向服务器验证资源的有效性。
- no-store:表示资源不应被存储在任何缓存中,包括内存和磁盘,这意味着每次请求都需要从服务器获取最新的资源。
- max-age:表示资源可以被缓存的最大时间(以秒为单位),在这个时间内,浏览器可以直接使用缓存版本,无需向服务器验证,max-age=3600表示资源可以被缓存1小时。
- Expires字段
Expires字段是一个HTTP/1.0时代的缓存控制字段,它表示资源的过期时间,当浏览器收到带有Expires字段的响应时,会在本地记录资源的过期时间,当再次请求该资源时,浏览器会检查当前时间是否小于过期时间,如果是,则使用缓存版本;否则,向服务器发送请求获取新的资源,需要注意的是,Expires字段使用的是服务器的时间,可能存在时间误差。
2、协商缓存
协商缓存是浏览器在请求一个资源时,与服务器进行通信,共同决定是否使用缓存的策略,协商缓存的控制是通过设置HTTP响应头的Last-Modified和ETag字段来实现的。
- Last-Modified字段
Last-Modified字段表示资源的最后修改时间,当浏览器收到带有Last-Modified字段的响应时,会在本地记录资源的最后修改时间,当再次请求该资源时,浏览器会发送一个包含If-Modified-Since字段的请求头,表示资源的最后修改时间,服务器收到请求后,会比较资源的最后修改时间和If-Modified-Since字段的值,如果相等,则表示资源没有变化,返回304状态码和一个空的响应体;否则,返回最新的资源。
需要注意的是,Last-Modified字段只能精确到秒级别,如果资源的修改时间在一个秒内发生了多次变化,那么这种方法就无法准确判断资源是否发生了变化,Last-Modified字段是基于服务器时间的,可能存在时间误差。
- ETag字段
ETag字段是一个用于标识资源版本的字符串,当浏览器收到带有ETag字段的响应时,会在本地记录资源的ETag值,当再次请求该资源时,浏览器会发送一个包含If-None-Match字段的请求头,表示资源的ETag值,服务器收到请求后,会比较资源的ETag值和If-None-Match字段的值,如果相等,则表示资源没有变化,返回304状态码和一个空的响应体;否则,返回最新的资源。
ETag字段的优势在于它可以更精确地判断资源是否发生了变化,因为它是基于内容的哈希值,ETag字段不受时间限制,只要内容发生变化,它的值就会改变,生成和比较哈希值的过程可能会消耗较多的计算资源。
总结一下,HTML5缓存分为强制缓存和协商缓存两种策略,强制缓存是通过设置Cache-Control和Expires字段来实现的,它可以让浏览器在一段时间内直接使用缓存版本,协商缓存是通过设置Last-Modified和ETag字段来实现的,它可以让浏览器与服务器通信,共同决定是否使用缓存的版本,在实际开发中,可以根据需要选择合适的缓存策略来提高网站的性能和用户体验。