Repository navigation
proposal: 收敛 cherry-markdown 编辑器定位并按职责拆分能力包 #1862
Copy link
Copy link
Description
最终结论
Cherry Markdown 的能力应按“用户场景和职责”拆分,而不是按当前源码目录或构建产物名称直接拆包。
核心定位:
cherry-markdown负责编辑器;Engine 负责解析;Preview 负责纯展示;Stream 负责流式渲染;Milkdown 作为第一阶段的独立所见即所得实验;最终架构中不保留 Core 概念、Core 包或 Core 构建入口。
目标包规划
| 包 | 用途 | 边界 |
|---|---|---|
cherry-markdown |
编辑器、编辑区、编辑区 + 预览区、工具栏、快捷键 | 可以依赖 CodeMirror、Engine、Preview;继续作为默认编辑器入口 |
@cherry-markdown/engine |
Markdown 解析、HTML 生成、Hook、自定义语法、Node.js 渲染 | 不依赖 CodeMirror、工具栏和 UI |
@cherry-markdown/preview |
纯 Markdown 预览、预览 DOM、预览交互和样式 | 依赖 Engine,不依赖编辑器 |
@cherry-markdown/stream |
AI Token 流式 Markdown 渲染、未闭合语法处理、增量刷新 | 依赖 Engine 和 Preview,不依赖 CodeMirror |
@cherry-markdown/milkdown |
基于 Milkdown 的所见即所得实验 | 第一阶段独立验证,不进入 cherry-markdown 默认依赖 |
第一阶段不创建 @cherry-markdown/editor,因为 cherry-markdown 本身就是编辑器包。
正确依赖关系
以下箭头表示“依赖”:
cherry-markdown ──→ @cherry-markdown/preview ──→ @cherry-markdown/engine
│
└──────────────→ @cherry-markdown/engine
@cherry-markdown/stream ──→ @cherry-markdown/preview ──→ @cherry-markdown/engine
@cherry-markdown/milkdown ──→ Milkdown
└──→ @cherry-markdown/engine
@cherry-markdown/milkdown 只代表第一阶段的具体实现。暂不创建抽象的 @cherry-markdown/wysiwyg,避免过早承诺通用 WYSIWYG API。
数据和运行时边界
Markdown 仍然是唯一的持久化数据格式:
Markdown
↔ Milkdown 文档模型 / CodeMirror
→ @cherry-markdown/engine
→ HTML
→ @cherry-markdown/preview
- Milkdown 负责编辑交互,不改变 Cherry 的 Markdown 语义;
- Engine 是最终 Markdown 解析和 HTML 输出标准;
- 所见即所得通过 EditorAdapter 隔离,未来可以替换 Milkdown;
- 无法编辑的 Cherry 专有语法必须明确保留、降级或暂不支持,不能静默丢失。
Core 的最终处理
Core 不作为未来架构的一部分:
- 不新增
@cherry-markdown/core; - 不保留
cherry-markdown.core.*作为 1.x 的兼容构建入口; - 不以
src/core作为 Engine 的长期架构概念; - 原有 Hook、SyntaxBase、HookCenter、Markdown Hooks 等逻辑迁移到 Engine 的明确模块中;
MenuHookBase、工具栏和编辑器交互归入cherry-markdown。
允许在 0.x 迁移期间临时保留旧 Core 入口用于迁移和验证,但必须在 1.0.0 前删除。1.x 不再新增 Core 兼容层,也不再围绕 Core 维护额外产物。
所见即所得
第一阶段建立 @cherry-markdown/milkdown,但不立即替换 CodeMirror,也不进入根包默认依赖。
第一阶段重点验证:
- Markdown round-trip;
- 中文 IME;
- Selection、撤销重做和粘贴;
- 表格、列表、代码块和图片;
- Cherry 专有语法的保留或明确降级;
- 与 Engine 输出结果的一致性;
- 包体积、性能和可替换性。
规则冻结
@cherry-markdown/engine-compat 不属于第一阶段必需包。
@cherry-markdown/engine 在 1.x 进入稳定规则线:不进行破坏性解析、API 和输出结构调整,只接受向后兼容的功能、修复和必要的安全更新。
如果未来仍有“永远固定输出”的强需求,再基于稳定版本独立发布 engine-compat。它不能跟随最新 Engine 自动升级。
不兼容策略和 1.x 稳定性
0.x阶段完成分包、入口调整和 Core 删除;1.0.0发布最终包边界和公开 API;1.x不再进行大的架构调整;1.x只接受向后兼容的 API、解析规则、输出和依赖变化;- 如果未来必须破坏 Engine 语义或公开 API,进入
2.0.0; - 旧
0.x用户通过迁移说明升级,不承诺永久兼容旧 Core 入口。
发版和治理
- 各包独立版本、独立发布;
- 使用 Changesets 管理包间依赖;
- Engine 规则变化必须有 fixture / snapshot;
- 发布包必须进行真实独立安装和产物依赖检查;
- CI 检查各包不携带不应包含的依赖;
- Mermaid、ECharts、PlantUML 等大型能力后续按插件拆分。
推荐顺序
- 在
0.x阶段明确包边界并完成 Core 迁移; - 抽出
@cherry-markdown/engine; - 抽出
@cherry-markdown/preview和@cherry-markdown/stream; - 同期建立
@cherry-markdown/milkdown,完成所见即所得验证; - 删除 Core 入口和 Core 架构概念;
- 发布
1.0.0,冻结主要包边界和公开 API; - 根据实际需求决定是否发布
engine-compat和独立插件包。
需要作者确认
- 是否认可
cherry-markdown收敛为编辑器包? - 是否认可在
0.x完成 Core 删除,并让1.x进入稳定架构? - 是否认可 Engine、Preview、Stream 独立演进?
- 是否同意第一阶段引入独立的
@cherry-markdown/milkdown? - 是否接受未来破坏性 Engine 变化进入新的 major 版本?
Reactions are currently unavailable
Activity