Crowi
使い方ガイド

リアルタイム共同編集

複数ユーザーが同時にページを編集できる機能の使い方

Crowi 2.0 から、ページ編集画面 (/_edit?page_id=<pageId>) は複数ユーザーで 同時に編集できるリアルタイム共同編集モードで動作します。Google Docs のように他の人のカーソルや選択範囲が見え、入力は数百ミリ秒以内に 他のメンバーへ伝わります。

運用者向けのデプロイ手順は リアルタイム共同編集の運用 を参照してください。

閲覧中のページの自動更新(ライブ差し替え)

ページを 閲覧している ときに他のユーザーがそのページを保存すると、 リロードせずに本文が自動で最新版へ差し替わります (RFC-0003 の read-side soft-refresh)。編集画面を開いていなくても、単に読んでいる だけで最新の内容に追従できます。

  • 差し替えは フルリロードなし・スピナーなし で行われ、スクロール位置は 保持されます (高さが変わった場合は補正されます)。
  • 差し替えと同時に、画面上部中央に 「○○ さんがこのページを更新しました — 最新版を表示中」 の固定バナーが表示されます (○○ は保存した人の 表示名)。
  • バナーの 「以前読んでいた版を読む」 を押すと、差し替え前に読んでいた 版へローカルに戻せます (URL 変更・追加のネットワーク通信なし)。バナーは 「以前読んでいた版を表示中」に変わり、「最新版を表示」 でいつでも最新に 戻れます。戻る前にさらに新しい保存があった場合はバナーが 「○○ さんがさらに新しい版を保存しました」に変わります。
  • REST 保存でも共同編集の保存 (チェックポイント) でも等しくトリガーされます。
  • 複数インスタンス構成 (REDIS_URL 設定済み) でも、別インスタンスに接続して いる閲覧者へ届きます。

発生しないケース(限界)

  • 自分自身の保存 では差し替えもバナーも表示されません。同じユーザーが 別タブで編集して保存した場合も、読んでいるタブは自動更新されません (自分の変更は認識済みとみなす仕様です)。
  • 過去版を閲覧中 (?revision_id= で特定の版を開いている) や 下書き (draft) ページ の閲覧では、この自動更新は発生しません。
  • 短時間に連続して保存された場合は、まとめて 1 回だけ差し替えられます。

コメントのライブ表示

閲覧中のページに 他のユーザーがコメントを投稿 すると、リロードせずに コメント一覧へ自動で追加表示されます。本文のライブ差し替えと同じ /presence チャネルに相乗りする姉妹機能で、対象が本文からコメント一覧に 変わったものです。

  • 新しく届いたコメントには 数秒で消える背景ハイライト(本文内で見出しへ ジャンプしたときの節ハイライトと同じ amber 色)が付き、いま届いたコメントが 一目で分かります。
  • 他のユーザーがコメントを 削除 すると、一覧からもそのコメントが自動で 消えます(一覧が常に正しい状態に保たれます)。
  • 自分の投稿 では自動追加もハイライトも発生しません。自分の操作で一覧は すでに更新済みのためです。
  • コメント本文は presence チャネルには載りません。「コメントが変わった」という 通知だけが届き、クライアントは権限チェック済みの API からコメント一覧を 取得し直します。非公開ページのコメント本文が閲覧者の WebSocket に漏れる ことはありません。
  • 複数インスタンス構成(REDIS_URL 設定済み)でも、別インスタンスに接続して いる閲覧者へ届きます。

発生しないケース(限界)

  • 過去版を閲覧中?revision_id= で特定の版を開いている)や 下書き(draft)ページ の閲覧では、本文のライブ差し替えと同様に presence ソケットを開かないため、コメントのライブ表示も発生しません。
  • ヘッダの「コメント N 件」の件数チップは、このライブ表示では即時には 更新されません(次にページを開き直したときに反映されます)。

保存 = チェックポイント

