Загрузка...
Загрузка...
В Next.js маршрутизация основана на файловой системе. Структура папок внутри директории app напрямую определяет URL-адреса приложения. Не нужно настраивать роутер отдельно.
Каждая папка в app это сегмент URL. Файл page.tsx делает этот сегмент доступным:
| Файл | URL |
|---|---|
app/page.tsx | / |
app/docs/page.tsx | /docs |
app/problems/page.tsx | /problems |
Для динамических сегментов используются квадратные скобки:
// app/docs/[slug]/page.tsx
export default async function DocPage({
params
}: {
params: { slug: string }
}) {
const doc = await getDoc(params.slug)
return <article>{doc.content}</article>
}
URL /docs/what-is-nextjs передаст { slug: 'what-is-nextjs' } в params.
Для захвата нескольких сегментов используется [...slug]:
// app/docs/[...slug]/page.tsx
export default function DocPage({
params
}: {
params: { slug: string[] }
}) {
// /docs/next/ssg → slug = ['next', 'ssg']
// /docs/react/hooks/useState → slug = ['react', 'hooks', 'useState']
return <div>{params.slug.join(' / ')}</div>
}
Вариант [[...slug]] (двойные скобки) также матчит корневой путь без сегментов.
Круглые скобки позволяют группировать роуты без влияния на URL:
(marketing) и (platform) не попадают в URL. Страница /about находится в app/(marketing)/about/page.tsx. Это позволяет использовать разные layouts для разных групп страниц.
Параллельные роуты позволяют рендерить несколько страниц одновременно в одном layout. Определяются через слоты с @:
// app/dashboard/layout.tsx
export default function DashboardLayout({
children,
stats,
activity
}: {
children: React.ReactNode
stats: React.ReactNode
activity: React.ReactNode
}) {
return (
<div>
{children}
<div className="grid grid-cols-2 gap-4">
{stats}
{activity}
</div>
</div>
)
}
Каждый слот загружается и стримится независимо.
Позволяют перехватить навигацию и показать роут в другом контексте (например, в модальном окне):
(.) — перехват на том же уровне
(..) — на уровень выше
(..)(..) — на два уровня выше
(...) — от корня app
Типичный пример: клик по карточке задачи на Hack Frontend открывает модалку с превью, а прямой переход по URL показывает полную страницу.
| Файл | Назначение |
|---|---|
page.tsx | UI страницы |
layout.tsx | Общий layout для сегмента |
loading.tsx | Loading UI (Suspense fallback) |
error.tsx | Обработка ошибок |
not-found.tsx | Страница 404 |
template.tsx | Как layout, но пересоздается при навигации |
route.ts | API endpoint (Route Handler) |
Важно:
Файл page.tsx обязателен для того, чтобы сегмент был доступен как страница. Папка без page.tsx используется только для организации (colocation) и не создает роут.