文档Loro 简介

Loro 简介

众所周知,数据同步或构建实时协作应用是一项挑战,尤其是在设备可能离线或处于点对点网络时。Loro 可以让这一过程变得简单。

我们希望提供更好的开发工具,帮助大家轻松愉快地打造本地优先应用

Loro 使用 CRDT(Conflict-free Replicated Data Types) 解决并行编辑问题。借助 Loro 的数据类型,你的应用既能支持协作,又能以低开销保存完整的编辑历史。

当你用 Loro 建模应用状态后,同步就变得轻而易举:

import {  } from "loro-crdt";
const  = new ();
const  = new ();
.("text").(0, "Hello world!");
.("text").(0, "Hi!");
// 假设 docA 和 docB 位于两台不同的设备
const  = .({ : "update" });
// 通过任意方式将字节发送给 docB
.();
// docB 现在已同步 docA 的所有更改
 
const  = .({ : "update" });
// 通过任意方式将字节发送给 docA
.();
// docA 和 docB 此时状态一致

保存应用状态同样简单:

const  = new ();
.("text").(0, "Hello world!");
const  = .({ : "snapshot" });
// 可以将这些字节保存到本地存储、数据库或通过网络发送

加载应用状态:

const  = new ();
.();

Loro 还方便你回放历史,为应用添加版本控制。深入了解时光旅行功能

.(); // 将文档检出到指定版本

Loro 与 JSON schema 兼容。如果你的应用状态可以用 JSON 建模,大概率就能用 Loro 来同步。由于需要遵循 JSON schema,Map 中的键不能是数字,同时应避免出现循环引用。

.(); // 获取文档的 JSON 表示

Loro 是否适合你?

✅ 以下场景适合使用 Loro:

  • 文档实时协作
  • 并发编辑的自动冲突解决
  • 离线编辑并在稍后同步
  • 完整编辑历史与时光穿梭
  • 点对点同步能力

⚠️ 以下情况可考虑其他方案:

  • 应用需要强一致性
  • 数据不是 JSON 结构(例如大型二进制 / 流媒体)
  • 简单的客户端-服务器同步即可满足需求(如基础 WebSocket)
  • 对包体积非常敏感(Loro WASM 压缩后约 970KB)

了解更多「何时不应使用 CRDT」→

与其他 CRDT 库的差异

下表汇总了 Loro 的特性,其中有些在其他 CRDT 库中并不存在。

特性 / 重要设计决策LoroDiamond-typesYjsAutomerge
Event Graph Walker✅ Inventor
Rich Text CRDT
Movable Tree❌ Inventor
Movable List❌ Inventor
Time Travel✅[1]
Fugue / Maximal non-interleaving
JSON Types
通过游程编码在内存中合并元素✅ Inventor
拜占庭容错
版本控制
  • [1] 与其他库不同,Yjs 需要用户存储版本向量和删除集合,才能回到特定时间点。
  • Fugue 是一种文本 / 列表 CRDT,可将交错异常的概率降到最低。