typescriptbeginner
Reusable Metadata Factory
Factory function to generate consistent SEO metadata across all pages with Open Graph and canonical URLs.
typescriptPress ⌘/Ctrl + Shift + C to copy
import type { Metadata } from 'next';
const BASE_URL = 'https://example.com';
const SITE_NAME = 'My App';
interface MetaInput {
title: string;
description: string;
path: string;
image?: string;
noIndex?: boolean;
}
export function createMetadata({
title,
description,
path,
image,
noIndex,
}: MetaInput): Metadata {
const url = `${BASE_URL}${path}`;
const ogImage = image ?? `${BASE_URL}/api/og?title=${encodeURIComponent(title)}`;
return {
title: `${title} — ${SITE_NAME}`,
description,
alternates: { canonical: url },
openGraph: {
title,
description,
url,
siteName: SITE_NAME,
images: [{ url: ogImage, width: 1200, height: 630 }],
type: 'website',
},
twitter: {
card: 'summary_large_image',
title,
description,
images: [ogImage],
},
robots: noIndex ? { index: false, follow: false } : undefined,
};
}
// Usage in page:
// export function generateMetadata({ params }) {
// return createMetadata({
// title: 'My Page',
// description: 'Page description',
// path: `/page/${params.slug}`,
// });
// }Use Cases
- Consistent page SEO
- Dynamic meta generation
- Open Graph previews
Tags
Related Snippets
Similar patterns you can reuse in the same workflow.
typescriptintermediate
SEO Metadata Patterns
Generate dynamic SEO metadata with Open Graph, Twitter cards, JSON-LD, and canonical URLs.
Best for: Dynamic page SEO
#nextjs#seo
typescriptintermediate
Dynamic Metadata with generateMetadata
Generate dynamic SEO metadata based on page params using generateMetadata in Next.js App Router.
Best for: blog SEO
#nextjs#metadata
typescriptadvanced
Dynamic OG Image Generation
Generate Open Graph images on-the-fly using Next.js ImageResponse with custom fonts and dynamic content.
Best for: Social media sharing
#og-image#seo
typescriptadvanced
Next.js Dynamic OG Image Generation
Generate dynamic Open Graph images at build time using next/og for social media sharing.
Best for: Dynamic social media preview images
#nextjs#og-image