Files
nextjs-style-guide/docs/docs/applied/page-level.md
S.Gromov f645b2ad40
All checks were successful
CI/CD Pipeline / docker (push) Successful in 48s
CI/CD Pipeline / deploy (push) Successful in 7s
refactor: удалить английскую локаль и упростить структуру
- Удалена английская версия документации (docs/en/) и артефакты en
- Контент перенесён docs/ru/ → docs/docs/, URL /ru/ заменён на /docs/
- Из .vitepress/config.ts убраны locales и enSidebar, оставлен один sidebar
- Из лендинга удалён переключатель языка ru/en и en-словарь
- generate-llms.ts переписан без параметра lang; llms.txt, llms-full.txt
  и nextjs-style-guide.zip генерируются в корень docs/public/
- README_RU.md занял место корневого README.md
- Обновлены CONTRIBUTING.md, custom.css, комментарий в Dockerfile
2026-04-26 15:04:10 +03:00

2.1 KiB
Raw Blame History

title
title
Файлы роутинга

Файлы роутинга

Правила для специальных файлов App Router (page.tsx, layout.tsx, error.tsx, not-found.tsx и др.) — чем наш подход отличается от дефолтного.

Организация

  • page.tsx — тонкий файл: только metadata и рендер экрана. Логика, стили и зависимости живут в экране, не в page.tsx.
  • error.tsx и not-found.tsx делегируют разметку экранам по тому же принципу.
  • layout.tsx — точка подключения провайдеров и глобальных стилей. Вёрстка layout-обёрток выносится в слой layouts/.
  • Стили в файлах роутинга не используются — стилизация только внутри вызываемых компонентов.

Реализация

  • Каждый page.tsx экспортирует metadata с title — он подставляется в шаблон корневого layout (%s | App).
  • Корневой layout.tsx задаёт metadata с title.template, description, metadataBase и OpenGraph-настройками.

Примеры

src/app/profile/[id]/page.tsx

import type { Metadata } from 'next'
import { ProfileScreen } from '@/screens/profile'

export const metadata: Metadata = {
  title: 'Профиль',
  description: 'Страница профиля пользователя',
}

type ProfilePageProps = {
  params: Promise<{ id: string }>
}

export default async function ProfilePage({ params }: ProfilePageProps) {
  const { id } = await params

  return <ProfileScreen id={id} />
}

src/app/error.tsx

'use client'

import { ErrorScreen } from '@/screens/error'

type ErrorPageProps = {
  error: Error & { digest?: string }
  reset: () => void
}

const ErrorPage = ({ error, reset }: ErrorPageProps) => {
  return <ErrorScreen error={error} reset={reset} />
}

export default ErrorPage