App Routerの型、サーバーコンポーネントとクライアントコンポーネント
App Routerのデフォルト(サーバーコンポーネント)、クライアントコンポーネントを選択する場面、ルートハンドラーの型付け方法を理解します
「App Routerの型、サーバーコンポーネントとクライアントコンポーネント」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。
はじめに
目標:App Router を TypeScript で確実に使えるようにします。デフォルトのサーバーコンポーネントを確認し、必要に応じてクライアントコンポーネントを有効にし、API エンドポイント用のルートハンドラーに型を付けます。
- サーバーとクライアントの機能の違い
- 型付き props の受け渡し
- 型付き NextRequest/NextResponse
サーバーコンポーネント
app/ 配下のファイルは、デフォルトでサーバーコンポーネントになります。サーバー専用コードを実行し、レンダリング前にデータを取得できます。
// app/page.tsx (server component by default)
export default async function Page() {
// Server code: read env, fetch data, call DB (conceptually)
const data: { message: string } = { message: "Hello from server component" }
return (
<main style={{ display: "grid", gap: 8 }}>
<h1>Home</h1>
<p>{data.message}</p>
</main>
)
}クライアントコンポーネント
先頭にディレクティブ "use client" を追加すると、フックやイベントハンドラーを有効にできます。クライアントコンポーネントはブラウザーで実行されます。
"use client"
import { useState } from "react"
// app/components/Counter.tsx (client component)
export default function Counter() {
const [n, setN] = useState(0)
return (
<div style={{ display: "flex", gap: 8, alignItems: "center" }}>
<button onClick={() => setN(n - 1)}>-</button>
<span>{n}</span>
<button onClick={() => setN(n + 1)}>+</button>
</div>
)
}サーバーからクライアントへの props
サーバーでデータを計算し、型付き props としてクライアントコンポーネントに渡します。サーバー専用ロジックをクライアント側に置かないようにします。
// app/page.tsx (server) + client import
import Counter from "./components/Counter"
export default async function Page() {
const initial = 5 // fetched or computed on the server
return (
<main style={{ display: "grid", gap: 12 }}>
<h2>Dashboard</h2>
<CounterWithStart start={initial} />
</main>
)
}
// app/components/CounterWithStart.tsx
"use client"
import { useState } from "react"
export default function CounterWithStart({ start }: { start: number }) {
const [n, setN] = useState(start)
return (
<div style={{ display: "flex", gap: 8, alignItems: "center" }}>
<button onClick={() => setN(n - 1)}>-</button>
<span>{n}</span>
<button onClick={() => setN(n + 1)}>+</button>
</div>
)
}ルートハンドラー
app/api/*/route.ts 配下のハンドラーには、型付きの NextRequest/NextResponse を使います。ステータスコードとともに JSON を返します。
// app/api/hello/route.ts (App Router API)
import { NextRequest, NextResponse } from "next/server"
export async function GET(req: NextRequest) {
const name = req.nextUrl.searchParams.get("name") ?? "world"
const body: { message: string } = { message: `Hello, ${name}!` }
return NextResponse.json(body, { status: 200 })
}
export async function POST(req: NextRequest) {
const payload = (await req.json()) as { name?: string }
const body = { created: true, name: payload.name ?? "anon" }
return NextResponse.json(body, { status: 201 })
}ヒント
ヒント:
- デフォルトではサーバーコンポーネントを使い、インタラクティブ性が必要な場合にのみクライアントを有効にします。
- サーバーとクライアント間で渡す props は小さく、シリアライズ可能に保ちます。
- 型付きの
NextResponse.jsonの形を一貫して使います。
App Router のクライアント確認
確認問題:App Router のコンポーネントファイルでフックを有効にするにはどうしますか?
まとめ
まとめ:App Router はデフォルトでサーバーコンポーネントを使います。インタラクティブ性が必要なら "use client" を追加し、境界を越えて型付き props を渡し、NextRequest/NextResponse でルートハンドラーに型を付けます。
よくある質問
「App Routerの型、サーバーコンポーネントとクライアントコンポーネント」レッスンは無料ですか?
はい。「App Routerの型、サーバーコンポーネントとクライアントコンポーネント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。
「App Routerの型、サーバーコンポーネントとクライアントコンポーネント」で何を学びますか?
App Routerのデフォルト(サーバーコンポーネント)、クライアントコンポーネントを選択する場面、ルートハンドラーの型付け方法を理解します ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「App Routerの型、サーバーコンポーネントとクライアントコンポーネント」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- App Routerの型、サーバーコンポーネントとクライアントコンポーネント
- データ取得とアクションの型付け
- 環境変数の型付けと設定