Метаданные и SEO: generateMetadata

Задаём title, description и превью для соцсетей прямо из кода страницы — статически и динамически.

В App Router мета-теги задаются не вручную в <head>, а экспортом объекта metadata или асинхронной функции generateMetadata из серверного компонента.

Статические метаданные

Для страницы с фиксированным заголовком достаточно экспортировать объект metadata. Next.js сам подставит нужные теги в <head>:

// app/about/page.tsx
export const metadata = {
  title: "О нас — Мой сайт",
  description: "Команда и история нашего проекта.",
};

export default function AboutPage() {
  return <h1>О нас</h1>;
}

Динамические метаданные

Для страницы статьи заголовок зависит от данных. Тогда экспортируют async-функцию generateMetadata — она получает те же params, что и страница:

// app/blog/[slug]/page.tsx
export async function generateMetadata({ params }) {
  const post = await getPost(params.slug);
  return {
    title: post.title,
    description: post.excerpt,
    openGraph: { title: post.title, images: [post.cover] },
  };
}

Так каждый адрес получает свой уникальный title и корректное превью при шеринге — то, чего так не хватало SPA.

Что можно задать

ПолеНазначение
titleЗаголовок вкладки и в выдаче
descriptionОписание для поисковика
openGraphПревью в соцсетях и мессенджерах
robotsУказания для поисковых роботов

Почему это серверное

Метаданные генерируются на сервере и попадают в HTML до отправки клиенту. Поэтому поисковик и превью-бот видят правильные теги сразу, без выполнения JavaScript. Соберём типичный заголовок вкладки из шаблона:

function pageTitle(pageName, siteName) {
  return pageName ? pageName + " — " + siteName : siteName;
}

console.log(pageTitle("Блог", "CodeChick"));
console.log(pageTitle("", "CodeChick"));

Вывод:

Блог — CodeChick
CodeChick

Итог

  • Статичные теги — экспорт объекта metadata из страницы или layout.
  • Динамические — функция generateMetadata({ params }), грузящая данные.
  • Метаданные формируются на сервере и сразу попадают в HTML — отличный SEO «из коробки».
Проверьте себя
1. Как задать статические мета-теги страницы в App Router?
AВручную написать <head> в JSX
BЭкспортировать объект metadata из файла страницы
CВызвать useHead в компоненте
DДобавить теги в next.config.js
2. Когда используют generateMetadata вместо объекта metadata?
AКогда метаданные зависят от данных/параметров (например, заголовок статьи)
BКогда страница клиентская
CТолько для главной страницы
DКогда нужно отключить SEO
3. Почему метаданные в App Router хорошо работают для SEO?
AОни генерируются в браузере после загрузки
BОни формируются на сервере и попадают в HTML до отправки клиенту
CОни кэшируются в localStorage
DОни требуют отдельного API-сервера
Поддержать проект