用户反馈
用户反馈:
md 文档右上角的 Live 点击没反应,这个是演示模式吗?
结论:不是演示模式,这是已经实现的真实 Markdown 实时预览能力。 当前点击无反应应按功能回归 / 交互失效处理。
当前代码核对
release/v1.5.0 已存在完整实时预览链路:
frontend/src/components/MarkdownExperienceBridge.tsx
动态创建 Live / 实时预览 按钮;
点击后切回 source layout;
通过 markdownLivePreviewExtension 启用 CodeMirror 实时预览;
使用 nowen.markdown.live-preview.v1 记忆模式。
frontend/src/lib/markdownLivePreview.tsx
已实现 CodeMirror decoration + React MarkdownPreview 渲染;
支持 Heading / Paragraph / Blockquote / List / FencedCode / Table 等块。
原需求 [Feature] Markdown 编辑体验增强:分屏同步滚动、任务列表交互、代码块增强与实时预览 #198 已标记 completed,因此本反馈应视为后续回归,而不是未开发功能。
当前实现的一个风险点是 Live 入口依赖 DOM bridge:查找 toolbar、查找 CodeMirror DOM、再给按钮手动绑定 click。只要响应式 toolbar / DOM 层级 / editor shell 有变化,就可能出现“按钮看得到,但没有真正切换状态”的静默失败。
目标
Live 必须成为稳定的一等编辑模式,而不是依赖脆弱 DOM 查询的附加行为。
用户点击:
应立即看到实时预览效果,并且当前模式状态清晰可见。
建议实现
P0:先修复当前点击无反应
重点排查:
findMarkdownModeGroup() 是否能找到当前桌面 / 移动 toolbar;
getEditorView() 是否在点击时能拿到正确 CodeMirror instance;
bindModeButtons() 是否因为 DOM 重建导致绑定落到旧 button;
sourceButton.click() 后 React 重渲染是否替换了 DOM,使后续 setLivePreview() 作用在旧 state / view;
MutationObserver reconcile 是否出现重复绑定或状态覆盖;
LIVE_MODE_KEY 恢复逻辑是否把刚启用的 Live 状态再次关闭。
P1:降低 DOM bridge 脆弱性
优先考虑把 Live 作为 MarkdownEditorImpl 的正式 MarkdownViewMode / React 状态,而不是运行时插入按钮并猜测原生按钮顺序。
建议模式统一为:
type MarkdownViewMode = "source" | "live" | "preview" | "split" ;
然后由 MarkdownEditorImpl 明确控制:
toolbar active state;
CodeMirror extension compartment;
local preference 持久化;
移动端模式降级;
初始化 / 切换笔记恢复。
如果本版本暂不重构,也必须把 bridge 的绑定与重绑机制补强,并增加回归测试。
UX 要求
点击 Live 后立即有明确 active 状态;
不允许“点了没反应、也没提示”;
如果实时预览因为超大文档等原因主动禁用,应给出可理解提示;
再次进入 Markdown 笔记时能正确恢复用户选择;
source / live / preview / split 之间反复切换不丢内容、不丢光标、不导致编辑器失焦异常。
验收标准
相关代码
frontend/src/components/MarkdownExperienceBridge.tsx
frontend/src/components/MarkdownEditorImpl.tsx
frontend/src/lib/markdownLivePreview.tsx
frontend/src/components/__tests__/MarkdownEditor.mobilePreview.test.ts
frontend/src/lib/__tests__/markdownLivePreview.test.tsx
关联:#198
优先级:P0/P1(现有功能回归)
用户反馈
用户反馈:
结论:不是演示模式,这是已经实现的真实 Markdown 实时预览能力。 当前点击无反应应按功能回归 / 交互失效处理。
当前代码核对
release/v1.5.0已存在完整实时预览链路:frontend/src/components/MarkdownExperienceBridge.tsxLive / 实时预览按钮;markdownLivePreviewExtension启用 CodeMirror 实时预览;nowen.markdown.live-preview.v1记忆模式。frontend/src/lib/markdownLivePreview.tsxMarkdownPreview渲染;当前实现的一个风险点是 Live 入口依赖 DOM bridge:查找 toolbar、查找 CodeMirror DOM、再给按钮手动绑定 click。只要响应式 toolbar / DOM 层级 / editor shell 有变化,就可能出现“按钮看得到,但没有真正切换状态”的静默失败。
目标
Live 必须成为稳定的一等编辑模式,而不是依赖脆弱 DOM 查询的附加行为。
用户点击:
应立即看到实时预览效果,并且当前模式状态清晰可见。
建议实现
P0:先修复当前点击无反应
重点排查:
findMarkdownModeGroup()是否能找到当前桌面 / 移动 toolbar;getEditorView()是否在点击时能拿到正确 CodeMirror instance;bindModeButtons()是否因为 DOM 重建导致绑定落到旧 button;sourceButton.click()后 React 重渲染是否替换了 DOM,使后续setLivePreview()作用在旧 state / view;LIVE_MODE_KEY恢复逻辑是否把刚启用的 Live 状态再次关闭。P1:降低 DOM bridge 脆弱性
优先考虑把 Live 作为
MarkdownEditorImpl的正式MarkdownViewMode/ React 状态,而不是运行时插入按钮并猜测原生按钮顺序。建议模式统一为:
然后由
MarkdownEditorImpl明确控制:如果本版本暂不重构,也必须把 bridge 的绑定与重绑机制补强,并增加回归测试。
UX 要求
验收标准
相关代码
frontend/src/components/MarkdownExperienceBridge.tsxfrontend/src/components/MarkdownEditorImpl.tsxfrontend/src/lib/markdownLivePreview.tsxfrontend/src/components/__tests__/MarkdownEditor.mobilePreview.test.tsfrontend/src/lib/__tests__/markdownLivePreview.test.tsx关联:#198
优先级:P0/P1(现有功能回归)