IT-Q

その fetch の結果はキャッシュされますか。

既定ではキャッシュされません。Next.js 13〜14 は既定でキャッシュする仕様だったため、古い記事を読むと逆の説明に当たります。バージョンを確認しないと判断を誤る箇所です。

面接官が見ているのは🔴 バージョンで変わった箇所。古い知識で答えると外す。

これは「一覧データの取得はどこに書きますか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • 既定ではキャッシュされない。したい場合は明示的に指定する
    正解です。ここはバージョンで変わった箇所なので、正しく言えると評価されます。
  • 既定でキャッシュされるので、不要なら no-store を指定する
    それは App Router 初期(13〜14系)の挙動です。現在は既定でキャッシュされません。面談でこう答えると「2〜3年前で知識が止まっている」と判断されます。
  • 静的レンダリングならキャッシュされ、動的ならされない
    レンダリング方式とデータキャッシュは別の層の話です。混ざりやすいところですが、fetch 単体の既定はキャッシュしない、が答えです。
  • 同じリクエスト内なら再利用されるが、リクエストをまたぐと再取得される
    前半はメモ化の説明として正しく、公式にも記載があります。ただしそれは「キャッシュ」とは別の仕組みです。両方を区別して説明できると、理解の深さが伝わります。

面接官は何を見ているか

  • 既定ではキャッシュされないと答えた
  • 昔は既定でキャッシュされていた、という変遷を知っている
  • キャッシュしたい場合の書き方を挙げられた

模範解答

既定ではキャッシュされません。ここはバージョンで変わった箇所なので注意が要ります。

App Router の初期(Next.js 13〜14)は fetch が既定でキャッシュされる仕様で、「勝手にキャッシュされて古いデータが出る」という声が多く出ました。その後、既定はキャッシュしない方向に変わり、現在の公式は「fetch リクエストは既定でキャッシュされず、完了するまでページの描画をブロックする」と書いています。

キャッシュしたい場合は明示します。個別の呼び出しなら fetch(url, { cache: 'force-cache' })。より新しい書き方としては "use cache" ディレクティブがあります。

面談で「Next.js は fetch を勝手にキャッシュするので怖い」と言うと、2〜3年前で知識が止まっていると判断されます。逆に、「昔はそうだったが今は既定でキャッシュしない」と言えると強いです。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。