真实面经题目 · 原创解析
怎么考虑使用缓存的情况,怎么强制刷新?
这题考察缓存策略设计和强制刷新手段。核心是按资源类型制定策略,并通过改变 URL、改变缓存头或清理运行时缓存让客户端拿到新内容。
真实面经题目 · 原创解析
这题考察缓存策略设计和强制刷新手段。核心是按资源类型制定策略,并通过改变 URL、改变缓存头或清理运行时缓存让客户端拿到新内容。
缓存要按资源类型设计:入口 HTML 通常用 no-cache 或短缓存,保证每次发布后能拿到最新资源引用;带内容 hash 的 JS、CSS、字体等静态资产可以 long max-age + immutable,因为内容变化文件名会变;接口缓存要看数据实时性、用户维度和幂等性。强制刷新本质有三类:改变资源 URL,例如文件 contenthash、版本 query、接口版本号;改变缓存策略,例如 Cache-Control: no-cache/no-store 或降低 max-age;清理运行时缓存,例如 Service Worker 的 Cache Storage、IndexedDB、本地版本标记。代码层要避免给 HTML 永久强缓存,也不要指望 location.reload(true) 这种不可控方式解决发布缓存。
HTML 是资源入口,必须容易更新;JS/CSS/字体等文件是静态资产,适合内容 hash 后长缓存;接口响应要按用户、权限、实时性和失败代价决定是否缓存。
构建产物文件名带 contenthash,内容不变 URL 不变,浏览器可长期缓存;内容变化 URL 变化,自然绕过旧缓存。入口 HTML 更新后引用新 hash 文件,发布链路就闭合了。
如果 HTML 被 long max-age 缓住,用户拿不到新的资源清单,即使 JS 已经发布新 hash 也不会加载。HTML 更适合 Cache-Control: no-cache,让浏览器每次使用前验证。
临时强制刷新可给资源加版本 query、升级接口路径、调整 Cache-Control 或返回新的 ETag。长期方案仍应回到内容 hash 和清晰的缓存头,而不是手工拼随机参数。
如果使用 Service Worker,浏览器 HTTP 缓存之外还有 Cache Storage。发布新版本时要设计 install、activate、skipWaiting、clients.claim、旧缓存清理和兜底刷新提示。
GET 接口可以使用 ETag、max-age、stale-while-revalidate 等策略,但用户态数据要带上认证和 vary 维度。强制刷新接口通常用 no-cache 请求头、版本参数或服务端失效缓存。
HTML 决定加载哪些 JS/CSS。如果 HTML 被旧版本缓存住,用户会一直引用旧资源清单,发布的新静态资源无法被发现。
文件内容变化会生成新文件名,URL 变化后浏览器会请求新资源;内容不变则可以放心复用旧缓存。
Service Worker 可以拦截请求并从 Cache Storage 返回旧响应,即使 HTTP 缓存已过期也可能命中自己的缓存策略,所以必须设计版本清理。
可以请求时带 Cache-Control: no-cache、加版本或时间戳参数、更新 ETag,或在服务端主动失效 CDN/网关/内存缓存。具体取决于缓存在哪一层。