← 中文资源

简体中文版本

用条件请求节省带宽

保存 ETag 或 Last-Modified,下次请求时带回 If-None-Match,并正确处理 304,使未变化的资源几乎零成本。

阅读英文原文

概述

轮询客户端最常见的浪费是把未变化的资源反复完整下载。条件请求让服务器在内容未变时只回一个 304,客户端复用本地副本即可,显著降低带宽与耗电。

关键步骤

  1. 保存上一次成功响应中的 ETag 或 Last-Modified。
  2. 下一次请求时作为 If-None-Match 或 If-Modified-Since 发回。
  3. 把 304 视为复用本地内容而非错误。
  4. 无验证器时回退为完整拉取。

验证

  • 未变化时服务器返回 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;