静态文件缓存时间如何设置,关键不在于把时间统一调长或调短,而在于判断文件更新后,用户能否及时拿到新版本。带内容指纹的文件可以放心缓存较久;文件名不变、内容却会更新的资源,则应缩短缓存或要求重新验证。
先按文件是否会变,划分缓存策略
文件名带版本或内容指纹
例如将样式文件命名为 app.a81c.css,内容变化时同时生成新文件名。浏览器请求新页面后会发现文件地址已变,因此旧文件即使仍在缓存中,也不会替代新版本。这类静态资源通常可设置较长的 max-age,常见做法是约一年,并配合 immutable,表示有效期内不必反复验证。前提是发布流程确实会更换文件名,且旧文件不会被覆盖。
文件名固定、内容可能更新
若地址始终是 logo.svg 或 site.css,缓存时间过长可能让用户继续看到旧图标或旧样式。可从几分钟到数小时起步,具体取决于更新频率和用户对新内容的敏感程度;频繁调整的资源宜偏短,稳定资源可适当延长。重要页面中的入口文件,通常要比字体、长期不变的图片更谨慎。
理解响应头,避免把“不缓存”混为一谈
Cache-Control 用于声明缓存规则。max-age 以秒为单位规定新鲜期,例如 3600 秒代表一小时。ETag 可作为资源版本标识:资源过期后,客户端可以询问内容是否变化;若未变化,服务器可返回不带正文的验证结果,减少重复传输。
no-cache 不等于绝对不保存,而是使用前需要重新验证;no-store 则表示不应存储响应,适用于不希望留在缓存中的内容,不宜随手用于所有静态文件。若使用固定文件名并要求及时更新,短期缓存加验证,通常比长期缓存后让用户等待过期更合适。
按发布方式选择时长
| 资源情况 | 可参考的策略 | 主要取舍 |
|---|---|---|
| 带内容指纹的 CSS、JavaScript | 较长有效期,常见约一年,并使用 immutable | 重复访问更快;发布必须生成新文件名 |
| 固定名称的图片、字体或样式 | 几分钟至数小时,按更新频率调整 | 配置简单;时长过长会延迟用户看到改动 |
| HTML 入口页 | 短缓存或 no-cache,并在需要时验证 | 更容易发现新资源地址;会增加验证请求 |
表中是起始范围,不是所有系统的统一标准。浏览器缓存、服务器配置和中间缓存的行为可能不同;响应头最终效果应以实际返回的规则为准。HTML 与图片也不必采用相同策略。
上线前的四步检查
- 列出资源。区分 HTML、带指纹文件和固定文件名资源,并标明哪些内容会频繁更新。
- 确认发布规则。检查内容变化时是否会生成新文件名;若不会,避免直接套用长期缓存。
- 设置响应头。分别配置 max-age、是否需要 ETag 验证,以及是否适合 immutable;不要只修改一类文件后便假设全站生效。
- 验证实际结果。发布后检查响应头,再用浏览器重新加载页面,确认更新后的文件地址和内容符合预期;发现旧样式时,先核对文件名及缓存规则。
常见问题
缓存一年会不会让用户永远看不到更新?
如果文件名带内容指纹,更新时会使用新地址,通常不会被旧地址的一年缓存挡住。若文件名固定,就不应照搬这一做法。
ETag 和较短缓存时间需要同时使用吗?
不一定。短有效期控制多久后重新检查,ETag 帮助判断内容是否变化;是否同时启用取决于服务器和发布方式。
静态文件缓存时间如何设置才不容易出错?
优先让会更新的文件拥有版本化地址,再给这类文件较长缓存;无法版本化的资源采用较短有效期或重新验证,并在每次发布后检查响应头。这样更容易兼顾加载速度与更新及时性。