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はprefetch
props・取得時間・利用時間によって分岐する
時間判定 / 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
/revalidateTag
cookies.set
/cookies.delete
revalidatePath
/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