Next.js App Router / Router Cache をしらべる
について調べる
にも概要がある
The React Server Component Payload is stored in the client-side Router Cache - a separate in-memory cache, split by individual route segment. This Router Cache is used to improve the navigation experience by storing previously visited routes and prefetching future routes.
DeepL: React Serverコンポーネントのペイロードは、クライアントサイドのルーターキャッシュ(個々のルートセグメントごとに分割された個別のメモリ内キャッシュ)に保存されます。このルーターキャッシュは、以前に訪問したルートを保存し、将来のルートをプリフェッチすることで、ナビゲーション体験を向上させるために使用されます。
キャッシュ自体はインメモリに持ってる
<Link>
に基づいてプリフェッチする
RSC Payloadを持つ。静的に描画されたもののみが対象。
実装はどこか?
canary # ebebb6a96a7988d3dd7f80f117bf9143497298c2 で調べる
とりあえず雑に RouterCache とかで grep してみると、それ用のキーを作ってるぽいメソッドがヒットする
<Link>
のprefetch箇所
呼ばれる prefetch の実体
ACTION_PREFETCH
から reducer を辿る
実際にRSC Payloadを取得している箇所は次
fetchServerResponse
を辿ると createFromFetch
に行き着く。これはReact側が提供するもの
レスポンスは、Promise状態のまま state.prefetchCache に突っ込まれる
state.prefetchCache
とは何という話だが、クライアント側は useReducer を使って状態管理をやってる
そのstateの中に prefetchCache
が存在する
createRouterCacheKey
は一体何だったのか
定義箇所は OuterLayoutRouter
であり次のコメントが有る
/**
* OuterLayoutRouter handles the current segment as well as <Offscreen> rendering of other segments.
* It can be rendered next to each other with a different `parallelRouterKey`, allowing for Parallel routes.
*/
OuterLayoutRouter は、現在のセグメントと、他のセグメントの <Offscreen> レンダリングを処理します。
別のparallelRouterKey
で隣り合ってレンダリングすることができ、パラレルルートを可能にします。
Parallel Route で使う?
createRouterCache
が入ったPRを見ると、元々は segmentForCache
という変数名だった
このキーで操作されるのは、同じ useReducer で管理される state 内の cache
そしてコメントには次のように書いてある
DeepL: キャッシュは、画面に表示されるすべてのセグメントと、以前に表示されたセグメントのReactノードを保持します。
進行中のデータリクエストも保持する。
プリフェッチされたデータはprefetchCache
に別途保存され、ACTION_NAVIGATE中に適用される。
prefetchされてるものと今現在まさに表示しているものは分離して管理されてるという話らしい
state.cache
の参照箇所を見てると、
cache.subTreeData
cache.parallelRoutes
が値として入るぽい。後者は名前から明らかに parallelRoutesでの利用。
前者は?
単純にツリー構造をネストして保持するためのものっぽい