TanStack Router предоставляет мощные возможности маршрутизации, включая декларативные маршруты, динамические сегменты и вложенные структуры. Для интеграции с Next.js первым шагом является установка пакета:
npm install @tanstack/router
После установки создается основной файл конфигурации маршрутизатора,
например router.ts, где описываются маршруты и их
структура.
import { createRouter, route } from '@tanstack/router'
const rootRoute = route({
path: '/',
component: RootLayout,
})
const aboutRoute = route({
path: '/about',
component: AboutPage,
})
export const router = createRouter({
routeTree: rootRoute.addChildren([aboutRoute])
})
Главная особенность интеграции с Next.js заключается в использовании
TanStack Router в сочетании с системой серверного рендеринга (SSR) и
маршрутизацией страниц. Для этого маршрутизатор оборачивается в
компонент в
_app.tsx:
import { RouterProvider } from '@tanstack/router'
import { router } from '../router'
export default function App({ Component, pageProps }) {
return
}
TanStack Router поддерживает динамические сегменты, что позволяет строить маршруты с параметрами:
const userRoute = route({
path: '/users/$userId',
component: UserPage,
loader: async ({ params }) => {
const response = await fetch(`/api/users/${params.userId}`)
return response.json()
},
})
В Next.js динамические сегменты соответствуют [param] в
файловой структуре страниц, однако TanStack Router позволяет управлять
ими декларативно и извлекать данные через loader.
Вложенные маршруты создаются с помощью метода
addChildren, что упрощает создание многоуровневых
интерфейсов. Например:
const dashboardRoute = route({
path: '/dashboard',
component: DashboardLayout,
})
const dashboardAnalyticsRoute = route({
path: 'analytics',
component: AnalyticsPage,
})
dashboardRoute.addChildren([dashboardAnalyticsRoute])
Внутри Next.js это позволяет использовать Outlet для
рендеринга дочерних компонентов в родительском layout:
import { Outlet } from '@tanstack/router'
export function DashboardLayout() {
return (
)
}
TanStack Router поддерживает предзагрузку данных с помощью
loader, что идеально подходит для SSR в Next.js:
export async function getServerSideProps(context) {
const data = await router.load({
url: context.resolvedUrl
})
return { props: { data } }
}
Это позволяет полностью синхронизировать состояние маршрутов с серверной логикой, обеспечивая быструю загрузку страниц и корректный рендеринг на стороне сервера.
Навигация осуществляется через хук useRouter:
import { useRouter } from '@tanstack/router'
function NavButton() {
const router = useRouter()
return (
)
}
useRouter предоставляет методы navigate,
back, reload и доступ к текущим параметрам
маршрута, что упрощает работу с динамическим контентом и состоянием
URL.
Для обработки ошибок TanStack Router использует
errorComponent на уровне маршрута:
const errorRoute = route({
path: '*',
component: ErrorPage,
})
Это обеспечивает единый механизм обработки несуществующих маршрутов и ошибок загрузки данных, интегрируясь с Next.js Error Boundaries.
TanStack Router может работать в связке с API-роутами Next.js. Например, для страницы пользователей:
export async function loader({ params }) {
const res = await fetch(`/api/users/${params.userId}`)
if (!res.ok) throw new Error('User not found')
return res.json()
}
В Next.js API-роуты остаются стандартными, но TanStack Router обеспечивает единый интерфейс загрузки данных и управление состоянием маршрутов.
TanStack Router полностью совместим с getServerSideProps
и getStaticProps. С помощью router.load можно
получать данные для статической генерации страниц:
export async function getStaticProps() {
const data = await router.load({ url: '/dashboard/analytics' })
return { props: { data } }
}
Это позволяет использовать преимущества маршрутизатора без потери возможностей статической оптимизации Next.js.
TanStack Router поддерживает перехват навигации через
beforeLoad или глобальные middleware:
router.beforeLoad(({ params }) => {
if (!isAuthenticated()) {
return router.navigate('/login')
}
})
Это обеспечивает защиту маршрутов, аналогичную
getServerSideProps или middleware в Next.js,
но с декларативным синтаксисом внутри самого маршрутизатора.
TanStack Router хранит состояние маршрута, что позволяет
синхронизировать UI с URL без лишнего хука useState:
const { params, route } = useRouter().current
Параметры, query и состояние loader автоматически доступны на каждом уровне вложенного маршрута, упрощая построение сложных интерфейсов с зависимыми данными.