2.1 KiB
2.1 KiB
docs/24 源码/即时渲染来回切换文本「有→无→无→有」修复
现象(用户真机报回)
空白文档 → 源码模式输入文本 → 切即时渲染:文本在 ✓ → 切回源码:文本没了 ✗ → 切即时渲染:还是没了 ✗ → 再切源码:又出现了。文本随切换闪烁。
根因(无头浏览器按原步骤复现,与报回现象逐拍吻合)
退出源码模式时 bumpPaneEpoch 强制富文本窗格重挂:新窗格按状态里的
新文本(源码里输的)初始化 ✓;但旧窗格卸载时的最终回写
(onFinalMarkdown → syncEditorContent)随后把旧窗格自己的旧文本写回状态,
盖掉源码文本。此后每次切换,新挂载的一方读状态(已被盖成旧文本),而
卸载的一方又把自己显示的文本写回——于是文本在两个版本间来回翻面:
状态与画面永远差一拍。
审计期已有同类修复(外部重载路径的 suppressFinalWrite 闸门,专防 「卸载回写覆盖」),但退出源码模式这条重挂路径漏加了闸门。
修复(App.tsx)
- 闸门集中进 bumpPaneEpoch:凡 epoch 重挂(源码退出重建、外部 重载),旧窗格的卸载回写必然过期,重挂前先上闸门丢弃,1.5 秒自清; 外部重载处原有的本地闸门删除,统一走这一处。
- 源码模式下禁富文本窗格回写:活动标签处于源码模式时,其隐藏的 富文本窗格的 onMarkdown / onSyncInitial 一律丢弃——它的文本是进源码 前的旧稿,迟到的防抖回写同样会盖掉源码输入。
保活淘汰、关标签等正常卸载不经 epoch 重挂,回写照旧,不受影响。
验证
- 无头浏览器按用户原步骤五连切:修复前 step3 ✗ / step4 ✗ / step5 ✓ (与报回完全一致),修复后五步全部 ✓。
- tsc 0 错误;vitest 全量通过;vite 构建通过。
待真机复验
- 反复切换源码/即时渲染,文本与光标位置稳定;
- 外部修改文件触发的重载仍正常(闸门合并后回归)。