CRDTs in Practice: Guide to building a CRDT Block Editor Engine from Scratch - CRDTを実践する:ブロックエディタ用CRDTエンジンをゼロから作るガイド

NotionやGoogle Docs級の共同編集を自前で作る:CRDTで競合を“コードで解決”する実践ガイド

要約

Notion風のブロックエディタを対象に、実装に必要なCRDT(RGAベース)の設計と実装上の注意点を実務寄りに解説する。キーは「一意ID」「afterポインタ」「トゥームストーン」「決定論的ソート」「遅延到着対策」の組合せ。

この記事を読むべき理由

分散・オフライン対応の共同編集は日本のSaaS/社内ツールでも需要が高い。既存ライブラリ任せでなく、自分で動作原理を押さえれば、軽量で堅牢な独自エディタや同期層を設計できる。

詳細解説

TypeScriptでの要素イメージ(簡略版):

export class RGAElement<T = string> {
  public children: RGAElement<T>[] = [];
  constructor(
    public id: [number, number] | "HEAD",
    public value: T | null,
    public after: [number, number] | "HEAD",
    public deleted: boolean = false
  ) {}
  insertChild(child: RGAElement<T>) {
    this.children.push(child);
    this.children.sort((a, b) => compareIds(a.id, b.id));
  }
}

実践ポイント

以上を押さえれば、CRDTの理論を実際のブロックエディタ実装に落とし込む土台ができます。