При работе с TanStack Router важно грамотно организовать проект, чтобы маршруты оставались управляемыми, а код — читаемым и масштабируемым. Основная идея заключается в разделении маршрутов на логические группы и в создании четкой иерархии файлов, отражающей структуру приложения.
1. src/routes — маршруты приложения В
этой директории хранятся все определения маршрутов. Хорошая практика —
создавать поддиректории для каждого крупного раздела приложения.
Например:
src/routes/
├─ index.tsx
├─ dashboard/
│ ├─ index.tsx
│ └─ analytics.tsx
├─ users/
│ ├─ index.tsx
│ └─ [userId].tsx
└─ settings/
├─ index.tsx
└─ profile.tsx
Ключевые моменты:
createRoute.[param], что упрощает связывание URL и параметров.2. src/components — компоненты
интерфейса Компоненты, используемые в маршрутах, хранятся
отдельно. Это позволяет не смешивать логику маршрутизации и
представление. Подкатегории можно создавать для крупных разделов
приложения:
src/components/
├─ layout/
│ └─ MainLayout.tsx
├─ ui/
│ ├─ Button.tsx
│ └─ Modal.tsx
└─ users/
├─ UserCard.tsx
└─ UserForm.tsx
Особенности:
layout.3. src/router.ts — корневой роутер Файл
router.ts содержит иерархию всех маршрутов и создаёт
экземпляр роутера с помощью createRouter. Пример базовой
структуры:
import { createRouter } from '@tanstack/router'
import { rootRoute } from './routes'
import { dashboardRoute } from './routes/dashboard'
import { usersRoute } from './routes/users'
import { settingsRoute } from './routes/settings'
export const router = createRouter({
routeTree: rootRoute.addChildren([
dashboardRoute,
usersRoute,
settingsRoute,
]),
})
Основные правила:
addChildren формирует иерархию
маршрутов, что упрощает навигацию и управление доступом.TanStack Router позволяет легко работать с динамическими сегментами URL:
[userId].tsx автоматически связывает сегмент URL с
параметром userId.useParams:import { useParams } from '@tanstack/router'
export default function UserPage() {
const { userId } = useParams()
return <div>Профиль пользователя {userId}</div>
}
Рекомендации по организации:
[param].TanStack Router поддерживает вложенные маршруты с собственными лэйаутами. Например:
src/routes/dashboard/index.tsx // основной лэйаут dashboard
src/routes/dashboard/analytics.tsx // вложенный маршрут
export const dashboardRoute = rootRoute.addChild({
path: 'dashboard',
component: DashboardLayout,
children: [
{
path: 'analytics',
component: AnalyticsPage,
},
],
})
Ключевые моменты:
<Outlet /> родительского компонента.Для крупных приложений рекомендуется отделять маршрутизацию от загрузки данных:
// src/routes/users/[userId].ts
export const userLoader = async ({ params }) => {
const response = await fetch(`/api/users/${params.userId}`)
return response.json()
}
В компоненте маршрута подключается loader через TanStack Router:
import { useLoaderData } from '@tanstack/router'
export default function UserPage() {
const user = useLoaderData<typeof userLoader>()
return <div>{user.name}</div>
}
[param].tsx для динамических маршрутов,
index.tsx для корневых и вложенных маршрутов.Эта структура делает проект с TanStack Router масштабируемым, легко поддерживаемым и готовым к расширению функционала без перегрузки файловой системы.