乐于分享
好东西不私藏

死磕Word修订模式+版本历史功能,我们终于实现了Web版高精“”

死磕Word修订模式+版本历史功能,我们终于实现了Web版高精“”

趣谈AI精选:《最系统的AI开发学习精品手册》

徐小夕

一年前就有很多用户反馈,我们的 JitWord 协同AI文档是否能支持类似于 Word 中的修订和审阅功能,当时由于精力有限,就暂时搁置了。
最近花了2个月时间做技术调研和方案验证,我们终于实现了 Word 级别的修订模式和审阅功能同时支持将Word中的修订和批注记录,导入到 JitWord 协同文档中,实现Word和JitWord文档的双向转换

话不多说,先上链接:

sdk使用:  https://github.com/jitOffice/jitword-sdk
体验地址:https://jitword.com
接下来我就和大家详细分享一下我们实现成果和技术方案。
实现成果
1. Word 修订审阅模式
我们可以在 JitWord 协同文档编辑器的【审阅】tab中开启修订模式,开启后,我们对文档的所有操作都会被标记下来,只要我们不【接受】或者【拒绝】修订,不管我们把文档分享给谁,编辑修订记录都会保留,让大家对文档的操作痕迹一目了然。
同时,我们也能把 Word 文档中【修订记录】和【批注】一键导入到 JitWord中,在 JitWord中继续编辑修改,并导出到 Word,导出之后还能保留线上的编辑痕迹。
这个 Word 文档和 JitWord 协同文档的双向数据打通,是我们修订模式的核心,它可以将 Word 本地合同已经导入到 JitWord,实现文档的云端化存储和协同编辑,并轻松让我们的Word文档拥有业务级别的权限控制。
2. Word 版本对比和编辑记录功能
上面是版本管理中不同版本的对比情况,通过我们实现的 Diff 算法来实现文档修改的差异化高亮,让大家轻松对比文档的修改内容。
另一方面,我们还做了编辑记录功能,可以记录不同用户对文档的修改痕迹,方便管理人员审阅/审批:
下面和大家详细分享一下我们这几个功能的技术实现。

技术架构设计:JitWord 如何实现”毫秒级”版本对比?

编辑记录和版本对比高亮,听起来简单,实现起来却涉及协同编辑算法数据结构渲染引擎等多个技术难点。

下面我从架构层面拆解 JitWord 的实现方案。

先聊聊协同方案

协同编辑的两大主流方案——OT 和 CRDT——已经争论了十几年。在决定 JitWord 的底层架构时,我们做了全面的技术评估,这里分享给大家参考:

评估维度
OT(操作转换)
CRDT(无冲突复制数据类型)
JitWord 的选择理由
一致性保证
强一致性(需服务器中心化仲裁)
最终一致性(数学保证无冲突)
CRDT 的数学基础更可靠
离线支持
弱(离线操作需缓存,重连后复杂合并)
强(本地直接应用,无需等待服务器)
企业用户经常断网/弱网办公
编辑记录追溯
需额外构建操作日志系统
天然存在(每个 Item 自带全局唯一 ID)
实现编辑记录功能更简单、更完整
版本对比 Diff
需回放操作序列重建状态
直接对比两个状态的 Item 集合
Diff 计算更直接、更准确
私有化部署
依赖中心化服务端协调
可完全去中心化,服务端仅做存储转发
满足企业私有化部署需求
工程复杂度
转换函数复杂,边界情况多
数据结构固定,逻辑清晰
长期维护成本更低

最后我们得出的结论: 对于”编辑记录”和”版本对比”这两个需求,CRDT 的 Tombstone 机制 和 全局唯一 Item ID 是天然的最佳拍档。

编辑记录的实现方案

传统 OT 方案要实现编辑记录,需要额外维护一个操作日志:

而 JitWord 的 CRDT 方案中,编辑记录的数据结构和我们的文档数据结构天然适配,实现流程如下

这种设计让”编辑记录”不是用户操作后计算出来的,而是协同编辑过程中的自然产物,性能开销极低。

版本管理实现方案:不只是线性历史

传统的”历史版本”是线性的:v1 → v2 → v3 → v4

但真实的协同场景是分支化的

  • 用户 A 在 v3 基础上编辑,生成 v4

  • 用户 B 也在 v3 基础上编辑,生成 v4′

  • 两个版本需要合并

JitWord 采用 Version Tree(版本树) 结构管理文档历史,类似如下:

每个版本节点包含:

  • snapshot:该版本的完整文档快照(用于快速恢复)

  • parentId:父版本 ID

  • operations:从父版本到当前版本的增量操作序列

  • metadata:作者、时间、编辑摘要等

存储优化策略

为了控制存储成本,我们采用了混合存储策略

  • 每 N 个版本保存一个完整快照(默认每 10 个版本)

  • 中间版本只保存增量 Operation 序列

  • 需要恢复某个版本时,找到最近的快照 + 回放后续 Operation

Diff 引擎:毫秒级差异计算

版本对比的核心是 Diff 算法——计算两个文档版本之间的差异。

我们 JitWord 的 Diff 引擎采用 Myers’ Diff Algorithm 的优化版本,针对富文本场景做了深度定制:

标准 Myers 算法的问题:

  • 基于行/字符级别的 LCS(最长公共子序列)

  • 对富文本(带格式、图片、表格)支持差

  • 时间复杂度 O(ND),大文档性能差

我们的优化方案如下:

优化点
具体实现
效果
结构化 Diff
将文档解析为 Block 树(段落、表格、列表等),先在 Block 级别对比,再在 Block 内部做字符级 Diff
大文档 Diff 时间从 2s 降到 100ms
格式感知
Diff 结果不仅包含文本变化,还包含格式变化(加粗、颜色、字体等)
高亮渲染更精准
语义合并
相邻的同类操作(如连续删除)合并为一个 Diff Chunk
减少渲染节点,提升性能

高亮渲染引擎:让差异”一眼可见”

Diff 计算完成后,需要在编辑器中以高亮形式呈现差异,方便用户一目了然地看到修改差异点。

我们在设计 JitWord 协同AI文档时, 考虑了 Canvas + DOM 混合渲染的方案:

性能优化:大文档也能流畅对比

我们在真实场景下做了性能测试,数据如下:

测试场景
文档大小
版本差异
Diff 计算时间
渲染时间
总耗时
普通合同
5KB
3 处修改
12ms
8ms
20ms
产品 PRD
50KB
25 处修改
45ms
30ms
75ms
学术论文
200KB
80 处修改
120ms
85ms
205ms
技术白皮书
1MB
200+ 处修改
380ms
220ms
600ms

注:所有测试在 Chrome 浏览器、普通笔记本(i5-1240P)环境下进行。1MB 大文档的对比总耗时控制在 1 秒内,完全满足日常使用需求。

未来规划

下一个版本,我们将上线 JitWord 3.0 版本,从UI层和功能上,全面对标 Word 文档,让企业轻松拥有一套可扩展,高性能的web版协同文档解决方案。

sdk使用:  https://github.com/jitOffice/jitword-sdk
体验地址:https://jitword.com
往期精彩:
最系统的 AI 应用开发精品学习手册

JitKnow V2.0.0:从可视化知识库到企业级AI中台,开放API+数据分析重构知识管理边界

从一行代码到百万表格:花两年做的pxcharts,把表格做成”AI+低代码数据库”

JitWord,一款AI驱动的协同Word文档编辑器