ETag (Entity Tag) 在前端开发中主要用于缓存控制和条件请求,提升网站性能和用户体验。 以下是一些常见的应用场景:
-
优化浏览器缓存: 服务器返回资源时,会带上 ETag 响应头,它是一个资源的唯一标识符(类似于指纹)。浏览器将资源和 ETag 缓存在本地。下次请求同一资源时,浏览器会在请求头中带上
If-None-Match
,值为之前缓存的 ETag。服务器收到请求后,会将请求中的 ETag 与当前资源的 ETag 进行比较。如果一致,表示资源未修改,服务器返回 304 Not Modified 状态码,浏览器直接使用本地缓存,节省带宽和时间。如果不一致,服务器返回 200 状态码和新的资源以及新的 ETag。 -
防止并发更新丢失数据: ETag 可以用于实现乐观锁机制,防止多个用户同时修改同一资源导致数据不一致。客户端在修改资源前,先获取资源的 ETag。修改完成后,将 ETag 和修改后的数据一起提交到服务器。服务器比较请求中的 ETag 和当前资源的 ETag。如果一致,则更新资源;如果不一致,表示资源已被其他用户修改,服务器返回错误信息,提示用户重新获取资源并修改。
-
断点续传: 下载大文件时,如果网络中断,可以利用 ETag 实现断点续传。客户端记录已下载部分的 ETag 和文件大小。重新下载时,在请求头中带上
If-Range
和已下载部分的 ETag。服务器判断 ETag 是否匹配,如果匹配,则返回剩余部分的数据;如果不匹配,则返回完整的文件。 -
CDN缓存失效: 当源服务器上的资源更新后,需要使 CDN 上的缓存失效。可以通过更新资源的 ETag 来实现。CDN 会根据 ETag 判断缓存是否有效。
示例:
- 首次请求:
Request: GET /image.png
Response: 200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Content-Type: image/png
... (image data)
- 再次请求 (资源未修改):
Request: GET /image.png
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Response: 304 Not Modified
- 再次请求 (资源已修改):
Request: GET /image.png
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Response: 200 OK
ETag: "d41d8cd98f00b204e9800998ecf8427e" (新的ETag)
Content-Type: image/png
... (新的 image data)
总而言之,ETag 是一个强大的工具,可以帮助前端开发者有效地管理缓存,提高网站性能,并确保数据一致性。 理解其工作原理并在项目中正确使用,可以带来显著的优化效果。