📻

Next.js App Routerってなに?初心者が導入してみて分かったこと【導入〜使い方】

に公開5

記事を書いた背景

Next.js を使ったサービス開発に従事することになりました。
これまでもなんとなくで使っていましたが、今回はしっかりと学び直しつつ、その勉強ログとして記事にまとめています。
※ 間違っている箇所があれば、ぜひコメントで教えてください!


📌 この記事でわかること

  • Next.js 13以降で登場した App Router の概要
  • Pages Routerとの違い
  • App Routerの導入方法
  • App Routerの基本構成とファイルの役割
  • 公式リファレンスまとめ

🚀 App Routerとは?

Next.js 13で新たに導入されたルーティングの仕組みで、app/ ディレクトリを使って柔軟なページ構成が可能になります。

App Router is a new routing mechanism built on top of React Server Components.

App Router は、従来の Pages Router(pages/ ディレクトリ)を置き換えるものではなく、併存可能な新しい選択肢です。
私はこれまでやったことあったのはこっちのやり方だけだったのでここだけでも新鮮でした。

pages/ ディレクトリ

📖 公式リファレンス


🔀 Pages Routerとの違い

項目 Pages Router App Router
ディレクトリ pages/ app/
レイアウト共有 _app.tsx, _document.tsx layout.tsx
データ取得 getServerSideProps fetch / use / Server Component 内で直接取得
動的ルーティング [slug].tsx [slug]/page.tsx
SSR/SSG 明示的(getStaticProps等) 暗黙的(fetchの使い方で制御)
React Server Components 非対応 対応

🛠 App Routerの導入方法

1. Next.js 13以上のインストール

npx create-next-app@latest your-app-name

プロジェクト作成時に「App Routerを使うか?」と聞かれるので Yes を選択してください。

既存プロジェクトでは、pages/app/ の併存が可能ですが、同一ルートに存在する場合は app/ が優先されます。


📂 ディレクトリ構成と主なファイルの役割

App Router では、ディレクトリとファイル名によってルーティングや表示が制御されます。

/app
  ├─ layout.tsx       ← 全体の共通レイアウト
  ├─ page.tsx         ← トップページ(/)
  └─ about/
        ├─ page.tsx   ← /about ページ
        └─ layout.tsx ← /about 用レイアウト

主なファイルの役割

ファイル名 説明
page.tsx 各ルートのページ本体(URLに対応)
layout.tsx 共有レイアウト。子にも継承される
loading.tsx 読み込み中のUI。非同期対応のルートに表示される
error.tsx エラー発生時に表示されるUI(要 'use client')
not-found.tsx 404用のカスタムUI
template.tsx layout.tsx に似ているが状態を共有せず毎回再レンダリング

✨ layout.tsx の例

// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ja">
      <body>{children}</body>
    </html>
  );
}
  • <html><body> を定義でき、アプリ全体の構造制御がしやすい
  • ネストされたレイアウトにより、柔軟なレイアウト構成が可能

⏳ loading.tsx の使い方

// app/dashboard/loading.tsx
export default function Loading() {
  return <p>読み込み中です...</p>;
}
  • 非同期処理を含む page.tsxlayout.tsx に対応
  • Skeleton UI でUX向上
  • Server ComponentでもOK('use client' 不要)

❌ error.tsx でエラーUIを出す

// app/dashboard/error.tsx
'use client';

import { useEffect } from 'react';

export default function Error({ error, reset }: { error: Error; reset: () => void }) {
  useEffect(() => {
    console.error(error);
  }, [error]);

  return (
    <div>
      <h2>エラーが発生しました</h2>
      <button onClick={() => reset()}>再試行</button>
    </div>
  );
}
  • 'use client' をつけてクライアントコンポーネントとして動作
  • reset() で再レンダリングが可能

🔍 参考リンク(Next.js公式)


Discussion

Honey32Honey32

末尾の「参考リンク」のリンクが切れてますよ

gyocla817gyocla817

ありがとうございます!差し替えさせていただきました。

Honey32Honey32

おかしいと思って確認してみましたが、当記事の「その他の補助ファイル」の中に書かれている

metadata.ts そのルートに関連付けるメタ情報をオブジェクト形式で定義する(SEO向け)

という規約は、実在しません。

https://nextjs.org/docs/app/api-reference/file-conventions/metadata

間違いなら恐縮ですが、生成 AI のハルシネーションっぽい感じがします。裏取りはされましたか?

gyocla817gyocla817

ご指摘ありがとうございます。
確認しているつもりではあるのですが根拠がないので該当箇所に関連するところは削除しました。
申し訳ございません。

Honey32Honey32

いえいえ、

色々指図するのは少し差し出がましいですが、

  • 情報のインプットを丁寧にする
    • App Router は新しいので、日本語訳がおそらく追いついていません。SSoT(信頼できる唯一の情報源)は英語で書かれた公式ドキュメントだけです。
    • 英語ドキュメントを自力で読むのは大変なので、「Notebook LM などの AI に、ドキュメントを、情報ソースとして明示的に渡す」ことによって、代わりにドキュメントを読んでもらって学習のパートナーとして利用するのがオススメです(僕は生成 AI には疎いのであまり詳しくないですが)
      • 正直、英語のドキュメントを読み込むのは大変で、App Router のドキュメントの分量もかなり膨大なので…
      • 僕も App Router がリリースされたときの熱狂にまかせて当時まだページ数の少なかったドキュメントを読みまくった記憶が定着しているだけで、今から目を通すのは大変です。
  • 実際に試す
    • 極端な話、「こういう仕様になっています」は誤りを書くおそれがありますが、「こう書いたら、こう動いた」は、その危険性が低くなります。
  • アウトプットは、知識よりも「試してどうだったか」を中心に書いてみる
  • 生成 AI は「自身の知識について説明させる」のではなく、あなたが↑のようにインプットした内容を渡して、あくまで AI は「文章としての体裁を整える」ためにのみ使う。

みたいなことをすると、有益になるかもしれません。

手前味噌になりますが僕を含め、公式ドキュメントを読む労力を減らすのに有用な、情報をうまく噛み砕いた記事を発信している人がいます。そういった人をみつけて、彼らの記事を利用するのも良いと思います。

https://zenn.dev/yumemi_inc/articles/next-13-app-overview

https://qiita.com/honey32/items/75c57fa0e465f0080030

https://qiita.com/uhyo/items/abacedd7d4b8370688c5

https://qiita.com/ssssota/items/51278dc5d51801dfb3fc

https://zenn.dev/chot/articles/do-not-use-use-media-query