TanStack Router предоставляет гибкие механизмы управления загрузкой данных и компонентов, обеспечивая высокую производительность и оптимальное взаимодействие с пользователем. Стратегии загрузки определяют, когда и как данные загружаются, а также в каком порядке рендерятся компоненты. Рассмотрим основные подходы и их применение.
TanStack Router поддерживает ленивую загрузку компонентов с помощью динамического импорта. Это позволяет уменьшить первоначальный размер бандла и ускорить время первой отрисовки страницы.
import { createRouter, Route } from '@tanstack/router'
const Home = React.lazy(() => import('./pages/Home'))
const About = React.lazy(() => import('./pages/About'))
const router = createRouter({
routeTree: [
Route({ path: '/', component: Home }),
Route({ path: '/about', component: About }),
],
})
Ключевые моменты:
React.Suspense позволяет показывать
индикатор загрузки.<React.Suspense fallback={<div>Загрузка...</div>}>
<RouterProvider router={router} />
</React.Suspense>
TanStack Router поддерживает стратегию предзагрузки данных для маршрутов, к которым пользователь вероятно перейдет. Это позволяет минимизировать задержки при навигации.
const productRoute = Route({
path: '/product/:id',
loader: async ({ params }) => {
const response = await fetch(`/api/products/${params.id}`)
return response.json()
},
})
Методы предзагрузки:
<Link
to="/product/123"
onMouseEn ter={() => router.prefetchRoute('/product/123')}
>
Подробнее
</Link>
Для страниц с большим объемом данных TanStack Router позволяет реализовать постепенную загрузку. Вместо ожидания полного ответа API, данные могут рендериться частями.
const commentsRoute = Route({
path: '/post/:id/comments',
loader: async ({ params, signal }) => {
const stream = await fetch(`/api/posts/${params.id}/comments/stream`, { signal })
return stream.body
},
})
Особенности:
AbortController для отмены загрузки при
уходе со страницы.Suspense и
React.lazy для постепенного отображения блоков
интерфейса.TanStack Router интегрируется с TanStack Query для управления состоянием данных. Это позволяет использовать кэширование и мемоизацию запросов, чтобы повторные переходы к маршруту выполнялись мгновенно.
import { useQuery } from '@tanstack/react-query'
const loader = async ({ params }) => {
return useQuery(['product', params.id], () =>
fetch(`/api/products/${params.id}`).then(res => res.json())
)
}
Преимущества:
staleTime), позволяющее
контролировать актуальность данных.Для сложных приложений часто применяется сочетание разных стратегий:
const dashboardRoute = Route({
path: '/dashboard',
component: React.lazy(() => import('./pages/Dashboard')),
loader: async () => {
const criticalData = await fetch('/api/critical').then(res => res.json())
return { criticalData }
},
})
Рекомендации по использованию гибридных стратегий:
TanStack Router позволяет безопасно отменять загрузку данных при смене маршрута, что предотвращает устаревшие рендеры и утечки памяти.
const userRoute = Route({
path: '/user/:id',
loader: async ({ params, signal }) => {
const response = await fetch(`/api/users/${params.id}`, { signal })
return response.json()
},
})
Принцип работы:
signal из AbortController.Для улучшения скорости загрузки и рендеринга компонентов используются следующие подходы:
Эти стратегии позволяют строить эффективные, отзывчивые приложения, минимизировать время ожидания пользователя и контролировать загрузку ресурсов на каждом маршруте TanStack Router.