详情介绍
一、强缓存机制
- 生效条件:当服务器返回的响应头包含`Cache-Control: max-age`或`Expires`时间戳时,浏览器会在指定时间内直接使用本地缓存资源,无需向服务器发送请求。
- 关键标头:
- `max-age=3600`表示资源在1小时内有效。
- `no-cache`强制每次请求都验证资源,但允许使用协商缓存。
- `no-store`完全禁止缓存,适用于敏感数据(如银行交易页面)。
- 存储位置:
- 内存缓存:短期存储小文件(如CSS、JS),页面关闭后自动清除。
- 磁盘缓存:长期存储大文件(如图片、视频),占用硬盘空间但持久性更强。
二、协商缓存流程
- 触发条件:当强缓存过期或标头为`no-cache`时,浏览器会发送带验证信息的请求到服务器。
- 验证方式:
- ETag验证:浏览器发送`If-None-Match`头(值为缓存资源的ETag),服务器对比当前资源ETag,若一致返回`304 Not Modified`,否则返回新资源。
- Last-Modified验证:浏览器发送`If-Modified-Since`头(值为资源的最后修改时间),服务器检查资源是否更新,未更新则返回`304`。
- 状态码处理:
- `200 OK`:资源已更新,浏览器下载新内容并更新缓存。
- `304 Not Modified`:资源未变更,继续使用本地缓存。
三、特殊缓存场景处理
- 动态内容缓存:对频繁更新的页面(如新闻列表),设置较短的`max-age`(如5分钟)并配合ETag,确保内容及时刷新。
- 单页应用优化:通过Service Worker注册缓存策略,例如:
javascript
caches.open('my-cache').then(cache => {
cache.addAll(['/index.', '/app.js']);
});
实现离线访问和资源版本控制(需为静态资源添加哈希指纹,如`style.abc123.css`)。
- 缓存失效问题:若资源文件名不变但内容更新,可能导致旧缓存被错误使用。解决方案是为静态资源添加版本号(如`v1.0`)或使用内容哈希(如`main.7b8c9f.js`)。
四、手动清理与调试
- 清除缓存:在Chrome按`Ctrl+Shift+Delete`(Windows)或`Cmd+Shift+Delete`(Mac),选择“缓存的图像和文件”进行清理。
- 开发者工具监控:按`F12`打开开发者工具→切换至“Network”面板→勾选“Disable cache”可模拟无缓存状态,观察资源加载顺序。