Гид по технологиям

Динамические маршруты в Next.js

5 min read Разработка Обновлено 02 Dec 2025
Динамические маршруты в Next.js
Динамические маршруты в Next.js

TL;DR

Динамические маршруты позволяют генерировать страницы на основе параметров URL, например slug для постов блога. Для статической генерации используйте вместе getStaticPaths и getStaticProps; если данные меняются часто — getServerSideProps. В статье — примеры кода, советы по вложенным маршрутам и контрольный список для разработчика.

Черно‑белая фотография дороги сверху

Динамические маршруты — это страницы, которые в URL принимают параметры. Они особенно полезны для контента, который повторяется по структуре, но отличается данными: статьи, товары, профили пользователей и т. п. Вместо создания отдельного компонента для каждой страницы вы создаёте шаблон и подставляете данные по параметру.

Ниже — практическое руководство по созданию динамического маршрута в Next.js, с примерами getStaticProps, getStaticPaths, getServerSideProps, вложенными маршрутами и рекомендациями по выбору подхода.

Что такое динамический маршрут (простыми словами)

Динамический маршрут — это файл страницы с именем в квадратных скобках, например [slug].js. Браузер видит конкретный URL (например /dynamic-routes-nextjs), а Next.js подставляет значение параметра в компонент.

Определение в одну строку: динамический маршрут позволяет одному файлу страницы обслуживать набор URL, отличающихся параметром.

Основы: как создать динамический маршрут

  1. В папке pages создайте файл с именем в квадратных скобках: [slug].js, [id].js и т. п.
  2. Внутри экспортируйте компонент страницы и — в зависимости от подхода — getStaticProps/getStaticPaths или getServerSideProps.

Пример краткого компонента Post:

const Post = ({ postData }) => {
  return 
{/* content */}
; }; export default Post;

getStaticProps — когда брать данные на этапе сборки

Если контент меняется редко (статические статьи, документация, продукты с редкими обновлениями), предпочтительна статическая генерация:

  • Производительность: страницы собираются и раздаются как статические файлы.
  • SEO: содержимое видно сразу поисковым ботам.
  • Ограничение: данные обновляются только при пересборке (или при ISR — Incremental Static Regeneration).

Пример использования getStaticProps для поста:

import { getSinglePost } from "../../utils/posts";

const Post = ({ content }) => {
  return 
{/* content */}
; }; export const getStaticProps = async ({ params }) => { const post = await getSinglePost(params.slug); return { props: { ...post }, }; }; export default Post;

getStaticProps получает params, которые передаёт getStaticPaths (ниже). Именно getStaticProps отвечает за формирование пропсов страницы во время сборки.

getStaticPaths — как сгенерировать список маршрутов

getStaticPaths возвращает массив путей (paths), которые нужно предварительно отрендерить. Обычно вы достаёте все доступные записи и мапите их в объект { params: { slug } }.

Пример:

export const getStaticPaths = async () => {
  const paths = getAllPosts().map(({ slug }) => ({ params: { slug } }));

  return {
    paths,
    fallback: false,
  };
};

Параметр fallback управляет поведением для путей, которых нет в paths:

  • false — любые отсутствующие пути приводят к 404.
  • true или ‘blocking’ — страницы могут генерироваться на запрос.

Полный пример [slug].js

import { getAllPosts, getSinglePost } from "../../utils/posts";

const Post = ({ content }) => {
  return 
{content}
; }; export const getStaticPaths = async () => { const paths = getAllPosts().map(({ slug }) => ({ params: { slug } })); return { paths, fallback: false, }; }; export const getStaticProps = async ({ params }) => { const post = await getSinglePost(params.slug); return { props: { ...post }, }; }; export default Post;

Важно: для статической генерации getStaticPaths и getStaticProps обычно используются вместе — первый задаёт набор URL, второй наполняет страницы данными.

Вложенные динамические маршруты

Чтобы создать URL типа /posts/dynamic-routes-nextjs, положите [slug].js в папку pages/posts:

  • pages/posts/[slug].js

Так же можно создавать многоуровневые шаблоны: pages/users/[id]/settings.js и т. д.

Получение параметров из URL на клиенте

Если нужно прочитать параметры внутри компонента на клиентской стороне, используйте хук useRouter:

import { useRouter } from 'next/router'

const Post = () => {
  const router = useRouter()
  const { slug } = router.query
  return 

Post: {slug}

} export default Post

Этот способ полезен для клиентских эффектов или когда вы не используете getStaticProps/getServerSideProps.

getServerSideProps — когда рендерить на каждый запрос

