docs(home): first-load fix records — stylesheet-blocked early reads (BUG-1127)
Independent Staging Quality Gate / validate (push) Successful in 12m58s
Independent Staging Quality Gate / publish (push) Successful in 3m32s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-01 01:36:37 +08:00
co-authored by Claude Opus 5.5
parent c2265dabb2
commit ca1353ebe4
4 changed files with 22 additions and 0 deletions
@@ -118,3 +118,22 @@
| 代码审阅 | 早发脚本只在 `/` 生效,每个结果只用一次、30 s 后作废、网络失败回退到正常请求;猜错的人物、换账号时丢弃预取的会话列表;确认门槛把研究 JSON 换成用到的 6 个值,并有测试与原 JSON 比对。Caddy 原样转发 Next 的缓存头,镜像会复制 `public/`,线上能生效 |
遗留:T2 侧栏品牌字「Jyotisha」在 `load` 前仍会下载宋体切片 00(38 KB,不在决策 1 的范围内);T7 校正界面与 markdown 仍在首屏;T4 已记入 BLOCKED;T5 未做。部署后要核对:连续两次部署,字体地址不变;在 staging 线上复测。
## 修复单 · 早发请求被样式表挡住(2026-10-01)
任务书 `docs/tasks/TASK-home-first-load-fix-20261001.md`,分支 `codex/home-first-load-fix-20261001`,基线 `origin/staging` `6e2f0af5`(代码同已部署的 `e600cff5`)。
- 做法:采用首选方案,`<script async src={bootEarlyReadsScriptSrc()} />`,src 是原 ES5 脚本的 base64 data URL。构建后的 `/` HTML 里,它排在 3 个样式表之后,但带 `async=""`,data URL 没被改写,所以没有走 public/ 静态脚本的备选方案。主题脚本和首屏兜底脚本没动。
- 测量(本地 `next start`,接口 600 ms,`--css-delay 1500`,每组 3 次):
| | 第一个样式表放行 | 早发请求发出 | 早发早于样式表 | 揭幕 |
| --- | --- | --- | --- | --- |
| 基线 `e600cff5` | 1543 / 1528 / 1531 ms | 1559 / 1558 / 1545 ms | 否 | 2400 / 2392 / 2363 ms |
| 修复版 | 1545 / 1533 / 1527 ms | 45 / 32 / 34 ms | 是 | 2392 / 2387 / 2369 ms |
| 修复版,iPhone UA + 390×844 | 1521 / 1538 ms | 21 / 42 ms | 是 | 2352 / 2403 ms |
本地的揭幕时间没有变:样式表拖住了首屏 JS,而本地接口 600 ms 比 1.5 s 的 CSS 延迟短,早发提前的时间被 JS 等待盖住了。线上 CSS 与 JS 都走真实网络,早发提前约 2.4~3.1 s,可以和 JS 下载并行,要部署后复测。
- 取用:两种 UA 下,揭幕后 `window.__jyotishaBootReads` 只剩 `startedAt`,四个早发结果都已被取用。
- 测试:`tsc` 0 错;`lint` 0 error,126 warning(同基线);`npm test` 4513 / fail 24 / cancelled 0,失败名单与基线逐条一致,测试名无增减;`next build` 通过,`/` Static。改了一条断言(layout 装载方式,已写三栏),并新增「data URL 解码后与 ES5 脚本逐字节相同」。
- 环境缺口:无头 Chrome 只换了 UA,引擎不是 WebKit;真实 iOS Safari 是否执行 async data: 脚本,留在真机清单第 8 步。
+1
View File
@@ -385,6 +385,7 @@
| (直接执行,无任务书) | `PROGRESS-notice-loading-polish-20260930.md` | 性别只在档案(1119)、星盘气泡频闪与表格圆角(1120)、全站顶部浮层提示(1121/1122)、我的报告提速与分页(1123/1124)、宫位点亮等待与今日一句不跳(1125) | **已验收,推 staging**;真机清单 `docs/testing/notice-loading-polish-20260930.md` 待产品 | 合并分支 `codex/polish-integrate-20260930` |
| `TASK-report-language-switch-stale-20260930.md` | `PROGRESS-report-language-switch-stale-20260930.md` | 报告阅读页切换中文 / English 后正文不换:正文与核对表同级重复 key(`key={shown}`),旧语言节点残留(BUG-1126);改 key + 整页切换回归测试 | **已验收,推 staging**(Claude 直接执行);真机第 10、11 步待产品 | 分支 `codex/report-language-switch-stale-20260930` |
| `TASK-home-first-load-20260930.md` | `PROGRESS-home-first-load-20260930.md` | 进站等待太久:冷启动接口串行 4 轮且要等 JS 跑完才发(BUG-1127,T1+T8 早发)、每次部署全部 JS 与宋体缓存失效(BUG-1128)、加载屏宋体抢带宽(BUG-1129)、首屏 JS 带城市表 / 校正代码 / 研究数据(BUG-1130,T7 瘦身);产品定加载屏用黑体、宋体只下一次;`supportsImmutableAssets` 先验证后上线;「新开页面先显示上次内容」待产品拍板,不在本单 | **已验收,推 staging**(Claude 派子代理执行、独立复验);T4 blocked、T5 未做;真机清单 `docs/testing/home-first-load-20260930.md` 待产品 | 分支 `codex/home-first-load-20260930` |
| `TASK-home-first-load-fix-20261001.md` | `PROGRESS-home-first-load-20260930.md`(修复单一节) | 早发请求被样式表挡住:内联脚本排在样式表后要等 CSS 下完(BUG-1127 复测);改 async data: 脚本 + 测量脚本 CSS 延迟 / iPhone UA 开关 | **待验收**(fork 子代理直接执行,未推送):CSS 延迟 1500 ms 下早发 ≈1550 → ≈35 ms;真实 iOS Safari 欠 | 分支 `codex/home-first-load-fix-20261001` |
## 命名与归档