App Routerのクライアントサイドキャッシュの複雑さ
App Routerのクライアントサイドキャッシュの複雑さ
今日話すこと:
Router Cacheの複雑さ
Appルーターは、Reactの最新機能を使用してアプリケーションを構築するための新しいパラダイムです。すでにNext.jsに慣れ親しんでいる方であれば、App Routerが既存のファイルシステムベースのルーターであるPages Routerの自然な進化形であることがわかるでしょう。
| Mechanism | What | Where | Purpose | Duration |
|---|---|---|---|---|
| Request Memoization | Return values of functions | Server | Re-use data in a React Component tree | Per-request lifecycle |
| Data Cache | Data | Server | Store data across user requests and deployments | Persistent (can be revalidated) |
| Full Route Cache | HTML and RSC payload | Server | Reduce rendering cost and improve performance | Persistent (can be revalidated) |
| Router Cache | RSC Payload | Client | Reduce server requests on navigation | User session or time-based |
App Routerの仕組みを研究してみようと思ったら、Router Cacheが複雑なことに気づいた
Router Cacheの話題に入る前に、App Routerの遷移を理解する必要がある
prefetchCacheと呼ばれているが、公にはRouter Cacheと呼ばれているRouter Cacheは内部的な分類を持っており、挙動がそれぞれ異なる
| cacheの種類 | Link | router |
|---|---|---|
auto | prefetch={undefined} | router.prefetch(path, { kind: PrefetchKind.AUTO }) |
full | prefetch={true} | router.prefetch(path) |
temporary | prefetch={false} | - |
Router Cacheのexpireはprefetchprops・取得時間・利用時間によって分岐する
| 時間判定 / cacheの種類 | auto | full | temporary |
|---|---|---|---|
| prefetch/fetchから30秒以内 | fresh | fresh | fresh |
| lastUsedから30秒以内 | reusable | reusable | reusable |
| prefetch/fetchから30秒~5分 | stale | reusable | expired |
| prefetch/fetchから5分以降 | expired | expired | expired |
fresh, reusable: prefetch/fetchを再発行せず、cacheを再利用するstale: Dynamic Rendering部分だけ遷移時に再fetchを行うexpired: prefetch/fetchを再発行するLinkコンポーネントのprefetch propscacheをpurgeする手段が複雑
router.refresh()revalidatePath/revalidateTagcookies.set/cookies.deleterevalidatePath/revalidateTagは個別のcacheをpurgeできるようになりそうhttps://github.com/vercel/next.js/discussions/54075
Next-Urlヘッダー(GETパラメータなどを省いたもの)に基づいて判定されるNext-Urlが考慮されておらず、Intercepting routes時もcache hitしてしまうNext-Urlをキーに含めるようにすると、これまでの何倍ものprefetchが行われてしまうので難しい問題typeof window分岐とさよならWe are committed to supporting pages/ development, including bug fixes, improvements, and security patches, for multiple major versions moving forward.
https://nextjs.org/blog/next-13-4#is-the-pages-router-going-away
より詳しい話はzennにも記事で書いてるのでよければ読んでください。
Thanks