39 lines
2.9 KiB
Markdown
39 lines
2.9 KiB
Markdown
# PROGRESS · 首页加载失败可恢复性(2026-09-22)
|
||
|
||
工作树:`.worktrees/home-bootstrap-reliability-20260922`
|
||
分支:`codex/home-bootstrap-reliability-20260922`
|
||
开工时 `origin/staging` = `10baeb2fa865743c428806e115ac92ca9d92fb71`。未 push。未改 `page.tsx`。
|
||
|
||
既有 `TASK-first-paint-dead-screen-fallback-20260917.md` 尚未合入。本分支按它的未完成项做了唯一一套内联兜底,并完成断句后行断言清理。不另写一份 first-paint 进度。
|
||
|
||
## T1 兜底
|
||
|
||
- 根 layout 在主题脚本旁增加 `firstPaintFallbackBootScript()`。生成结果是经典 `<script>`:无 `type="module"`,无 `=>` / `const ` / `let ` / `class ` / 模板串 / `?.` / `??`。
|
||
- 触发:`setTimeout` **13000ms**(大于 `page.tsx` 的 8000 与准备揭幕的 4000)。回调里仍有 `.app-loading` 且 `documentElement` 的 `data-hydrated` 不是 `"1"` 时,替换 `.app-loading-content`。
|
||
- 文案:标题「这个页面没能加载完」,正文说明网络中断或浏览器过旧,并提示清除 Safari 本站数据或升级到 iOS 16.4 以上。唯一按钮「重新加载」,只在点击时 `location.reload()`。
|
||
- 揭幕标记写在 `useHomeShellRegistration`:`hydrated` 为真时设 `document.documentElement.dataset.hydrated = "1"`。`Home()` 未加 `useState` / `useRef`,`page.tsx` 未改。
|
||
- 复用 `.app-loading-error` 卡片,没有第二套转圈或骨架。
|
||
|
||
## T2 分流
|
||
|
||
六类不并成「接口慢」:`hydrate-timeout`、`chunk-404`、`chunk-parse`、`stale-cache`、`weak-network`、`api-error`。前五类可以由内联脚本在 bundle 没跑起来时标记;`api-error` 仍是 bundle 里的「连接云端服务超时」那一屏。匿名对象只有 `category`、`buildId`、`durationMs`。
|
||
|
||
真人清单:`docs/testing/home-bootstrap-reliability-20260922.md`。BUG-936 改为「兜底已补、根因待分流」,未标 resolved。低版本 Safari 与真实 chunk 失败未在浏览器验收。
|
||
|
||
## T3 后行断言
|
||
|
||
`frontend/src` 已无 `(?<=`。共用 `splitAfterSentencePunctuation`。表驱动用例覆盖中文句号、问号、叹号、分号、英文标点、换行、连续标点、结尾无标点,并与旧正则逐字对照。既有校正与报告断言未改。另立 BUG-998(不占用 996 / 997 / 999)。
|
||
|
||
## 验证
|
||
|
||
定向测试(未跑全量 `npm test`,未跑 `next build`):
|
||
|
||
| 命令 | 结果 |
|
||
| --- | --- |
|
||
| `npx tsx --test tests/sentence-split.test.ts tests/first-paint-fallback-contract.test.ts` | 6 pass / 0 fail |
|
||
| `npx tsx --test tests/home-shell-growth-contract.test.ts tests/agent-voice-copy-contract.test.ts tests/rectification-collect-prompt.test.ts tests/rectification-adopt-narration-20260904.test.ts` | 48 pass / 0 fail |
|
||
| `.\node_modules\.bin\tsc --noEmit` | 0 错 |
|
||
| `npm run lint` | 0 error / 119 warning(既有 warning,未顺手改) |
|
||
|
||
`home-shell-growth-contract` 通过,因此 `Home()` 的 `useState` / `useRef` 没有超过现有上限,行数也没有超过粗护栏。
|