改了样式,自己电脑上刷新就生效,客户那边还是旧版布局。第一反应是在代码里加一句清缓存,写完发现一点用没有,客户截图里还是老的按钮颜色。

HTTP 缓存前端脚本碰不到

浏览器里那份 css、js,去留由 Cache-Control、ETag、Last-Modified 决定,JavaScript 没有接口能删掉它。location.reload 只是重新发请求,请求仍可能命中缓存。所谓强制刷新,得用户按 Ctrl+F5 才有。这也是为什么每次都要教客户按那几个键。

能删的是存储和 Cache Storage

localStorage、sessionStorage 可以用 clear 清空,IndexedDB 能按库删,Service Worker 的 caches.delete 也能删掉自己存过的响应。这些删的是应用自己写的缓存,跟浏览器对静态资源的缓存是两码事。删完记得让页面重新拉数据。

reload 加参数早就没用了

location.reload 传 true 曾经表示绕过缓存,标准里已经删掉这个参数,现在传了也不生效。想绕只能在请求地址后加时间戳或随机数,代价是每次都重新下载。首页的 html 可以这么干,几百 K 的图片库不行。

治本是文件名带 hash

构建工具输出 app.3f2a1c.js,内容一变文件名就变,浏览器自然去拉新的。HTML 本身设 no-cache,让它每次回服务器确认,静态资源设长期缓存。这套组合比任何清缓存的代码都可靠。上线后顺手看一眼响应头,别让中间层把 no-cache 改回去。

前端能清的是自己写的存储,静态资源要靠文件名和响应头。写一行 clear 解决不了客户看到的旧页面。