リアルタイム共同編集
複数ユーザーが同時にページを編集できる機能の使い方
Crowi 2.0 から、ページ編集画面 (/_edit?page_id=<pageId>) は複数ユーザーで
同時に編集できるリアルタイム共同編集モードで動作します。Google Docs
のように他の人のカーソルや選択範囲が見え、入力は数百ミリ秒以内に
他のメンバーへ伝わります。
運用者向けのデプロイ手順は リアルタイム共同編集の運用 を参照してください。
閲覧中のページの自動更新(ライブ差し替え)
ページを閲覧しているときに他のユーザーがそのページを保存すると、 リロードせずに本文が自動で最新版へ差し替わります。編集画面を開いて いなくても、単に読んでいるだけで最新の内容に追従できます。
- 差し替えはフルリロードもスピナー表示もなしで行われ、スクロール位置は 保持されます (高さが変わった場合は補正されます)。
- 差し替えと同時に、画面上部中央に 「○○ さんがこのページを更新しました — 最新版を表示中」 の固定バナーが表示されます (○○ は保存した人の 表示名)。
- バナーの 「以前読んでいた版を読む」 を押すと、差し替え前に読んでいた 版へローカルに戻せます (URL 変更・追加のネットワーク通信なし)。バナーは 「以前読んでいた版を表示中」に変わり、「最新版を表示」 でいつでも最新に 戻れます。戻る前にさらに新しい保存があった場合はバナーが 「○○ さんがさらに新しい版を保存しました」に変わります。
- 差し替えは、REST 保存でも共同編集の保存 (チェックポイント) でも同じように起こります。
- Crowi を複数台のサーバで動かしている場合も、別のサーバにつながっている 閲覧者に届きます。
- タブを非アクティブにしていた間や、ネットワーク切断から復帰したときも、 リロードせずに自動で最新へ追従します。閲覧中のタブが非アクティブから アクティブに戻ったときも、presence の接続が切断から再接続したときも、 その間に保存された更新を取りこぼさず拾い直します。また、タブを開いている 間は 3 分間隔の周期チェックが保険として動き続けます。上記のどの タイミングでも拾えなかった更新がまれにあっても、最大 3 分程度の遅れで 自然に反映されます。
- 閲覧中に自分の権限が取り消された場合は、自動的にアクセス不可の表示へ 切り替わります。
発生しないケース(限界)
- 自分自身の保存 では、このタブのバナーは表示されません (自分の変更は 認識済みとみなす仕様です)。ただし内容そのものは、同じユーザーが別タブや 別端末で編集して保存した場合でも、読んでいるタブへバナーなしで 反映されます。
- 過去版を閲覧中 (
?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 分前 | (空) |
| Alice | 1 時間前 | (空) |
| Bob (with Alice) | 昨日 14:30 | (空) |
(with …) の部分が居合わせた人です。複数人で編集していた様子が
追えるため、後から「誰がこのページに関わったか」が一覧で見えます。
差分の確認とロールバックは リビジョンとロールバック を 参照してください。