HTTP 缓存分两级。强缓存:响应头 Cache-Control: max-age=3600(或旧版 Expires)声明新鲜期,有效期内浏览器直接使用本地副本,连请求都不发,DevTools 显示 200 (from disk/memory cache)。协商缓存:副本过期后带条件发请求——If-None-Match 带 ETag(内容指纹)、If-Modified-Since 带 Last-Modified,服务器比对后未变则返回 304 空体,浏览器复用缓存,只付出一次 RTT 的代价。
细节与决策:1)Cache-Control 常用指令:no-cache(每次都协商,不是「不缓存」)、no-store(真不缓存,敏感数据用)、public/private(是否允许 CDN 等共享缓存存);2)ETag 优先级高于 Last-Modified,因为后者只有秒级精度且文件 mtime 变化不代表内容变化(ETag 弱点是多服务器生成不一致与计算开销);3)前端工程化标准姿势:HTML 用 no-cache 始终协商,JS/CSS 等静态产物文件名带内容哈希 + max-age 一年 immutable——内容变哈希变 URL 变,旧缓存自动失效。追问方向:启发式缓存(无头时按 Last-Modified 的 10% 估算)、Service Worker 与 HTTP 缓存的层次关系、CDN 缓存键与回源策略。
(约 430 字)