滴滴实习一面:浏览器缓存机制
这是之前一个27同学面滴滴实习的题目,部门是体验平台,针对浏览器缓存问了强弱缓存区别以及使用场景等问题,小圆这边整理好了~
浏览器缓存是前端性能优化中最重要的一环。合理利用缓存,不仅能显著提升页面加载速度、减少服务器压力,还能改善用户体验。但在面试中,很多人只会“Cache-Control、ETag、Expires”这几个名词,却说不清底层逻辑与交互过程。本文讲解浏览器缓存机制,从类型、原理到实践配置,帮你彻底吃透这个高频考点。
一、缓存的分类概览
浏览器缓存大体分为两类:
类型 | 是否向服务器发请求 | 命中后资源来源 | 常用字段 |
强缓存(Strong Cache) | 否 | 本地缓存(Memory/Disk) |
、 |
协商缓存(Negotiated Cache) | 是 | 服务器返回304,浏览器使用本地缓存 |
、 |
二者的关系可以概括为:强缓存优先,未命中后再进入协商缓存。
二、强缓存机制详解
1. 触发时机
当浏览器请求某个资源时,会先检查本地缓存是否可用(即强缓存是否命中)。
2. 核心字段
(1)Cache-Control
现代浏览器主推的缓存控制头,它的优先级高于 Expires。常见取值如下:
指令 | 含义 |
| 资源在600秒内有效 |
| 强缓存失效,强制进入协商缓存 |
| 禁止缓存任何内容 |
| 所有人都可以缓存(CDN、中间代理) |
| 仅客户端可缓存,代理服务器不能缓存 |
(2)Expires
HTTP/1.0 时代的产物,通过绝对时间控制缓存失效,如:
Expires: Wed, 22 Oct 2025 12:00:00 GMT
缺点是依赖客户端时间,易受系统时间差影响。
3. 强缓存的优先级判定
浏览器判断逻辑如下:
if (Cache-Control 存在) → 使用 Cache-Control else if (Expires 存在) → 使用 Expires else → 不使用强缓存
四、协商缓存机制详解
当强缓存失效后,浏览器会携带部分资源标识向服务器发起请求,询问资源是否更新。若服务器确认资源未变更,则返回 304 Not Modified,浏览器直接使用本地缓存副本。
1. 核心字段
(1)Last-Modified / If-Modified-Since
- 服务器首次响应:
Last-Modified: Wed, 22 Oct 2025 10:00:00 GMT
- 浏览器下一次请求时:
If-Modified-Since: Wed, 22 Oct 2025 10:00:00 GMT
若服务器判断文件无更新,则返回 304。
缺点:
- 时间精度以秒为单位,若文件在一秒内被多次修改,可能检测不到更新。
- 一些文件周期性重新生成,即使内容相同,时间不同也会触发重新下载。
(2)ETag / If-None-Match
ETag 是资源内容的唯一标识(通常是哈希值)。
- 服务器首次响应:
ETag: "filehash-12345"
- 浏览器下一次请求时:
If-None-Match: "filehash-12345"
若 ETag 一致,则返回 304。
优点:精度更高,不依赖时间。缺点:计算 ETag 会增加服务器负担。
一般做法:两组字段(ETag / Last-Modified)常同时使用,保证兼容性与准确性。
五、缓存的整体流程
浏览器加载资源时的完整判断流程如下:
- 检查强缓存(
Cache-Control、Expires) - 发起请求携带验证字段(
If-Modified-Since或If-None-Match)。 - 服务器判断资源是否变动:
六、缓存位置与生命周期
缓存可存在多个层次:
位置 | 特点 |
Memory Cache | 存在内存中,关闭标签页即失效 |
Disk Cache | 存储于硬盘,可长期存在 |
Service Worker Cache | 可自定义缓存逻辑,离线可用 |
Push Cache(HTTP/2) | 仅连接生命周期内有效 |
浏览器通常会根据资源类型与大小选择合适的存储位置。
七、实际项目中的应用策略
1. 静态资源(JS/CSS/图片)
- 使用文件指纹(hash)解决更新问题;
- 设置长时间缓存:
Cache-Control: max-age=31536000, immutable
- 文件变更时文件名变化,浏览器自动拉取新版本。
2. 接口请求(API)
- 频繁变化 → 使用
no-cache或no-store; - GET 接口若数据稳定,可考虑
ETag提升性能。
3. HTML 页面
- 通常设置为
no-cache; - 通过版本号或构建标识控制更新。
总结
前端常用的缓存方案一般采用强缓存与协商缓存相结合的方式,具体是:
1. HTML文档配置协商缓存
2. JS、CSS、图片等资源配置强缓存
这样当项目版本更新时,可以获取最新的页面;若版本未更新,则可以继续复用之前的缓存
八、前端开发者常见误区
- 误区1:
no-cache就是不缓存实际上,它只是强缓存失效,仍可能走协商缓存。 - 误区2:
ETag与Last-Modified互斥它们可以并存,服务器优先验证 ETag,再验证时间。 - 误区3:缓存设置全交给后端前端在构建环节(Webpack/Vite)也能配置静态资源 hash 与缓存策略。
总结
浏览器缓存机制是 Web 性能优化的基石。可以用一句话总结它的核心逻辑:先看强缓存(Cache-Control、Expires),再看协商缓存(ETag、Last-Modified)。命中即本地读取,未命中则询问服务器是否更新。
面试时若能把流程、字段、优缺点等等讲清楚,并结合项目实践(比如资源指纹 + CDN 缓存策略),可以给面试官留下好印象哦。
#前端八股文##面试##日常实习##前端##秋招#
查看11道真题和解析