Open44

Next.jsの考え方

さとしさとし
さとしさとし

非同期コンポーネントは兄弟もしくは兄弟の子孫コンポーネントとして配置されてる場合、並行にレンダリングデータフェッチの並行化。
<コンポーネントA>
<コンポーネントB>
 <コンポーネントB−a>
A・B-aは並行フェッチされる。

さとしさとし
さとしさとし

"use client";が記載されたモジュールからインポートされたモジュールはすべて全て暗黙的にクライアントモジュールとして扱われる。

対策:コンポーネントツリーの末端をClient Componentsにする

さとしさとし

Compositionパターン:
子どもにpropsとしてseverコンポーネントを渡すことはできる。

さとしさとし
さとしさとし

Static Rendering:build時やrevalidate後
Dynamic Rendering:ユーザーリクエスト時

さとしさとし

Route Segment Configを利用してDynamic Renderingに切り替えることもできます。具体的には、page.tsxやlayout.tsxに以下どちらかを設定することでDynamic Renderingを強制できます。

// layout.tsx | page.tsx
export const dynamic = "force-dynamic";

// layout.tsx | page.tsx
export const revalidate = 0; // 1以上でStatic Rendering

さとしさとし

キャッシュ関連の情報はチュートリアルには記載がなかった。

さとしさとし

App Routerでは可能な限りStatic Renderingにすることが推奨されている。

さとしさとし
さとしさとし

要約:データ操作はServer Actionsで実装することを基本としましょう。

さとしさとし

ブラウザバックではRouter Cacheが利用されます。この際には画面は即時に描画され、スクロール位置も正しく復元されるが、revalidatePath()などを呼び出すなどすると、Router Cacheが破棄されるため、スクロール位置を失う。

さとしさとし
さとしさとし

重いデータフェッチに対して、Suspenseを用いてfallbackを元に即座にレスポンスを送信して、フェッチ完了後にデータを送信させる。

さとしさとし

1秒を超過するようであれば、Suspenseを適用させることを検討する。

さとしさとし

画面の一部にfallbackを表示しそれが後に置き換えられるため、いわゆるLayout Shiftが発生する可能性ある。

さとしさとし

置き換え後の高さが固定であれば、同様の高さとすることで回避する方法はある。