面试官:Cache-Control 等缓存机制一般是前端配置还是后端配置?
回答思路
静态资源缓存(Cache-Control、ETag、Last-Modified) 通常是后端(或 CDN)配置的,因为 HTTP 头部是由服务器返回的,前端无法直接修改服务器响应头。
前端可以通过 标签、Service Worker 以及 Web Storage(如 localStorage)对部分资源进行缓存控制,但对于 HTTP 级别的缓存,通常依赖后端或 CDN。
1. Cache-Control 配置(通常由后端或 CDN 设置)
Cache-Control 头部用于控制浏览器和 CDN 的缓存行为,前端无法直接修改 HTTP 头部,而是由后端服务器(如 Nginx、Apache、Node.js)或 CDN 进行配置。
location /static/ { expires 1y; add_header Cache-Control "public, max-age=31536000, immutable"; }
public:允许任何人(包括 CDN)缓存资源。
max-age=31536000(1年):静态资源缓存 1 年,避免重复请求。
immutable:表示该资源不会改变,即使用户刷新页面也不会重新请求。
2. ETag 和 Last-Modified(后端控制)
这两个 HTTP 头用于判断资源是否发生变化,以避免不必要的下载:
ETag(实体标签): 服务器给资源生成一个唯一的标识符(哈希值),如果内容未变,返回 304 Not Modified。
Last-Modified(最后修改时间): 浏览器请求时带上 If-Modified-Since 头,如果资源没有更新,服务器返回 304。
Nginx 服务器启用 ETag 和 Last-Modified(默认开启):
location /images/ { expires 30d; etag on; add_header Last-Modified $date_gmt; }
3. 前端可以做的缓存优化
虽然 HTTP 缓存通常由 后端/CDN 负责,但前端也可以通过一些方式优化缓存:
(1) meta 头部(限制页面缓存)
前端可以用 标签来控制页面缓存,例如:
no-cache:浏览器必须向服务器验证资源是否过期(但仍可用 ETag 和 Last-Modified)。
no-store:浏览器不会缓存该资源,每次都重新下载。
must-revalidate:如果缓存过期,必须重新请求。
(图片来源网络,侵删)(2) 使用 Service Worker(前端缓存资源)
前端可以使用 Service Worker 在 Cache Storage 里缓存 API 数据或静态资源,实现离线访问:
self.addEventListener("fetch", event => { event.respondWith( caches.match(event.request).then(response => { return response || fetch(event.request); }) ); });
(3) 利用 LocalStorage 存储 API 数据
如果是 API 数据,前端可以用 localStorage 进行缓存:
(图片来源网络,侵删)const data = localStorage.getItem("userData"); if (data) { console.log("从缓存加载数据", JSON.parse(data)); } else { fetch("/api/user") .then(res => res.json()) .then(data => { localStorage.setItem("userData", JSON.stringify(data)); }); }
4. 一般是前端还是后端配置?
优化方案 前端负责 后端/CDN 负责 Cache-Control ❌
✅ 服务器/CDN 配置
(图片来源网络,侵删)ETag / Last-Modified
❌
✅ 服务器生成哈希或时间戳
meta 标签缓存控制
✅
❌
Service Worker
✅
❌
LocalStorage 缓存
✅
❌
5. 面试官最佳回答
“Cache-Control、ETag 和 Last-Modified 等 HTTP 缓存机制通常由后端服务器或 CDN 配置,因为它们是 HTTP 头的一部分,前端无法直接修改服务器响应。但前端可以通过 头、Service Worker 和 LocalStorage 来优化缓存,比如拦截请求、缓存 API 数据或控制页面缓存策略。”
“在实际项目中,我们通常让 CDN 或后端设置 Cache-Control: max-age=31536000, immutable 来缓存静态资源,同时用 ETag / Last-Modified 让浏览器避免重复下载已缓存的资源。此外,前端也可以使用 Service Worker 来缓存数据,提高离线访问能力。” 🚀
这样回答能展示你的 缓存机制理解 + 实战经验,面试官会认可你的能力!💪
最后:
React Hook 深入浅出
CSS技巧与案例详解
vue2与vue3技巧合集
VueUse源码解读