cat posts/next-js-%e3%81%ae-app-router-%e3%81%a8%e5%8d%8a%e6%9c%88%e5%90%91%e3%81%8d%e5%90%88%e3%81%a3%e3%81%9f%e7%b5%90%e6%9e%9c.md

Next.js の App Router と半月向き合った結果

Pages Router でいいじゃないかと思っていた時期がありました。

新しいプロジェクトで App Router を使うことにしました。Server Components、Client Components、use client ディレクティブ、キャッシュの扱い——最初の一週間は「なぜこれが動かないのか」をひたすら調べていました。

混乱した点

Server Component にはイベントハンドラが書けません。onClick を書いた瞬間に「Client Component にしてください」と言われます。どこを Server にしてどこを Client にするか、設計段階で考えないと後から修正が面倒でした。

// サーバー側でデータ取得
// app/posts/page.tsx (Server Component)
export default async function PostsPage() {
  const posts = await fetchPosts(); // サーバーで実行
  return ;
}

// インタラクションが必要な部分だけ Client に
// components/PostList.tsx
'use client';
export function PostList({ posts }) {
  const [filter, setFilter] = useState('');
  ...
}

慣れた後

「サーバーで取れるものはサーバーで取る」という意識になると、クライアントの JS バンドルが小さくなります。ページ表示速度が改善されて、計測してみると体感と一致しました。

Pages Router より設計の自由度が上がった分、考えることが増えます。それを面倒と取るか、適切な制御ができると取るかで評価が変わる気がします。