Если данные меняются очень часто (реальное состояние, кастомная персонализация, чувствительная к времени информация), используйте getServerSideProps. Каждый запрос вызывает серверную функцию и возвращает props.

Плюсы: всегда актуальные данные. Минусы: медленнее, требует серверных ресурсов и снижает кэшируемость.

Сравнение: getStaticProps vs getServerSideProps

ПодходКогда подходитМинусы

|getStaticProps + getStaticPaths| Статические страницы, блоги, документация, продукты с редкими изменениями | Обновления появляются после пересборки (если не использовать ISR) |getServerSideProps| Часто меняющиеся данные, персонализация, страницы с авторизацией | Медленнее, нагрузка на сервер

Когда статические маршруты не подойдут (контрпримеры)

  • Вы хотите отображать реальные данные, которые меняются каждую секунду (например, цены на бирже). В этом случае static не подойдёт.
  • Персонализированный контент, зависящий от сессии или куки, лучше отдавать серверно.
  • Огромный список динамических путей (миллионы) — предварительная генерация всех путей неэффективна; используйте fallback и/или пагинацию.

Альтернативные подходы

  • Incremental Static Regeneration (ISR): комбинирует преимущества статической генерации и возможности обновления по расписанию.
  • Клиентский рендеринг (CSR): загружать данные на клиенте после первого рендера — полезно для менее важного SEO-контента.
  • Hybrid: статически генерировать общий шаблон, а специфические части подгружать по API.

Мини‑методология: пошагово для блога

  1. Выберите ключевые slugs для генерации (getAllPosts).
  2. Реализуйте getStaticPaths, возвращающий paths.
  3. Реализуйте getStaticProps для каждого slug.
  4. Тестируйте локально командой next build && next start.
  5. При необходимости добавьте ISR или перейдите на getServerSideProps.

Контрольный список для разработчика

  • Файл страницы: pages/[slug].js или pages/posts/[slug].js
  • getStaticPaths возвращает корректные paths
  • getStaticProps получает params и возвращает props
  • fallback настроен согласно требованиям (false / true / ‘blocking’)
  • Проверить работу useRouter для клиентских эффектов
  • Тесты: render, 404 для неизвестных slug (если fallback: false)

Факты и подсказки

  • Если количество URL велико (десятки тысяч+), подумайте о стратегии пагинации или on-demand генерации (ISR или fallback).
  • Для SEO-важного контента статическая генерация обычно даёт лучший результат.
  • Если нужна персонализация по пользователю, используйте серверный рендеринг или клиентскую подгрузку с авторизацией.

Готовые шаблоны и сниппеты

Основные сниппеты уже показаны выше. Для быстрого старта возьмите полный пример [slug].js и замените getAllPosts/getSinglePost на свои функции доступа к данным.

Критерии приёмки

  • Страницы по known-slugs успешно рендерятся (200).
  • Для неизвестных slug с fallback: false — страница 404.
  • Данные, отображаемые на странице, соответствуют записи из хранилища.
  • При использовании getServerSideProps проверена производительность под ожидаемой нагрузкой.

Безопасность и конфиденциальность

  • Не встраивайте секреты (ключи API) в getStaticProps — это код, выполняемый на сервере во время сборки, но секреты лучше держать в переменных окружения и не попадать в клиентские пропсы.
  • Для персональных данных соблюдайте требования хранения и передачи данных (шифрование, передача по HTTPS).

Короткая сводка

Динамические маршруты в Next.js дают гибкость и масштабируемость: один шаблон — множество URL. Для статического контента используйте getStaticPaths + getStaticProps, для часто меняющегося — getServerSideProps. Выбирайте стратегию в зависимости от требований к свежести данных, производительности и SEO.

1‑строчная глоссарий

  • slug — человеко‑читаемая часть URL, идентификатор записи.
  • getStaticProps — функция для получения данных при сборке.
  • getStaticPaths — функция для перечисления динамических путей.
  • getServerSideProps — функция для получения данных на каждом запросе.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Artfol: руководство для художников
соцсети

Artfol: руководство для художников

Громкость по приложениям на Samsung Galaxy
Android.

Громкость по приложениям на Samsung Galaxy

Авто‑блокировка Windows после неверных входов
Безопасность Windows

Авто‑блокировка Windows после неверных входов

Защитить диск паролем через BIOS/UEFI
Безопасность

Защитить диск паролем через BIOS/UEFI

Cortana: как перевести ПК в спящий режим
Windows

Cortana: как перевести ПК в спящий режим

Live Captions на iPhone, iPad и Mac — включение и настройка
Доступность

Live Captions на iPhone, iPad и Mac — включение и настройка