昨天把 DocFlow 重构成了 Monorepo 架构,主要是为了解决协同编辑中的 Schema 同步问题。
项目使用 Tiptap 做协同编辑,自定义节点较多,而 Yjs 传递的是二进制数据。像警告框 Alert 这类自定义节点,在前端是具体的 UI 组件,但在 Hocuspocus 后端必须有对应的 Transformer 逻辑,才能将二进制数据准确还原成 JSON 或 HTML。
没有 Monorepo 时,每加一个新功能(如 alert.ts),都要在前端和后端分别维护一套 Schema。一旦漏掉同步,后端解析时就不认识这个节点,辛辛苦苦存的数据可能直接丢失。
采用 Monorepo 后,架构清晰多了:
- 原子化解耦:每个自定义节点如
@syncflow/alert都是独立包,职责单一, - 逻辑共享:
transformer包统一组装这些节点,导出一个全能的解析器 - 多端复用:前端编辑器用它来渲染,后端 Hocuspocus 用它做数据转换
最终实现一套 Schema 定义,全链路通用,改一下 alert.ts 的规则,全端自动生效,维护效率大幅提升。