概要
- Progressive JPEG の考え方をデータ転送に応用する提案
- JSONの従来転送 では、全データ到着まで利用不可
- ストリーミングJSON は不完全なデータ構造の扱いが課題
- Progressive JSON はプレースホルダーとPromiseで部分的にデータ利用可能
- React Server Components はこの手法をUIストリーミングに応用
Progressive JPEGの発想とJSON転送への応用
- Progressive JPEG は画像を上から順にではなく、最初はぼやけて徐々に鮮明に表示する方式
- この考え方を JSONデータ転送 に応用、部分的にデータを受信・利用可能にする発想
- 従来のJSON転送は 全データ受信完了 までクライアント側で何もできない
- サーバー側で一部の生成が遅い場合、全体のレスポンスが遅延する問題
ストリーミングJSONの課題
- ストリーミングJSONパーサ を使うと、未完のデータツリーを途中まで構築可能
- 例えば、コメントが全て揃っていない場合、配列の一部しか取得できない状態
- オブジェクトに 必須プロパティが欠落 しているため、型の整合性が取れない
- どのデータが 完全か未完か不明 で、アプリケーションロジックで扱いが難しい
- このため、ストリーミングJSONは一部のニッチな用途以外では普及していない
順序通りのストリーミングの限界
- HTMLのストリーミング も同様に、ドキュメント順に配信
- 上部だけ表示され、下部(例:footer)は生成済みでも遅延して表示
- データ生成の遅い部分 が全体の表示を妨げる構造的欠点
- 一部が遅いと 後続の全データが遅延 する問題
Progressive JSON:幅優先のストリーミング
- 幅優先(breadth-first) でデータを送信、未送信部分は プレースホルダー("$1"など) で表現
- プレースホルダーは後から Promise として解決される
- クライアント側では 未解決部分をPromise として保持し、利用可能な部分から処理開始
- 例えば、headerやfooterだけ先に表示、postやcommentsは後から順次解決
効率化のためのインライン化
- 全てを細かく分割しすぎると逆に効率低下
- 遅延が発生する箇所のみ をプレースホルダー化し、他はまとめて送信
- クライアントは 受信順が前後しても問題ない ように設計
- サーバーは バッチングやチャンク化の戦略 を柔軟に選択可能
アウトライン化と重複排除
- 同一オブジェクトが複数回出現する場合、 一度だけ送信し、参照で再利用
- 例:userInfoオブジェクトを"$1"として複数箇所で使い回す
- 2回以上使われた時点で インライン→アウトライン に切り替え可能
- 循環参照を持つ サイクリックオブジェクト にも対応可能
ストリーミングデータとストリーミングUI
- React Server Components はこのProgressive JSONの考え方をUIに応用
- サーバーで非同期にデータを生成し、 Promiseとして部分的にクライアントへ配信
- クライアント側では 未解決部分はPromise として保持、解決次第UIを更新
- 例:PostやCommentsのデータが遅延しても、headerやfooterは即表示
- ただし、UIの「穴」を避けるため、Reactは <Suspense> でローディング状態を明示的に制御
まとめ
- Progressive JPEG の発想をデータやUIストリーミングに応用することで、 部分的な表示や処理が可能
- 幅優先のデータ配信、 Promiseによる非同期解決、 重複排除 などのテクニックで効率化
- Reactのようなモダンフレームワークでは、 Progressive JSON 的なストリーミングが標準化されつつある
- クライアントは 部分的なデータ受信 でも柔軟に処理可能な設計が求められる