缓存更新后样式没生效,怎么破?

IT人亚飞 阅读 16

我用 webpack 打包的项目,每次改完 CSS 都会生成带 hash 的文件名,但线上用户有时候还是看到旧样式。我试过在 link 标签里加版本号,也确认服务器没开强缓存,可问题还是偶尔出现。

比如这段按钮样式明明改了背景色,但刷新后还是老颜色:

.btn-primary {
  background-color: #007bff;
  border: none;
  padding: 8px 16px;
  border-radius: 4px;
}

是不是我漏了什么缓存策略?CDN 还需要额外配置吗?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
锦灏~
锦灏~ Lv1
这个问题挺经典的,你说的"偶尔出现"很关键,说明不是代码逻辑问题,而是缓存层的问题。

先说最可能的根因:CDN缓存没清掉。

你确认服务器没开强缓存是对的,但CDN这一层很容易被忽略。CDN节点分布在全国各地,每个节点都可能缓存着旧文件,用户访问到哪个节点就看到什么效果,这就是为什么"偶尔"出问题。

排查步骤:

1. 打开浏览器Network面板,看请求这个CSS文件时返回的HTTP状态码。如果是200且来自CDN,那就是CDN缓存了旧文件。如果是304,说明浏览器在跟服务器协商,这个通常没问题。

2. 看看构建后生成的HTML里,link标签的href是不是每次都变。有些人喜欢手动在后面加?v=xxx,但如果你加的是固定值或者构建时没更新这个版本号,那等于没加。正确做法是让webpack的html-webpack-plugin自动处理,它会在引入的文件后面加hash。

3. CDN配置方面,如果是国内CDN,通常有"缓存过期设置"或者"参数跟随"之类的选项。最好把CSS这类静态资源的缓存时间设短一点,比如几分钟或者十几分钟,同时确保CDN会跟随URL参数或hash来区分不同版本。

4. 还有一个容易漏的:浏览器本身的disk cache。你在本地测试时即使服务器返回了新文件,浏览器也可能从本地缓存读。开发时最好用无痕模式或者手动clear cache。

最后提醒一句,检查一下你的webpack配置里CSS文件用的是不是contenthash而不是chunkhash。chunkhash是按chunk计算的,如果CSS和JS在同一个chunk里,JS没变的话CSS的hash可能也不变。改成contenthash会准确一些。

如果还有问题,把CDN那边返回的Cache-Control响应头发出来看看。
点赞
2026-03-20 00:04
爱学习的令敏
问题大概率出在HTML被缓存了。浏览器加载的是旧HTML,里面还是旧的文件名。

解决:给入口HTML设Cache-Control: no-cache,让CDN也不缓存HTML。CSS用contenthash而不是chunkhash。
点赞
2026-03-18 11:04