你有没有遇到过这种情况:改完网站的样式,刷新页面却发现还是老样子?或者新上传的头像图片死活不显示,非得强制刷新才出来?这八成是浏览器缓存搞的鬼。尤其是在前端开发或网站维护过程中,JS、CSS和图片的缓存问题特别常见,让人头疼。
为什么缓存会带来麻烦
浏览器为了提升加载速度,会把之前下载过的JS、CSS和图片存在本地。下次访问时直接从缓存读取,省了重复请求。这本是好事,但一旦文件更新了,浏览器却不知道,继续用旧的,页面就出问题了。比如你刚优化了一段按钮动画的CSS,用户却看不到变化,还以为你没改。
给静态资源加版本号
最常用的破缓存方法就是给文件名“加后缀”。比如把 style.css 变成 style.css?v=1.1,浏览器会认为这是个新文件,重新请求。
<link rel="stylesheet" href="style.css?v=1.1">
<script src="app.js?v=2.0"></script>
<img src="avatar.jpg?t=20240405" alt="头像">
这个“v”后面的数字可以是版本号,也可以是时间戳。每次更新文件时改一下,就能强制刷新缓存。简单粗暴,但有效。
利用构建工具自动处理
如果你用 Webpack、Vite 这类现代前端工具,它们能自动给文件名加哈希值。比如 app.x1y2z3.js,只要内容变了,哈希就变,文件名也就变了。这样既能缓存,又能保证更新生效。
<script src="app.a1b2c3.js"></script>
<link rel="stylesheet" href="main.d4e5f6.css">
这种方式不需要手动改版本号,适合长期维护的项目。
服务器端设置缓存策略
光靠前端加参数还不够,服务器也要配合。比如对图片这类不常变的资源,可以设置长时间缓存;而JS、CSS可以设短一点,或者用 Cache-Control: no-cache 让浏览器每次检查是否有更新。
# Apache 配置示例
<Files "*.js">
Header set Cache-Control "no-cache"
</Files>
# Nginx 配置示例
location ~* \.css$ {
expires 1d;
}
用户端临时解决方案
有时候你没法立刻改代码,但又想让用户看到最新内容。这时候可以提醒他们按 Ctrl + F5 强制刷新,清掉缓存重新加载。虽然不是长久之计,但应急够用。
缓存问题说到底是个“信任”问题——浏览器太相信自己存的东西了。只要我们想办法告诉它“这次真的不一样”,问题就迎刃而解。别让缓存成了用户体验的绊脚石。