文档离线编辑实现
556 字
3 分钟
文档离线编辑实现
服务端:word 多人协作 socket 服务流程图
html 使用接口判断权限相关,以跳转页面 socket 数据读取、保存、缓存 接口:由 socket 调用以保存数据并生成历史记录

前端
word 使用 tipap 框架(一个基于 ProseMirror 的在线编辑器框架) 多人协作使用 yjs
- 访问 api/doc/info 接口以校验权限
- 权限校验完成后,创建 tiptap 实例
- 本地创建 YDoc
- 生成 title 和 prosemirror 子节点(title 不属于 tiptap,所以需要单独处理,prosemirror 用于存放 tiptap 内容)
- 绑定 prosemirror 与 tiptap 变更同步
- 创建 socket 连接(携带 token 及 uid)
- 监听 ydoc 变更及光标位置
- socket 服务
- 校验 token
- 校验服务器文档状态: 正在恢复历史断开连接
- 校验客户断文档版本号:重连才会携带,不一致通知、客户断刷新页面
- 下发服务器文档版本号
- 下发服务器文档内容
- 记录版本号,掉线重连时携带(掉线后版本号有变化刷新页面,版本号 = 恢复的历史 ID || 文档 ID)
- 使用服务器下发内容渲染文档内容
- tiptap 实例 initSuccess编辑按钮可点击、或自动进入编辑态
- 编辑内容或标题 ydoc 发现变更并发送
- 服务端:收到 ydoc 变更下发给其它端
- 客户端:收到服务器变更,yjs 合并内容
- 掉线,打开断网遮罩
- 携带 服务器文档版本号 重连
- 恢复同步后
实现
基于 y-indexeddb 将文档内容存入本地 indexeddb
- 首次渲染
- 从服务器下载内容,存入本地
- 每次变更,向服务器同步、存本地同时触发
- 后续渲染
- 先从本地获取数据渲染页面
- 与服务器同步差异
- 离线
- 变更存入本地
- 重连后与服务器进行全量对比,同步差异
- 恢复历史记录
- 恢复进行中,所有客户端会被踢下线,恢复完成后才能连的上
- 每次连接会判断客户端 doc version 与服务器是否一致,不一致以 4301 连接失败,客户端收到 4301 删除本地 indexeddb,重新连接
相关文章 智能推荐
1
再遇协同编辑:Yjs + Quill,文档协同编辑竟如此简单 🎸
编辑器 Quill 协同编辑
2
文档内脑图, WORD 脑图扩展
编辑器 tiptap-tutorial10
3
初识协同编辑:OT和CRDT算法,文档协作的“魔法石”
编辑器 思考一下,如果想要实现一个富文本编辑器的的协同编辑,你能想到哪几种方案呢 🐶? 呼之欲出的方案 直接覆盖 这个是最最简单粗暴的办法......
4
使用yjs实现脑图的协同编辑
编辑器 2024-02-22
5
富文本编辑器Tiptap系列教程——5分钟认识Tiptap
编辑器 Tiptap 可以很轻松的接入各种框架,几分钟就可以创建好富文本编辑器。与各种比较成熟的富文本框架对比,Tiptap 的可定制化程度极高,我们可以自己去制富文本的每个方面,并且拥有丰富的扩展
随机文章 随机推荐