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 库的差异
下表汇总了 Loro 的特性,其中有些在其他 CRDT 库中并不存在。
| 特性 / 重要设计决策 | Loro | Diamond-types | Yjs | Automerge |
|---|---|---|---|---|
| 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,可将交错异常的概率降到最低。
