RuiToolAI 的 CMS 不只要编辑文字,还要插入图片、代码块和自定义内容。我选 Tiptap,主要是因为它可以在 ProseMirror 之上继续扩展节点和行为。
为什么选 Tiptap
Tiptap 是基于 ProseMirror 的 React 富文本编辑器,相比其他方案:
- 无头设计:自带样式最小化,完全自定义 UI
- 扩展系统:每个功能都是独立的扩展,按需组合
- 类型安全:TypeScript 一等公民
- JSON 输出:内容存储为 JSON,不是 HTML,便于程序化处理
架构设计
RuiToolAI 的 Tiptap 编辑器分为四层:
| |
自定义节点:Alert Block
Alert Block 是一个带图标和颜色的提示块,支持 info、warning、error、success 四种类型:
| |
渲染组件:
| |
图片上传节点
图片上传节点集成了 CMS 媒体库选择器:
| |
Markdown 粘贴支持
用户从 Notion、Obsidian 等工具粘贴 Markdown 内容时,自动转换为 Tiptap 的 JSON 格式:
| |
工具栏组件化
每个工具栏按钮都是独立的组件,有自己的状态和逻辑:
| |
每个按钮都有对应的 Hook:
| |
总结
- 四层架构:UI → Node → Extension → Template
- 自定义节点(Alert Block)实现富文本业务组件
- 图片上传节点集成 CMS 媒体库
- Markdown 粘贴扩展让内容迁移更顺畅
- 工具栏按钮组件化,每个按钮独立可复用
