output: {
  filename: '[name].[contenthash:8].js',
  chunkFilename: '[name].[contenthash:8].js'
}

只改了一个常量,发版后文件名还是 app.3f2a1c.js,用户打开的行为跟改之前一样,服务端文件的时间戳却是新的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,contenthash 只对模块内容算摘要,常量被内联进 runtime 或者提取到单独的 chunk,主文件内容没动,hash 自然不变。CDN 和浏览器都按文件名判断新旧,就继续用旧副本。

围绕「文件名 hash 未变」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

处理上按这个顺序:把这类常量从 runtime 里拆出来,跟着业务 chunk 一起算 hash;构建后比对两次产物的文件名,没变说明命中了提取规则;临时用查询串兜底,版本号取构建时间,别写死。

改完只确认一件事:改了常量重新构建,文件名末八位跟着变,刷新拿到新内容。

作者 9823189