Для начала интеграции TanStack Router в проект на Vite необходимо создать новый проект или использовать существующий. Vite обеспечивает быстрый старт и поддерживает современные стандарты ES-модулей, что идеально подходит для работы с TanStack Router.
npm create vite@latest my-app --template react
cd my-app
npm install
npm install @tanstack/router
После установки TanStack Router необходимо создать базовую структуру
маршрутов. Основная единица маршрутизации — объект Route. В
Vite и React это делается через компонент RouterProvider и
конфигурацию маршрутов.
Маршруты описываются с помощью объектов, где ключевыми свойствами
являются path, component и
children. Пример базового маршрута:
import { createRouter, RouterProvider, Route } from '@tanstack/router';
import Home from './pages/Home';
import About from './pages/About';
const router = createRouter({
routeTree: Route({
path: '/',
component: () => <Home />,
children: [
Route({
path: 'about',
component: () => <About />
})
]
})
});
export default function App() {
return <RouterProvider router={router} />;
}
Ключевые моменты:
Route может содержать дочерние маршруты через
children.component.createRouter, который
передается в RouterProvider.TanStack Router поддерживает динамические сегменты пути, что позволяет создавать маршруты с параметрами:
const router = createRouter({
routeTree: Route({
path: '/users/:userId',
component: ({ params }) => <UserProfile userId={params.userId} />
})
});
:userId — динамический сегмент.params.Для оптимизации загрузки больших приложений рекомендуется
использовать ленивую загрузку компонентов с React.lazy:
import { Route, createRouter, RouterProvider } from '@tanstack/router';
import { Suspense, lazy } from 'react';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const router = createRouter({
routeTree: Route({
path: '/',
component: () => (
<Suspense fallback={<div>Загрузка...</div>}>
<Home />
</Suspense>
),
children: [
Route({
path: 'about',
component: () => (
<Suspense fallback={<div>Загрузка...</div>}>
<About />
</Suspense>
)
})
]
})
});
Для программной навигации используется хук
useNavigate:
import { useNavigate } from '@tanstack/router';
function Header() {
const navigate = useNavigate();
return (
<nav>
<button onCl ick={() => navigate('/')}>Главная</button>
<button onCl ick={() => navigate('/about')}>О нас</button>
</nav>
);
}
navigate(path) изменяет текущий маршрут.TanStack Router интегрирует управление query-параметрами через объект
search:
const router = createRouter({
routeTree: Route({
path: '/products',
component: ({ search }) => {
const category = search.category || 'all';
return <Products category={category} />;
}
})
});
search.TanStack Router полностью совместим с Hot Module Replacement (HMR)
Vite. При изменении кода маршруты автоматически обновляются без
перезагрузки страницы. Для корректной работы нужно использовать
RouterProvider на верхнем уровне приложения, чтобы весь
роутер обновлялся при HMR:
import { createRoot } from 'react-dom/client';
import App from './App';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
В крупных проектах рекомендуется структурировать маршруты в отдельной
папке, например src/routes, и экспортировать их через
индексный файл:
src/
└─ routes/
├─ index.js
├─ Home.js
├─ About.js
└─ Users.js
index.js может выглядеть так:
import Home from './Home';
import About from './About';
import Users from './Users';
import { Route } from '@tanstack/router';
export const routeTree = Route({
path: '/',
component: Home,
children: [
Route({ path: 'about', component: About }),
Route({ path: 'users/:userId', component: Users })
]
});
Затем роутер подключается в App.js:
import { createRouter, RouterProvider } from '@tanstack/router';
import { routeTree } from './routes';
const router = createRouter({ routeTree });
export default function App() {
return <RouterProvider router={router} />;
}
TanStack Router полностью поддерживает TypeScript, позволяя типизировать параметры маршрутов и query-параметры:
type UserParams = {
userId: string;
};
const userRoute = Route<{ params: UserParams }>({
path: '/users/:userId',
component: ({ params }) => {
const { userId } = params;
return <UserProfile userId={userId} />;
}
});
TanStack Router совместим с быстрым стартом Vite, поддерживает
динамические маршруты, lazy loading и полноценную типизацию. Правильная
структура файлов и использование хуков useNavigate,
search и params обеспечивает чистую
архитектуру маршрутизации и простоту масштабирования приложения.