Crowi

リアルタイム共同編集

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

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

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

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

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

  • 差し替えは フルリロードなし・スピナーなし で行われ、スクロール位置は 保持されます (高さが変わった場合は補正されます)。
  • 差し替えと同時に、画面上部中央に 「○○ さんがこのページを更新しました — 最新版を表示中」 の固定バナーが表示されます (○○ は保存した人の 表示名)。
  • バナーの 「以前読んでいた版を読む」 を押すと、差し替え前に読んでいた 版へローカルに戻せます (URL 変更・追加のネットワーク通信なし)。バナーは 「以前読んでいた版を表示中」に変わり、「最新版を表示」 でいつでも最新に 戻れます。戻る前にさらに新しい保存があった場合はバナーが 「○○ さんがさらに新しい版を保存しました」に変わります。
  • REST 保存でも共同編集の保存 (チェックポイント) でも等しくトリガーされます。
  • Crowi を複数台のサーバで動かしている場合も、別のサーバにつながっている 閲覧者に届きます。
  • tab を非アクティブにしていた間や、ネットワーク切断からの復帰時にも、 リロード不要で自動的に最新へ追従します。閲覧中の tab が非アクティブから アクティブに戻ったとき・presence の接続が切断から再接続したときのいずれも、 その間に保存された更新を取りこぼさず拾い直します。加えて、tab を開いている 間は 3 分間隔の周期チェックが保険として動き続けるため、まれに上記のいずれの タイミングでも拾いきれなかった更新があっても、最大 3 分程度の遅れで自然に 解消されます。
  • 閲覧中に自分の権限が取り消された場合は、自動的にアクセス不可の表示へ 切り替わります。

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

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

コメントのライブ表示

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

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

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

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

保存 = チェックポイント

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

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

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

共同編集者の記録

保存してできたリビジョンには、2 種類の編集者が記録されます。

  • 保存した人: 「保存」ボタンを押したユーザー
  • 居合わせた人: その保存の時点で同じページを編集画面で開いていたユーザー

「居合わせた」は開いていただけでも該当します。実際に入力していなくても、 編集画面を開いていた人は記録されます。誰と一緒に書いたページなのかを 履歴に残すための仕組みです。

記録はベストエフォートです。サーバを複数台で運用している場合、保存を処理した サーバから見えていた人だけが記録され、別のサーバにつながっていた人は 漏れることがあります。

ページの 履歴 では、この 2 つが組み合わさって次のように表示されます。

Alice (with Bob, Carol)  ・ 5 分前

「Alice が保存、その場に Bob と Carol が居合わせた」と読みます。 ほかに誰もいなかった場合 (単独編集) は Alice だけが表示されます。

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

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

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

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

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

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

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

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

強制 reload ダイアログ

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

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

履歴一覧での表示

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

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

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

差分の確認とロールバックは リビジョンとロールバック を 参照してください。

On this page