Кастомная страница not-found. Вложенные layout и template страницы в Next.js
Автор конспекта: Стогниева Виктория
1. Создание кастомной страницы 404 (Not-Found)
1.1. Стратегическая важность страницы ошибки
Стандартная страница 404 от Next.js функциональна, но в профессиональной разработке она является
признаком незавершенного продукта. Кастомная страница ошибки — это не просто вежливость, а
стратегический инструмент для:
- Сохранения стилистики вашего сайта
- Удержания посетителя
- Мягкого направления пользователя обратно в рабочую часть приложения
1.2. Поведение по умолчанию и реализация
По умолчанию Next.js отображает стандартную страницу 404. Для создания собственной:
- Расположение файла: Создайте в корневой директории
app/ - Зарезервированное имя: Файл должен называться
not-found.tsx(или.js) - Структура компонента:
Обычный React-компонентс экспортом по умололчанию
Пример реализации:
1.3. Результат и применение
После создания файла not-found.tsx при переходе по любому несуществующему URL пользователь будет
видеть вашу кастомную страницу 404. Это простой, но эффективный способ улучшить взаимодействие с
пользователем и придать приложению завершенный вид.
Создав общую оболочку для ошибок, логично перейти к структурированию общих элементов для
существующих страниц, и здесь на сцену выходят Layouts.
2. Вложенные Layouts для общей структуры и логики
2.1. Концепция иерархической структуры
Файлы Layout в Next.js — это мощный инструмент для создания общих и переиспользуемых
компонентов интерфейса, которые оборачивают целые группы страниц. Это позволяет избежать
дублирования кода, такого как хедеры, футеры или боковые панели, и выносить общую логику (например,
запросы данных) на один уровень выше.
Существует два типа Layouts: корневой и вложенный.
Сравнительная таблица Layouts:
2.2. Принцип вложенности ("Матрёшка")
Layouts в Next.js работают по принципу "матрёшки": дочерние Layouts вкладываются в
родительские, создавая иерархическую структуру UI.
Пример иерархии:
- Уровень 1 (Корень):
app/layout.tsxс общим хедером - Уровень 2 (Профиль):
app/profile/layout.tsxдля всех страниц/profile - Уровень 3 (Динамический профиль):
app/profile/[slug]/layout.tsxдля динамических страниц
При переходе на /profile/123 интерфейс собирается из всех трех уровней. UI рендерится как
матрёшка: корневой Layout оборачивает Layout профиля, который оборачивает Layout динамической
страницы.
2.3. Сохранение состояния при навигации
Ключевая особенность Layout: состояние и сам компонент сохраняются при навигации между
дочерними страницами. Layout не перемонтируется и не перерисовывается.
Профессиональный совет: Используйте Layout для асинхронных запросов данных, которые должны
выполняться один раз для целого раздела сайта. Это предотвращает лишние вызовы API при
навигации.
Но что, если такое поведение нежелательно и нам нужно, чтобы общая обертка пересоздавалась при
каждой навигации? Для этого в Next.js существует другой инструмент.
3. Ключевое различие: Layout против Template
3.1. Фундаментальное отличие в поведении
Основное различие между Layout и Template заключается в управлении состоянием:
- Layout сохраняет состояние. Он монтируется один раз и не пересоздается при навигации
- Template создает новый экземпляр компонента при каждой навигации. Его состояние сбрасывается
3.2. Анализ на практическом примере
Сценарий 1: Использование Layout
Результат эксперимента с Template
Теперь alert будет срабатывать при каждом переходе: и при входе на /profile, и при переходе с
/profile на /profile/123, и при возвращении обратно. Это доказывает, что Template
перемонтируется при каждой навигации, заново выполняя всю свою логику.
3.3. Сводная таблица и сценарии использования
Синтезируем полученные знания в итоговую таблицу.
Вывод: Layout — ваш инструмент по умолчанию для создания общей структуры и сохранения
состояния. Прибегайте к Template только тогда, когда у вас есть конкретная, обоснованная причина для
сброса состояния при каждой навигации, например:
- Запуск анимаций при переходе между страницами
- Повторная инициализация сложных клиентских компонентов
- Сброс состояния формы при навигации
4. Важное замечание для разработчиков: React Strict Mode
В процессе разработки вы можете заметить, что alert из useEffect (или console.log) срабатывает
дважды при монтировании компонента. Не стоит беспокоиться — это ожидаемое поведение в режиме
разработки (development mode).
Причина: React Strict Mode, который по умолчанию включен в Next.js. Он намеренно дважды
рендерит компоненты, чтобы помочь разработчикам выявлять:
- Побочные эффекты в компонентах
- Потенциальные проблемы в коде
- Несоответствия между рендерами
Важно понимать: В финальной, продакшн-сборке (production build) это двойное срабатывание
отсутствует.
Временное отключение Strict Mode
Если это поведение мешает отладке, его можно временно отключить:
Ключевой вывод:
Next.js предоставляет не просто набор инструментов для создания страниц, а целостную систему для
построения веб-приложений промышленного уровня. Понимание и грамотное применение рассмотренных
техник — это путь от начинающего разработчика к архитектору современных веб-решений.
Эти концепции открывают двери к более сложным паттернам Next.js, таким как параллельные маршруты,
интерактивные интерфейсы и продвинутая оптимизация загрузки, формируя прочную основу для
профессионального роста в экосистеме React и Next.js.



