概述
轮询客户端最常见的浪费是把未变化的资源反复完整下载。条件请求让服务器在内容未变时只回一个 304,客户端复用本地副本即可,显著降低带宽与耗电。
关键步骤
- 保存上一次成功响应中的 ETag 或 Last-Modified。
- 下一次请求时作为 If-None-Match 或 If-Modified-Since 发回。
- 把 304 视为复用本地内容而非错误。
- 无验证器时回退为完整拉取。
验证
- 未变化时服务器返回 304。
- 客户端复用本地内容而非重新解析。
- 验证器仅在 200 响应时更新。
- 首次请求仍正常完整拉取。
注意事项
- 条件请求仍需一次往返与服务端比较,减少的是字节而非延迟。
- 若资源每次请求都变化,则没有任何帮助。
适用范围
本条目围绕「用条件请求节省带宽」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const res = await fetch(url, {
headers: store.etag ? { 'If-None-Match': store.etag } : {},
});
if (res.status === 304) return store.body;
store.etag = res.headers.get('etag');
store.body = await res.json();
return store.body;