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