[slug] のような動的セグメント、[...slug] のキャッチオール、[[...slug]] のオプショナルキャッチオールで柔軟なURLを定義できる。
// app/blog/[slug]/page.tsx
interface Props {
params: Promise<{ slug: string }>;
}
export default async function BlogPost({ params }: Props) {
const { slug } = await params;
const post = await getPost(slug);
return <article>{post.content}</article>;
}
// 静的生成(SSG)のためのパス一覧を定義
export async function generateStaticParams() {
const posts = await getAllPosts();
return posts.map(post => ({ slug: post.slug }));
}
// メタデータも動的に生成できる
export async function generateMetadata({ params }: Props) {
const { slug } = await params;
const post = await getPost(slug);
return { title: post.title };
}
// キャッチオール: app/docs/[...path]/page.tsx
// /docs/a, /docs/a/b, /docs/a/b/c にマッチ
export default function Docs({ params }: { params: Promise<{ path: string[] }> }) {
// path = ['a', 'b', 'c']
}generateStaticParamsを定義するとビルド時に静的ページが生成される(SSG)。定義しない場合は動的レンダリング(SSR)になる。