JavaRush /Курсы /Модуль 4: Node.js, Next.js и Angular /Группы маршрутов в Next.js 15: зачем нужны и как использо...

Группы маршрутов в Next.js 15: зачем нужны и как использовать

Модуль 4: Node.js, Next.js и Angular
8 уровень , 5 лекция
Открыта

1. Что такое группы маршрутов в Next.js?

В App Router Next.js 15 появилась особая возможность — группы маршрутов (route groups). На первый взгляд, это просто папка с необычным именем: вместо обычного users или [id] вы создаёте папку с круглой скобкой в имени, например, (dashboard) или (marketing).

Пример:


app/
  (dashboard)/
    stats/
      page.tsx
    users/
      page.tsx
  (marketing)/
    about/
      page.tsx
    promo/
      page.tsx

На первый взгляд, кажется, что эти папки — просто странные имена. Но на деле, папки в круглых скобках не влияют на URL! Они нужны только для организации структуры проекта и управления раскладками, а не для построения путей.

Пример: Как это работает

Если вы создадите файл app/(dashboard)/users/page.tsx, то страница будет доступна по адресу /users, а не по /dashboard/users. Папка (dashboard) — это просто "группа" для организации кода.

2. Зачем нужны группы маршрутов? Зачем изобретать велосипед?

Когда проект становится большим, структура папки app/ может быстро превратиться в хаос. Особенно если у вас появляются разные "разделы" приложения: публичная часть, админка, маркетинговые страницы, личный кабинет и т.д.

Без групп маршрутов:


app/
  login/
    page.tsx
  register/
    page.tsx
  dashboard/
    page.tsx
  dashboard/
    stats/
      page.tsx
  dashboard/
    users/
      page.tsx
  about/
    page.tsx
  promo/
    page.tsx

Всё смешивается в одну кучу, легко запутаться.

С группами маршрутов:


app/
  (auth)/
    login/
      page.tsx
    register/
      page.tsx
  (dashboard)/
    dashboard/
      page.tsx
    stats/
      page.tsx
    users/
      page.tsx
  (marketing)/
    about/
      page.tsx
    promo/
      page.tsx

Теперь видно, где что лежит, и можно легко переиспользовать раскладки (layout.tsx) для целых групп.

3. Как работают группы маршрутов? Главное правило

Группа маршрутов — это папка в круглых скобках, которая не влияет на URL, но влияет на структуру проекта и поведение layout-ов.

  • Всё, что находится внутри (имя-группы)/, будет работать так, как будто этой папки нет для формирования пути в браузере.
  • Вы можете использовать любые имена: (admin), (user-area), (public), (marketing).
  • Можно создавать несколько групп на одном уровне, и даже вкладывать группы друг в друга (но не увлекайтесь, иначе превратитесь в рекурсивного дракона).

Пример:


app/
  (admin)/
    dashboard/
      page.tsx
    users/
      page.tsx
  (public)/
    about/
      page.tsx
    contacts/
      page.tsx

Пояснение:

  • /dashboardapp/(admin)/dashboard/page.tsx
  • /aboutapp/(public)/about/page.tsx

URL не содержит имени группы! Это важно.

4. Главная польза: Разделение структур (layout.tsx) для разных частей приложения

В Next.js layout-ы (layout.tsx) определяют общее оформление и структуру для вложенных страниц. С помощью групп маршрутов вы можете применять разные layout-ы к разным разделам приложения, даже если URL у них совпадают по структуре.

Пример: Личный кабинет и публичная часть


app/
  (dashboard)/
    layout.tsx      // layout для ЛК
    profile/
      page.tsx
    stats/
      page.tsx
  (public)/
    layout.tsx      // layout для публичной части
    home/
      page.tsx
    about/
      page.tsx

Пояснение:

  • Страница /profile будет использовать layout из app/(dashboard)/layout.tsx.
  • Страница /home — layout из app/(public)/layout.tsx.

Зачем это?
В ЛК вы хотите показывать сайдбар, меню пользователя, другую "шапку".
В публичной части — обычный хедер и футер сайта.

Без групп маршрутов пришлось бы делать кучу проверок внутри layout-а: "Если сейчас страница ЛК — показываем одно, иначе другое..." Это быстро превращается в нечитаемый спагетти-код.

