API метаданных и SEO в App Router
Экспортируйте статические и динамические объекты метаданных, чтобы задавать заголовки и описания страниц, а также теги OG.
«API метаданных и SEO в App Router» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Почему важны метаданные
Хорошие метаданные (заголовок, описание, теги OG) улучшают позиции в результатах SEO и предварительный просмотр при публикации в социальных сетях. Маршрутизатор App Next.js предоставляет типобезопасный программный интерфейс метаданных, который создает теги <head> на сервере.
Экспорт статических метаданных
Экспортируйте объект metadata из любого page.tsx или layout.tsx, чтобы задать статические теги для этого сегмента.
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>; }Шаблоны заголовков
Используйте title.template в макете, чтобы дочерние страницы автоматически получали отформатированный заголовок без повторения имени сайта.
// 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"
};Динамические метаданные с generateMetadata
Экспортируйте асинхронную функцию generateMetadata для маршрутов, которым нужны теги на основе данных: она получает params и метаданные родительского элемента.
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],
},
};
}Теги Open Graph
Ключ openGraph задает теги OG для публикации в Facebook, LinkedIn и 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',
},
};Теги карточек Twitter
Ключ twitter задает специальные для Twitter метаданные карточки, обеспечивающие расширенный предварительный просмотр в твитах.
twitter: {
card: 'summary_large_image',
title: 'My Product',
description: 'Buy now!',
images: ['https://example.com/twitter.png'],
creator: '@myhandle',
},Роботы и канонические URL
Управляйте сканированием с помощью robots и задавайте канонические URL, чтобы избежать санкций за дублирование содержимого.
export const metadata: Metadata = {
robots: { index: true, follow: true, googleBot: { index: true } },
alternates: { canonical: 'https://example.com/products' },
};Фавиконы и значки
Размещайте файлы значков в app/, используя зарезервированные имена (icon.png, apple-icon.png, favicon.ico), или объявляйте их в 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',
},
};Генерация изображений OG с помощью ImageResponse
Используйте ImageResponse из next/og в route.ts, чтобы создавать динамические изображения OG с помощью JSX, отображаемого в 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 }
);
}Структурированные данные (JSON-LD)
Добавляйте структурированные данные JSON-LD, внедряя тег <script> в JSX страницы. Они не являются частью программного интерфейса метаданных, но работают вместе с ним.
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>
</>
);
}Проверка метаданных
Используйте браузерные DevTools (вкладку «Сеть» или просмотр исходного кода HTML) либо такие инструменты, как opengraph.xyz, чтобы проверить корректное отображение метаданных в HTML, отправляемом сервером.
Быстрая проверка
Какая возможность API метаданных Next.js позволяет дочерним страницам наследовать общий суффикс заголовка и настраивать его, например «О нас | Моё приложение»?
Итоги
Экспортируйте metadata для статических тегов или generateMetadata() для динамических. Используйте title.template в макетах для заголовков без дублирования, задавайте openGraph и twitter для предварительного просмотра в социальных сетях, а в обработчике маршрута используйте ImageResponse для выдачи динамических изображений OG.
Часто задаваемые вопросы
Урок «API метаданных и SEO в App Router» бесплатный?
Да — полный текст урока «API метаданных и SEO в App Router» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «API метаданных и SEO в App Router»?
Экспортируйте статические и динамические объекты метаданных, чтобы задавать заголовки и описания страниц, а также теги OG. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «API метаданных и SEO в App Router»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Соглашения об именовании файлов App Router
- Серверные и клиентские компоненты в Next.js
- Динамические маршруты и группы маршрутов
- API метаданных и SEO в App Router