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