5. Пример кода: layout.tsx для группы маршрутов

Давайте попробуем реализовать два разных layout-а для разных групп.

app/(dashboard)/layout.tsx


// Лейаут для личного кабинета
export default function DashboardLayout({ children }) {
  return (
    <div>
      <aside>Меню пользователя</aside>
      <main>{children}</main>
    </div>
  );
}

app/(public)/layout.tsx


// Лейаут для публичной части
export default function PublicLayout({ children }) {
  return (
    <div>
      <header>Публичная шапка сайта</header>
      <main>{children}</main>
      <footer>Футер</footer>
    </div>
  );
}

app/(dashboard)/profile/page.tsx


export default function ProfilePage() {
  return <h1>Профиль пользователя</h1>;
}

app/(public)/home/page.tsx


export default function HomePage() {
  return <h1>Главная страница</h1>;
}

Пояснение:

  • /profile — будет с меню пользователя.
  • /home — с публичной шапкой и футером.

6. Полезные нюансы

Как это все связано с вложенными layout-ами?

Группы маршрутов можно вкладывать друг в друга, и layout-ы будут применяться по принципу вложенности.

Пример:


app/
  (dashboard)/
    layout.tsx
    (analytics)/
      layout.tsx
      stats/
        page.tsx

Для /stats сначала применится layout из (dashboard), потом из (analytics), потом уже страница.

Когда группы маршрутов реально спасают проект?

Разделение публичной и приватной части
Когда у вас есть публичные страницы (например, маркетинг, блог, контакты) и приватные (личный кабинет, админка), группы маршрутов позволяют чётко их разделить и не мешать их логику.

Разные шаблоны для разных разделов
Вам не нужно городить кучу условий в одном layout-е. Каждый раздел получает свой layout, свой стиль, свои компоненты.

Масштабирование и поддержка
Когда проект растёт, вы не сойдёте с ума от количества файлов в папке app/. Всё структурировано и понятно.

Разделение зон ответственности
Команды могут работать над своими группами маршрутов, не мешая друг другу. Например, команда маркетинга работает только в (marketing), команда админки — в (admin).

Можно ли использовать одну и ту же страницу в нескольких группах?

Да, и это очень удобно! Например, у вас есть страница about, которая должна показываться и в публичной части, и в админке, но с разным оформлением.

Структура:


app/
  (public)/
    about/
      page.tsx
  (admin)/
    about/
      page.tsx

Вы можете даже импортировать один и тот же компонент в оба файла, если логика совпадает, а оформление разное.

Можно ли вкладывать группы маршрутов друг в друга?

Да! Но не увлекайтесь, иначе структура станет слишком сложной для понимания. Обычно достаточно одного или двух уровней.

Пример:


app/
  (admin)/
    (settings)/
      users/
        page.tsx

URL будет /users, но для кода это будет "пользовательские настройки в админке".

7. Типичные ошибки при работе с группами маршрутов

Ошибка №1: Ожидание, что имя группы появится в URL.
Очень часто новички думают, что если создать папку app/(dashboard)/profile/page.tsx, то страница будет доступна по /dashboard/profile. Но это не так! Имя группы не влияет на URL вообще. Если нужен префикс в URL, используйте обычную папку без скобок: app/dashboard/profile/page.tsx.

Ошибка №2: Дублирование страниц из-за неправильной структуры.
Иногда случайно создают одинаковые страницы в разных группах, а потом удивляются, что изменения не видны — потому что редактируют не тот файл.

Ошибка №3: Слишком глубокая вложенность групп.
Вложенные группы — это мощно, но если увлечься, можно легко запутаться, какой layout сейчас применяется. Старайтесь держать структуру максимально плоской.

Ошибка №4: Ожидание, что группы маршрутов могут влиять на маршрутизацию API.
Группы маршрутов работают только для страниц и layout-ов, но не для route handlers (API). Для API структура папок должна отражать реальный путь.

Ошибка №5: Путаница с layout-ами и их областью действия.
Если layout лежит в группе маршрутов, он применяется только к страницам внутри этой группы. Если нужен общий layout для всего приложения — кладите его в корень app/layout.tsx.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