Skip to content

fix(markdown): Live 实时预览按钮点击无反应,修复模式切换回归 #773

Description

@cropflre

用户反馈

用户反馈:

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 查询的附加行为。

用户点击:

源码 | Live | 预览 | 分屏
       ↑

应立即看到实时预览效果,并且当前模式状态清晰可见。

建议实现

P0:先修复当前点击无反应

重点排查:

  1. findMarkdownModeGroup() 是否能找到当前桌面 / 移动 toolbar;
  2. getEditorView() 是否在点击时能拿到正确 CodeMirror instance;
  3. bindModeButtons() 是否因为 DOM 重建导致绑定落到旧 button;
  4. sourceButton.click() 后 React 重渲染是否替换了 DOM,使后续 setLivePreview() 作用在旧 state / view;
  5. MutationObserver reconcile 是否出现重复绑定或状态覆盖;
  6. 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 之间反复切换不丢内容、不丢光标、不导致编辑器失焦异常。

验收标准

  • 桌面端点击 Live 可以稳定进入实时预览;
  • Windows / macOS Electron 正常;
  • Web 正常;
  • Android / iOS toolbar 中 Live 正常;
  • Live 按钮 active 状态与实际模式一致;
  • source → live → preview → split → live 多次切换均正常;
  • 切换笔记后模式恢复正确;
  • 页面 resize / toolbar 响应式切换后 Live 仍可点击;
  • 不出现重复按钮 / 重复事件绑定;
  • 超大 Markdown 文档若不启用 live decoration,应给出明确反馈而不是静默无响应;
  • 不破坏 [Feature] Markdown 编辑体验增强:分屏同步滚动、任务列表交互、代码块增强与实时预览 #198 已完成的分屏滚动、任务列表、代码块预览能力;
  • 增加真实点击 Live 按钮并验证 CodeMirror extension 生效的回归测试,而不是只检查源码字符串存在。

相关代码

  • 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(现有功能回归)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions