docs: 首页停在「正在载入账户」的诊断(BUG-936)与死屏兜底任务书

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
Jesse_Chen
2026-09-17 15:10:50 +00:00
co-authored by Claude Opus 5
parent db5b0a214b
commit dc1a24ca48
3 changed files with 130 additions and 0 deletions
+24
View File
@@ -12229,3 +12229,27 @@
- 复发自:无
- 修复版本:待发布
## BUG-936 | 首页永远停在「正在载入账户」,没有超时也没有报错
- 状态:investigating
- 首次发现:2026-09-17
- 最近更新:2026-09-17
- 影响面:`/` 首屏揭幕(`app/page.tsx` 的 `!hydrated || (!account && !accountError)` 门)、`AppLoadingIndicator`、`app/layout.tsx`
- 用户现象:产品负责人转述,一位已有账号的用户在 iPhone Safari 打开 `https://staging.jyotisha.chat/`,永远停在「正在载入账户 / 同步个人资料与对话记录」,进不去页面。转圈动画还在动。
- 触发条件:尚未定位到具体条件。已排除接口侧。
- 已确认事实(2026-09-17,线上 `dc2f2a16`):
1. 该用户登录态下 `/api/account`、`/api/sessions?limit=40`、`/api/models`、`/api/rectification/cases/entry-summary` 全部 200,耗时 0.6–1.1 s,不是接口挂起。
2. `/` 的预渲染 HTML **本身就含**「正在载入账户」「同步个人资料与对话记录」与 `app-loading` 结构;转圈是 `.app-loading-orbit::after` 的纯 CSS 动画。**因此这一屏在客户端 JS 一行都没执行时也会原样显示并继续转。**
3. 兜底逻辑全部活在那段 JS 里:8 秒 `bootstrapTimeout`(写 `accountError` 并 `setHydrated(true)`)、prepare 阶段 4 秒揭幕、401 跳 `/login`。JS 没跑 → 这三条都不会发生 → 永远停住、没有任何报错。这与现象完全吻合。
4. 首页 HTML 引用 25 个 `/_next/static/chunks/*.js`,全部同步 `<script>`,任何一个没加载或解析失败,React 就不会 hydrate。实测这 25 个当前都 200。
5. 线上 bundle 的语法下限是 **Safari 16.4**:`1stw4tc266s7a.js`(Next 自己的 app-router 运行时)含类静态块 `class y extends Component{static{this.contextType=...}}`;`089-80cjt8-1t.js`(本仓中文断句 `split(/(?<=[。!?;;])\s*/)`)与 `0dmsli_y64717.js`(链接识别依赖)含正则后行断言。两者在 Safari < 16.4 都是**解析期** SyntaxError,core-js 这类运行时 polyfill 救不了。
6. 该下限不是新引入:`next: 16.3.1` 从仓库首个提交 `4aa0105f`(2026-07-15)就在。所以如果这台设备以前能用,(5) 不是本次原因。
- 待定位(需要用户侧一条信息即可分流):① 设备 iOS 版本 < 16.4 → 命中 (5);② 某个 chunk 在弱网下没下全或被内容拦截器挡掉 → 无痕窗口 / 清除网站数据后恢复;③ Safari 缓存里留着坏掉的 chunk(chunk 带 `cache-control: public, max-age=31536000, immutable`)。
- 根因:未确认,不得提前写。
- 修复:未做。
- 验证:未做。
- 防复发(已可确定的一条,独立于根因):首屏不得把「出错了」的唯一出口放在可能失败的模块 bundle 里。根 layout 需要一段与 bundle 无关的内联经典脚本,在 hydrate 超时或语法不支持时把这一屏换成可读的提示与「重新加载」。见 `docs/tasks/TASK-first-paint-dead-screen-fallback-20260917.md`。
- 相关记录:BUG-716(`/chart` 白屏 45 秒,另一条链路)
- 复发自:无
- 修复版本:未发布