Pre-render dynamic routes, generateMetadata for SEO, on-demand generation for new slugs.
generateStaticParams pre-renders dynamic routes at build time—instant page loads, no loading states.
From app/[slug]/page.tsx:
export async function generateStaticParams() {
const posts = await getPublishedPosts();
return posts.map(post => ({ slug: post.slug }));
}
export default async function BlogPostPage({ params }) {
const { slug } = await params;
const post = await getPublishedPostBySlug(slug);
return <MarkdownContent>{post.content}</MarkdownContent>;
}Combine with generateMetadata for SEO:
export async function generateMetadata({ params }) {
const { slug } = await params;
const post = await getPublishedPostBySlug(slug);
return New slugs not in generateStaticParams are generated on-demand and cached. Use updateTag() to invalidate when content changes.