Перейти к содержимому

11. Router: введение

Существующие решения (React Router, Next.js Router) были созданы без учёта TypeScript. Параметры маршрутов, поисковые параметры, данные лоадеров — всё это any или требует ручной типизации.

TanStack Router создан с TypeScript в основе: каждый параметр, каждый поисковый параметр, каждое значение лоадера полностью типизированы автоматически.

// Параметры маршрута знают свои типы
const { userId } = Route.useParams()
// userId: string — TypeScript знает это автоматически
// Поисковые параметры типизированы
const { page, filter } = Route.useSearch()
// page: number, filter: string — никаких any!
// Данные лоадера типизированы
const user = Route.useLoaderData()
// user: User — TypeScript выводит тип из queryFn

File-based (рекомендуется):

routes/
__root.tsx → /
index.tsx → /
users/
index.tsx → /users
$userId.tsx → /users/:userId
$userId/
posts.tsx → /users/:userId/posts

Code-based (программный контроль):

const rootRoute = createRootRoute({ component: Root })
const usersRoute = createRoute({ path: '/users', component: Users, getParentRoute: () => rootRoute })
const routeTree = rootRoute.addChildren([usersRoute])

В React Router поисковые параметры — просто строки. В TanStack Router они валидируются схемой:

const Route = createFileRoute('/users')({
validateSearch: (search) => ({
page: Number(search.page) || 1,
filter: String(search.filter || ''),
}),
})
// Теперь useSearch() возвращает { page: number, filter: string }
const Route = createFileRoute('/users/$userId')({
loader: async ({ params }) => {
return fetchUser(params.userId)
},
component: UserPage,
})
function UserPage() {
const user = Route.useLoaderData() // User, не undefined
return <div>{user.name}</div>
}
ФункцияReact Router v6TanStack Router v1
Типизация paramsanyАвтоматическая
Search paramsСтрокиТипизированные с валидацией
ЛоадерыБазовыеТипизированные, с кэшированием
DevtoolsНетВстроенные
Bundle size~50kb~35kb
SSRЧерез RemixЧерез TanStack Start