浏览器缓存机制详解
浏览器的缓存机制是一个分层决策过程,旨在尽可能快地提供资源(如 HTML、CSS、JS、图片等),同时减少不必要的网络请求和服务器负载。其核心流程如下:
核心执行流程
-
发起请求
用户输入 URL 或点击链接,浏览器准备加载相关资源。 -
检查强缓存(本地缓存)
- 浏览器首先检查内存缓存(memory cache)和磁盘缓存(disk cache),查找是否有该资源副本。
- 关键响应头:
Cache-Control和Expires。Cache-Control: max-age=3600:资源在 3600 秒内有效。Cache-Control: no-cache:跳过强缓存,进入协商缓存阶段。Cache-Control: no-store:禁止任何缓存行为。
- 结果判断:
- 若缓存有效 → 直接返回缓存资源(显示为 200 OK (from cache))。
- 若缓存失效 → 进入下一步的协商缓存阶段。
-
协商缓存(服务器验证)
- 浏览器向服务器发送验证请求,确认缓存是否仍可用。
- 涉及的关键头部:
If-Modified-Since+Last-Modified:- 浏览器发送上次修改时间 → 服务器比对当前时间:
- 未修改 → 返回
304 Not Modified,使用本地缓存。 - 已修改 → 返回
200 OK和新资源。
- 未修改 → 返回
- 浏览器发送上次修改时间 → 服务器比对当前时间:
If-None-Match+ETag:- 浏览器发送资源唯一标识(如哈希值)→ 服务器比对 ETag:
- 匹配 → 返回
304。 - 不匹配 → 返回
200和新资源。
- 匹配 → 返回
- 浏览器发送资源唯一标识(如哈希值)→ 服务器比对 ETag:
- 优先级:
ETag的精度高于Last-Modified(例如内容未变但时间戳变化的情况)。
-
获取新资源
- 若协商缓存失败(即未返回 304),则:
- 服务器返回
200 OK及新资源。 - 浏览器下载并缓存资源,依据响应头中的
Cache-Control、Expires决定是否缓存。
- 服务器返回
- 若协商缓存失败(即未返回 304),则:
缓存相关关键头部总结
| 头部 | 类型 | 作用 | 示例 |
|---|---|---|---|
Cache-Control | 请求/响应 | 控制缓存行为 | max-age=3600, no-cache |
Expires | 响应 | 指定资源过期时间(HTTP/1.0) | Expires: Wed, 21 Oct 2025 07:28:00 GMT |
ETag | 响应 | 资源唯一标识符 | ETag: "33a64df551425fcc55e" |
If-None-Match | 请求 | 携带缓存的 ETag 值 | If-None-Match: "33a64df551425fcc55e" |
Last-Modified | 响应 | 资源最后修改时间 | Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT |
If-Modified-Since | 请求 | 携带缓存的修改时间 | If-Modified-Since: Wed, 21 Oct 2025 07:28:00 GMT |
缓存位置分类
-
Service Worker Cache
- 通过 JavaScript 自定义缓存策略,适用于离线应用等场景。
-
Memory Cache(内存缓存)
- 存储高频使用的短生命周期资源,随页面关闭释放。
-
Disk Cache(磁盘缓存)
- 存储大文件(如 CSS、JS、图片),具有较长生命周期。
-
Push Cache(推送缓存)
- HTTP/2 中用于推送资源,会话级别缓存,较少被使用。
实际应用场景示例
-
静态资源(如 Logo)
Cache-Control: max-age=31536000 // 缓存一年 -
频繁更新资源(如 JS/CSS)
Cache-Control: max-age=86400 // 缓存一天 ETag: "x234dff" // 配合版本号或哈希文件名使用 -
禁用缓存(敏感数据)
Cache-Control: no-store
开发者注意事项
- 资源版本控制:更新资源时建议修改文件名(如
app.v2.js)或添加查询参数(如app.js?v=2),以强制客户端获取最新版本。 - 调试工具使用:
Chrome DevTools 的 Network 面板可用于查看缓存状态:200 (memory/disk cache):表示强缓存生效。304 Not Modified:表示协商缓存生效。
- 缓存问题排查:若更新资源后未生效,尝试清除缓存或使用
Ctrl+F5强制刷新。
合理配置缓存策略,不仅能显著提升网站加载速度,还能有效降低服务器压力。掌握 Cache-Control、ETag 等核心机制,是前端性能优化的重要一环。
如需进一步细化某一部分内容(如具体优化技巧、工具推荐等),欢迎继续提问!