三步根治前端缓存“顽疾”
引言:你的代码更新,用户为何“视而不见”?
“我明明部署了新版本,用户为什么还在看旧页面?!” —— 这是多少前端开发者深夜加班时的灵魂拷问。
问题的根源往往不是代码没上传,也不是服务器抽风,而是浏览器和服务器联手上演的一场“缓存大戏”。
本文将带你化身“侦探🕵️♂️”,用三步精准定位问题,手把手教你解决页面未更新问题,让用户永远看到最新鲜的页面!
一、案发现场:缓存是如何“偷梁换柱”的?
1.1 经典症状
•用户反馈页面功能异常,但开发者本地测试正常
•浏览器反复刷新后,
index.html
引用的仍是旧版 JS/CSS 文件•查看网络请求,某些文件状态码显示
304 Not Modified
或 200 OK (from memory cache)
1.2 幕后黑手
作案手法 | 经典台词 | |
---|---|---|
浏览器缓存 | 擅自保留旧文件副本 | “这个 JS 我上周刚拿过!” |
Nginx 默认配置 | 未正确设置缓存响应头 | “我按规矩办事,怪我咯?” |
CDN 缓存 | 全球节点同步延迟(隐藏 Boss) | “急什么,等我喝完这杯茶” |
二、破案工具:缓存控制响应头
2.1 强缓存 vs 协商缓存
•强缓存:浏览器直接使用本地副本,不询问服务器
Cache-Control: max-age=31536000 # 缓存一年!
•协商缓存:浏览器询问服务器资源是否变化
Last-Modified: Wed, 20 May 2024 08:00:00 GMT
ETag: "abc123"
2.2 核心原则
•HTML 文件:禁止缓存,永远从服务器获取最新版本
•静态资源(JS/CSS/图片):带
hash
文件名 + 长期缓存•静态资源(JS/CSS/图片):非
hash
文件名 + 短期缓存
# 构建产物示例
/dist/index.html
/dist/logo.png
/dist/assets/main.3f7a8b.js
/dist/assets/style.abcd12.css
/dist/assets/hello.ac2314.png
三、终极方案:三步根治缓存问题
3.1 第一步:Nginx 精准狙击(配置示例)
server {
listen 80;
server_name your-domain.com;
root /path/to/your/dist;
# ==============================================
# 1. 处理 /assets/ 目录下的带哈希资源(长期强缓存)
# ==============================================
location ^~ /assets/ {
# 缓存 1 年(兼容旧浏览器)
expires 1y;
# 现代浏览器强缓存(immutable 表示内容不可变)
add_header Cache-Control "public, max-age=31536000, immutable";
# 安全加固,防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff";
# 直接返回文件,不再检查其他规则
try_files $uri =404;
}
# ==============================================
# 2. 处理其他目录下的无哈希静态资源(短期缓存)
# ==============================================
location ~* \.(?:js|mjs|css|png|jpg|jpeg|gif|ico|svg|webp|avif|woff|woff2|ttf|otf|eot|mp4|mp3|webm|ogg|json|xml|txt|csv|wasm)$ {
# 排除 /assets/ 目录的干扰
if ($request_uri ~* "^/assets/") {
break; # 跳过此规则