generateMetadata の中でもデータを取得すると、同じ取得が2回走りませんか。
同じ fetch であれば重複排除されます。公式にも、コンポーネントツリー内の同一リクエストは既定でメモ化されるため props で引き回さなくてよい、と書かれています。
面接官が見ているのはリクエストメモ化を知っているか。
これは「ページごとにタイトルや OGP を設定したい。どうしますか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- 同じ fetch であればリクエスト内でメモ化されるので1回で済む
公式に記載があります。ORM で直接叩いている場合は効かない点まで押さえられると強いです。 - 2回走るので、取得結果を上位で1回だけ取って渡す設計にする
fetch ならメモ化されるので、その前提は不要です。ただし ORM を直接使っている場合は実際に2回走るので、状況次第では正しい判断になります。 - メモ化されるので、ORM で直接DBを叩いている場合も1回になる
メモ化が効くのは fetch です。ORM の呼び出しには自動では効きません。ここを混同すると、クエリが倍になっていることに気づけません。 - generateMetadata は別プロセスで動くので、必ず2回になる
別プロセスではありません。同じリクエストの処理の中で呼ばれます。
面接官は何を見ているか
- 同一リクエスト内で重複排除される仕組みがあると知っている
- fetch のメモ化に触れた
- 心配なら計測する、という姿勢がある
模範解答
同じ fetch であれば重複排除されます。
公式には「React コンポーネントツリー内の同一の fetch リクエストは既定でメモ化されるので、props で引き回さずに必要なコンポーネントで取得してよい」と書かれています。generateMetadata と page で同じ URL を fetch していれば、実際に飛ぶのは1回です。
注意が要るのは fetch を使わない場合です。ORM で直接DBを叩いているなら、この仕組みは効きません。その場合は自分でリクエスト単位のキャッシュに包むか、2回走ることを許容するかの判断になります。
いずれにせよ、心配なら実際にクエリログを見て確認します。「たぶんメモ化される」で済ませないところが分かれ目です。