Metadata API i SEO w App Router
Eksportowanie statycznych i dynamicznych obiektów metadanych w celu ustawiania tytułów stron, opisów i tagów OG.
Metadata API i SEO w App Router to bezpłatna lekcja React Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.
Dlaczego metadane są ważne
Dobre metadane (tytuł, opis i tagi OG) poprawiają pozycję w wynikach SEO oraz podgląd treści udostępnianych w mediach społecznościowych. App Router Next.js udostępnia bezpieczne typowo API metadanych, które generuje tagi <head> po stronie serwera.
Eksport statycznych metadanych
Eksportuj obiekt metadata z dowolnego pliku page.tsx lub layout.tsx, aby ustawić statyczne tagi dla tego segmentu.
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'My App',
description: 'The best app ever built',
keywords: ['react', 'nextjs', 'typescript'],
};
export default function Page() { return <main>Hello</main>; }Szablony tytułów
Użyj title.template w layoucie, aby strony podrzędne automatycznie otrzymywały sformatowany tytuł bez powtarzania nazwy witryny.
// app/layout.tsx
export const metadata: Metadata = {
title: {
template: '%s | My App',
default: 'My App',
},
};
// app/about/page.tsx
export const metadata: Metadata = {
title: 'About', // renders as "About | My App"
};Dynamiczne metadane z użyciem generateMetadata
Eksportuj asynchroniczną funkcję generateMetadata dla tras, które wymagają tagów zależnych od danych — funkcja otrzymuje params oraz metadane rodzica.
export async function generateMetadata({ params }: { params: { id: string } }): Promise<Metadata> {
const product = await getProduct(params.id);
return {
title: product.name,
description: product.summary,
openGraph: {
title: product.name,
images: [product.imageUrl],
},
};
}Tagi Open Graph
Klucz openGraph ustawia tagi OG używane podczas udostępniania treści w serwisach Facebook, LinkedIn i Slack.
export const metadata: Metadata = {
openGraph: {
title: 'My Product',
description: 'Buy now!',
url: 'https://example.com/product',
siteName: 'My App',
images: [{ url: 'https://example.com/og.png', width: 1200, height: 630 }],
type: 'website',
locale: 'en_US',
},
};Tagi kart Twittera
Klucz twitter ustawia metadane kart specyficzne dla Twittera, zapewniając rozbudowane podglądy w tweetach.
twitter: {
card: 'summary_large_image',
title: 'My Product',
description: 'Buy now!',
images: ['https://example.com/twitter.png'],
creator: '@myhandle',
},Robots i adres kanoniczny
Kontroluj indeksowanie za pomocą robots i ustawiaj kanoniczne adresy URL, aby uniknąć kar za zduplikowaną treść.
export const metadata: Metadata = {
robots: { index: true, follow: true, googleBot: { index: true } },
alternates: { canonical: 'https://example.com/products' },
};Favicony i ikony
Umieść pliki ikon w katalogu app/, używając zarezerwowanych nazw (icon.png, apple-icon.png, favicon.ico), albo zadeklaruj je w metadata.icons.
// Convention: place app/icon.png → auto-detected as favicon
// Or declare explicitly:
export const metadata: Metadata = {
icons: {
icon: '/icon.png',
apple: '/apple-icon.png',
shortcut: '/shortcut-icon.png',
},
};Generowanie obrazów OG za pomocą ImageResponse
Użyj ImageResponse z next/og w pliku route.ts, aby generować dynamiczne obrazy OG z JSX renderowanym do PNG.
// app/og/route.ts
import { ImageResponse } from 'next/og';
export async function GET(req: Request) {
const { searchParams } = new URL(req.url);
const title = searchParams.get('title') ?? 'Default';
return new ImageResponse(
<div style={{ fontSize: 48, background: '#fff', width: '100%', height: '100%' }}>
{title}
</div>,
{ width: 1200, height: 630 }
);
}Dane strukturalne (JSON-LD)
Dodaj dane strukturalne JSON-LD, wstrzykując tag <script> do JSX strony — nie jest to część API metadanych, ale działa razem z nim.
export default function ProductPage({ product }) {
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
price: product.price,
};
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
<h1>{product.name}</h1>
</>
);
}Weryfikowanie metadanych
Użyj narzędzi deweloperskich przeglądarki (karty Network lub wyświetlenia źródła HTML) albo narzędzi takich jak opengraph.xyz, aby sprawdzić, czy metadane są poprawnie renderowane w kodzie HTML wysyłanym przez serwer.
Szybkie sprawdzenie
Która funkcja API metadanych Next.js pozwala stronom podrzędnym dziedziczyć wspólny sufiks tytułu i dostosowywać go, na przykład w postaci „O nas | My App”?
Podsumowanie
Eksportuj metadata dla statycznych tagów lub generateMetadata() dla dynamicznych. Używaj title.template w layoutach, aby tworzyć tytuły zgodnie z zasadą DRY, ustawiaj openGraph i twitter dla podglądów w mediach społecznościowych oraz używaj ImageResponse w handlerze trasy do udostępniania dynamicznych obrazów OG.
Często zadawane pytania
Czy lekcja „Metadata API i SEO w App Router” jest bezpłatna?
Tak — pełny tekst „Metadata API i SEO w App Router” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Metadata API i SEO w App Router”?
Eksportowanie statycznych i dynamicznych obiektów metadanych w celu ustawiania tytułów stron, opisów i tagów OG. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć React Academy?
Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Metadata API i SEO w App Router”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?
Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Konwencje plików App Router
- Komponenty serwerowe a klienckie w Next.js
- Dynamiczne trasy i grupy tras
- Metadata API i SEO w App Router