
2026/03/13 10:38
**タイトル** *協働編集について教えられた嘘 – パート 2:なぜ私たちは Yjs を使わないのか* --- - **背景** - 多くのチームは、リアルタイム共同作業が可能なのは Yjs や ShareDB のような専門ライブラリだけだと主張します。 - 実際には、多くのプロジェクトでは CRDT、OT、あるいはカスタム同期機構など、よりシンプルなソリューションを採用し、特定の要件に合わせています。 - **Yjs が見落とされやすい理由** 1. **セットアップの複雑さ** - WebSocket サーバーまたは互換性のあるトランスポート層が必要です。 - 永続化設定や衝突解決の構成は非自明で、手間がかかります。 2. **パフォーマンスへの懸念** - 大規模ドキュメントでは帯域幅オーバーヘッドが急速に増大します。 - 高頻度更新を低レイテンシ環境で処理するクライアントは苦戦しやすいです。 3. **特定ユースケースへの機能制限** - Yjs はテキストと JSON に優れていますが、リッチメディアやバイナリブロブのサポートは標準装備では少ないです。 - カスタム拡張が必要になり、保守負担が増します。 4. **ツールエコシステム** - Quill や ProseMirror など人気エディタとの統合は充実していますが、多くのチームは独自 UI を採用しており、Yjs の組み込みが強引に感じられることがあります。 5. **運用オーバーヘッド** - プレゼンス・アウェアネス層を監視し、サーバーの拡張戦略を別途設計する必要があります。 - **検討すべき代替案** - JSON 向けに特化した CRDT ライブラリ(例:Automerge)。 - 軽量アダプタ付き OT フレームワーク。 - Firebase や Socket.io のような既存リアルタイムプラットフォーム上で構築されたカスタム同期プロトコル。 - **結論** - Yjs は強力ですが、万能解ではありません。 - 適切なツールは、ドキュメントサイズ・更新頻度・データ型・運用制約に応じて選定する必要があります。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は、Yjs や同様の CRDT ライブラリがライブコラボレーティブエディタには不適切であると主張しています。なぜなら、それらは各キー入力時にドキュメント全体を再生成せざるを得ず、パフォーマンス低下、プラグインの失敗、不安定なノード ID、および奇妙な Undo/Selection 動作を引き起こすからです。これらの問題は、Yjs がバージョンベースのリベース機能を欠いていること、DOM の重い再構築、複雑な調整ロジックが原因であり、60 fps を達成するのが難しいという点に起因します。さらに、Yjs はスキーマ不一致(静かなるデータ損失)や煩雑な権限管理(XML 更新を予測する必要)が苦手で、可用性を過大評価している(多くの機能がメディア、権限、耐久性に外部サービスに依存している)、テムストーンのガーベジコレクションが大量のメモリを消費し、収束によって一時的な発散が隠蔽されるためデバッグが難しいという課題があります。
対照的に、著者は ProseMirror をベースとした最小限の解決策(約 40 行)を提案しています。この方法では
prosemirror-collab を使用して楽観的更新、オフライン編集、細粒度プロヴァナンス、および真のマスターレストポロジーなしでの P2P コーディネーションを実現します。こうすることで Yjs の落とし穴を回避し、より良いパフォーマンス、簡単なデバッグ、そして予測可能なエディタ挙動を提供します。
開発者がこの ProseMirror 手法を採用すれば、コラボレーティブツールは脆弱性が減少し、保守コストも低く抑えられます。そうでない場合、Yjs はスケーラビリティと開発者の摩擦に直面し続け、ライブコラボレーティブエディタの広範な採用を妨げる可能性があります
本文
第 2部 – なぜ Yjs(および同様の CRDT)が現在ライブコラボレーションテキストエディタには不向きなのか
第 1部では、特に Yjs など最も人気のある共同編集ライブラリが、直接的な編集競合を解決する際に文書を黙って破損してしまうと論じました。これはオフライン利用に不適切であり、ユーザーはそのような競合を回避できないためです。
本部では、この同じ問題がライブコラボレーション編集にも不向きであることを示します。
1. Yjs を用いて実運用エディタを構築した際に直面した課題
| 課題 | 発生の仕方 |
|---|---|
| キー入力ごとに「削除+再作成」 | 各共同変更が文書全体を削除し、再構築するため DOM の大規模な差分(NodeViews、デコレーション、位置マッピング)が発生します。Undo やカーソル位置、選択処理も不安定になります。 |
| レイテンシとパフォーマンス | 60 fps を目標にするとフレームあたり <16 ms 必要です。Yjs の「全置換」戦略はキー入力ごとに完全再調整を強いるため、予算内に収めるのが難しくなります。一方 ProseMirror のトランザクションモデル(リベース、インクリメンタル DOM 更新)は遥かに効率的です。 |
| CRDT パイプラインの複雑さ | ProseMirror のトランザクションと Yjs XML アップデート間で変換するオーバーヘッドが増えます。ターミネーション(tombstone)のガベージコレクションはメモリを消費し、データ損失のリスクもあります。 |
| スキーマ強制 | 中央権威がないため、スキーマ不一致が黙って伝播し、新しいスキーマにアップグレードしたり受信した際にデータ破損につながります。 |
| アクセス許可の扱い | CRDT では更新を適用する前にその最終的な効果を予測する必要があります。これはトランザクションを直接検査する方がはるかに簡便です。 |
| 可用性とネットワークプロトコル | Yjs は「サーバー停止時でも利用可能」とよく宣伝されますが、実際にはほとんどのエディタがメディアストレージや権限チェック、耐久性など外部サービスに依存しています。CRDT は単なるネットワーク層として機能し、不要な複雑さを増します。 |
2. 「シンプル」な代替 – ProseMirror‑collab
- 単一権威 – 文書インスタンスが真理の源です。
- トランザクションワークフロー – クライアントはステップと
を送信します。lastSeenVersion- バージョン不一致の場合、クライアントは最近の変更を取得しローカルでリベースして再送信します。
- この追加往復は典型的な負荷では無視できる程度です。サーバー側に同じロジックを置く「コミットヘルパー」も可能です。
- P2P 対応だがマスターレスではない – 任意の機械が権威として機能できます。ターミネーションの複雑な GC は不要です。
- 実装コスト – 約 40 行コード(React スキャフォールディング込みで約 291 行)。
このアプローチは楽観的更新、細粒度の起源追跡、および堅牢なオフライン処理を提供しつつ、実装を軽量に保ちます。
3. 本当にマスターレス P2P が必要なケース
完全に分散型トポロジー(中央権威なし)を要するアプリケーション(例:純粋な P2P チャットアプリ)では、Yjs のような CRDT も適切かもしれません。それ以外の場合は追加の複雑さとパフォーマンスコストがメリットを上回ります。
4. ライブラリ作者へのメッセージ
ライブラリは ユーザー体験(切断時の許容性、スムーズな UI (60 fps)、予測可能なデータ変化) を中心に設計すべきです。アルゴリズム的基盤よりもこれらの制約から出発することで、結果としてシンプルで堅牢なテクノロジースタックが生まれます。
*付録:詳細コードスニペット、ベンチマーク結果、およびさらなる議論はリクエストに応じてご提供します。