灰度的时候,老页面里点了一个改过签名的按钮,控制台报 undefined is not a function,栈顶落在 vendor 里。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

location /assets/ {
  root /srv/app/releases/$release;
  try_files $uri =404;
}

新旧两版 chunk 共用同一份运行时,模块注册表按 id 复用,老页面拿到的引用指向了新模块。接口签名一变,调用就落到不存在的属性上。这一点先确认清楚,后面就不用反复试。

「新旧 chunk 混用」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,每次发布生成独立的资源目录,旧版本继续可访问;入口 HTML 和它引用的 chunk 绑同一个版本号,不要跨版本混用;上线前用旧页面点一遍核心操作,比只看首屏可靠。

改完照着核一遍,打开旧页面点核心按钮不再报错,Network 里 chunk 都来自同一版本目录。

作者 9823189