Files
new-markdown/docs/01-tech-selection.md

56 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阶段 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. 已知限制与对策(选型时即登记,不等踩坑)
1. **首轮序列化规范化**:打开一份非规范写法的 md 并保存,个别写法会被规范化(实测:表格对齐 `| :--- |` → `| :- |`、脚注/HTML 等不受影响、无序列表符号已通过 `remarkStringifyOptionsCtx: { bullet: '-' }` 对齐 Typora 习惯)。内容与语义零丢失,第二轮起逐字稳定(自动化测试硬断言)。阶段 2 评估是否引入「未修改段落不重序列化」的原文保真策略。
2. **数学/Mermaid/代码高亮不在阶段 0 范围**:实测其原始文本(`$E = mc^2$`、mermaid 代码块)在往返中完整保留,不会丢内容;渲染与编辑插件按需求排在阶段 3(KaTeX/Mermaid/Shiki 均为 MIT,已核查)。
3. **脚注**:不在 Milkdown 官方预设宣传清单内,但阶段 0 实测探针显示 remark-gfm 管线可完整往返脚注(定义与引用均保留),阶段 3 复测后转正。
4. **大文档性能**:158KB 文档在 jsdom(无布局引擎、显著慢于真实 WebView2)下全量加载约 3.6s、序列化约 0.27s——仅作悲观下界参考,不作为产品指标。编辑期走 ProseMirror 增量事务,不整篇重渲染(架构性质)。真实指标按需求 §20 在阶段 6 用 WebView2 实测 100KB/1MB/5MB 并记录。
5. **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 与即时渲染共用同一文档入口、切换不丢内容。