5.7 KiB
5.7 KiB
阶段 0 · 技术选型报告
项目:new-markdown(Windows Markdown 所见即所得编辑器) 日期:2026-11-13 · 状态:阶段 0 已实测,待大王拍板后进入阶段 1
1. 结论先行
| 层 | 选型 | 版本(已核查) | 许可证 |
|---|---|---|---|
| 桌面框架 | Tauri 2 | @tauri-apps/api 2.12.4 | Apache-2.0 OR MIT |
| 前端 | React 18 + TypeScript 5 + Vite 5 | 与原型一致 | MIT |
| UI | Tailwind CSS + 自定义组件(阶段 1 接入) | — | MIT |
| 编辑器内核 | Milkdown 7(基于 ProseMirror) | @milkdown/kit 7.23.0 | MIT |
| Markdown 解析 | unified / remark(remark-gfm)(Milkdown 内置管线) | remark-gfm 4.0.1 / unified 11.0.5 | MIT |
| 数学公式 | KaTeX(阶段 3 接入) | 0.19.1 | MIT |
| 图表 | Mermaid(阶段 3 接入) | 12.3.0 | MIT |
| 代码高亮 | Shiki(阶段 3 接入;编辑态高亮走 ProseMirror 装饰) | 4.6.0 | MIT |
| 本地数据库 | SQLite(rusqlite,随 Tauri 后端,阶段 4 接入) | — | MIT/公有领域 |
| 自动更新 | Tauri Updater(阶段 7) | — | Apache-2.0 OR MIT |
全部依赖为 MIT / Apache-2.0,无 GPL 类传染性许可证,无商业授权风险。
2. 编辑器内核对比(本项目成败点,重点核查)
候选均围绕 ProseMirror 生态或源码编辑生态逐项核查:
| 维度 | Milkdown 7 ✅ 选用 | 裸 ProseMirror 自研 | Tiptap 3 | CodeMirror 6 |
|---|---|---|---|---|
| 底层模型 | ProseMirror 文档模型(事务/选区/历史完整) | 同左,但一切自己造 | ProseMirror | 自有文本模型 |
| Markdown 双向转换 | 原生:remark 解析 → PM 文档;serializerCtx 序列化回 md,阶段 0 实测保真(见 03 号报告) | 需自研 parser/serializer 全套,工作量与风险最高 | 官方 Markdown 支持仍属扩展层,往返保真弱于 Milkdown(标题/表格/任务列表需逐项补) | 无文档模型,等于源码模式,做不到 Typora 式即时渲染 |
| GFM(表格/任务列表/删除线/脚注) | preset-gfm 开箱,实测全保真 | 自研 | 扩展拼装 | 仅高亮 |
Typora 式输入规则(# →标题、- [ ]→任务) |
commonmark/gfm 预设内置 input rules | 自研 | 部分扩展 | 无 |
| IME 组合输入 | 继承 ProseMirror View 的 composition 处理,上层未覆盖(代码核查;真实输入法须 Windows 人工验) | 同左 | 同左 | 另一套机制 |
| 撤销/重做 | plugin-history,实测通过 | 自接 history 插件 | 内置 | 内置 |
| 表格编辑 | gfm 表格节点 + prosemirror-tables 体系,可扩展浮动工具栏 | 自研 | 扩展 | 无 |
| 维护与体积 | 活跃维护(7.23.0,2026 年在更);原型 gzip 194KB(未分包) | — | 活跃;部分高级扩展商业化 | 活跃 |
| 风险 | 序列化首轮会规范化个别写法(见 §3);大文档全量加载性能须阶段 6 实测 | 周期不可控,直接违反「先验证再开发」的风险控制目标 | 为达同等 md 保真需自补大量转换逻辑,等于半自研 | 不满足产品定位,排除 |
决策:Milkdown 7.23.0(@milkdown/kit 单包入口)。理由:它是唯一「Markdown 双向转换即产品级能力」的现成内核,且阶段 0 已用与产品同一条代码路径实测通过核心验收项;裸 ProseMirror 自研只在 Milkdown 出现不可绕过的缺陷时作为后备(文档模型同源,迁移成本可控)。
不采用 Milkdown Crepe(官方开箱组件版):其预置 UI/主题与本产品自定义界面、主题系统冲突,阶段 1 起直接用 Kit 组装自己的编辑器装配层。
3. 已知限制与对策(选型时即登记,不等踩坑)
- 首轮序列化规范化:打开一份非规范写法的 md 并保存,个别写法会被规范化(实测:表格对齐
| :--- |→| :- |、脚注/HTML 等不受影响、无序列表符号已通过remarkStringifyOptionsCtx: { bullet: '-' }对齐 Typora 习惯)。内容与语义零丢失,第二轮起逐字稳定(自动化测试硬断言)。阶段 2 评估是否引入「未修改段落不重序列化」的原文保真策略。 - 数学/Mermaid/代码高亮不在阶段 0 范围:实测其原始文本(
$E = mc^2$、mermaid 代码块)在往返中完整保留,不会丢内容;渲染与编辑插件按需求排在阶段 3(KaTeX/Mermaid/Shiki 均为 MIT,已核查)。 - 脚注:不在 Milkdown 官方预设宣传清单内,但阶段 0 实测探针显示 remark-gfm 管线可完整往返脚注(定义与引用均保留),阶段 3 复测后转正。
- 大文档性能:158KB 文档在 jsdom(无布局引擎、显著慢于真实 WebView2)下全量加载约 3.6s、序列化约 0.27s——仅作悲观下界参考,不作为产品指标。编辑期走 ProseMirror 增量事务,不整篇重渲染(架构性质)。真实指标按需求 §20 在阶段 6 用 WebView2 实测 100KB/1MB/5MB 并记录。
- Tauri 本机验证缺口:本开发沙箱(Linux)无 Rust 工具链,Tauri 壳层无法在此编译验证;阶段 1 在 Windows 上完成首次 Tauri 构建并作为阶段 1 验收前置(需 Rust stable + VS Build Tools + WebView2,均为 Windows 常规组件)。
4. 桌面与系统层选型说明
- Tauri 2 而非 Electron:安装体量与内存占用显著更小,WebView2 为 Windows 10/11 系统组件;文件/对话框/更新均走官方插件与 Rust 侧命令,符合需求 §2 表格原定方案,无变更。
- SQLite 只存应用数据(设置/最近文件/工作区/恢复记录),正文永远以 .md 文件为唯一事实源(需求 §18),阶段 4 落地。
- 源码模式:CodeMirror 6(MIT,已核查)承担,阶段 2 与即时渲染共用同一文档入口、切换不丢内容。