Crowi のリアルタイム編集は 明示的な保存ボタンを押した瞬間に revision が作成される モデルです。

  • 入力中の文字列はリアルタイムに他の人へ共有されますが、それは まだ revision にはなっていません。Yjs 状態として一時的に保持 されているだけです。
  • 「保存」ボタン (右下) を押した瞬間 にチェックポイントが作成され、 そのときの本文が新しい Revision として永続化されます。
  • 自動保存 (autosave) はありません。必要なタイミングで明示的に保存 してください。
  • Ctrl + S / Cmd + S でのショートカット保存は v2.0 では未実装です (ブラウザの「保存」ダイアログが出てしまうため意図的に無効)。

Tip: Wiki ページの履歴を綺麗に残したいときは、議論や草稿の区切り ごとに保存して下さい。「保存」=「履歴に残すべき節目」と考えると 運用しやすくなります。

contributors (共同編集者) の意味

保存時に作成された revision には、以下の 2 種類の編集者情報が 記録されます:

  • savedBy: 「保存」ボタンを押したユーザー (= revision を確定した人)
  • contributors: その保存サイクル中に 同じページに居合わせた すべてのユーザー (awareness で接続が見えていた人)

「居合わせた」は単に開いていただけでも該当します。実際にカーソルを 動かしていなくても、編集ページを開いて awareness が共有されていた ユーザーは contributors に含まれます。これは「あなたの保存に向けて 誰がレビュー / 共同編集に立ち会ったか」を残すための仕組みです。

ページの 履歴一覧 (Revisions) では、savedBy と contributors が 組み合わさって以下のように表示されます:

Alice (with Bob, Carol)  ・ 5 分前

「Alice が保存、その場に Bob と Carol が居合わせた」と読みます。 contributors が 0 人の場合 (単独編集) は Alice だけが表示されます。

同時編集人数の上限 (20 人)

1 ページあたりの同時編集者数はデフォルトで 20 人 に制限されています。

  • 21 人目以降が編集ページを開くと、エディタは read-only モード に 切り替わり、画面上部に「同時編集者の上限に達しました」のバナーが 表示されます。
  • read-only モードでも他の人の編集は リアルタイムで反映 されるため、 内容を見ながら待つことができます。
  • 上限内のユーザーが離脱したら、ページを reload することで編集モードに 戻れる可能性があります (空きが出るまで明示的なキューはありません)。

上限値は管理者が COLLAB_MAX_EDITORS_PER_PAGE 環境変数で変更できます (運用ガイド参照)。

接続が切れたら / 復帰したら

ネットワーク切断時の挙動:

  • ネット接続が切れると画面上部に 「オフラインです」 のトースト通知が 出ます。
  • オフライン中も エディタ内の入力は保持 されます。Yjs はローカルに delta を蓄積し続けます。
  • 接続が復帰すると 「再接続しました」 のトーストが出て、ローカル delta が他のメンバーへ送信されます。同時に他メンバーの delta も 受信して同期します。
  • 保存ボタンはオフライン中は無効化されます (サーバへの保存要求が 送れないため)。再接続後に押してください。

長時間オフラインだった場合、サーバ側の Y.Doc と差分が大きくずれて いる可能性があります。再接続後すぐにエディタ内容が著しく変わった 場合は、自身のオフライン編集が反映される過程です — 慌てずに reload を試してください。

強制 reload ダイアログ

管理者が CLI ツールなどで本文を直接編集した場合 (例: crowi-admin renderer:rebuild 後の整合性回復、データ修復)、画面上部に 「ページが 外部で更新されました。reload してください」 のダイアログが出ます。

  • OK を押すとページが reload され、最新のサーバ側状態が読み込まれます。
  • このダイアログが出るのは「サーバ側の Page.yjsState が外部要因で リセット / 破損したため、いまの編集セッションを継続できない」 ケースのみです。日常的には発生しません。
  • ダイアログを出されたまま編集を続けても保存はできない可能性が高い ため、必ず reload してください。

履歴一覧での表示

ページの 履歴 (Revisions) タブを開くと、各保存ポイントが 以下のような形式で並びます:

編集者日時メモ
Alice (with Bob, Carol)5 分前(空)
Alice1 時間前(空)
Bob (with Alice)昨日 14:30(空)

(with …) の部分が contributors です。複数人で編集していた様子が 追えるため、後から「誰がこのページに関わったか」が一覧で見えます。

Revision の diff やロールバックは従来の Crowi と同じ操作で行えます。

On this page