Prefetching — это механизм предварительной загрузки данных и компонентов для маршрутов до их фактической активации. В TanStack Router он позволяет значительно улучшить производительность приложений, минимизируя задержки при переходе между страницами и обеспечивая плавный пользовательский опыт.
Prefetching в TanStack Router строится на следующих ключевых моментах:
Загрузка данных заранее Любой маршрут может
иметь асинхронный загрузчик данных (loader). Prefetching
позволяет вызвать этот loader до того, как пользователь
перейдет на маршрут. Это обеспечивает мгновенное отображение данных при
навигации.
Динамическая подгрузка компонентов Если маршрут
использует ленивую загрузку компонента через React.lazy или
аналог, prefetching инициирует загрузку бандла заранее, снижая
perceptual delay при рендере.
Кэширование результатов TanStack Router хранит результаты prefetching, чтобы при фактическом переходе не выполнять повторно те же асинхронные операции.
Каждый маршрут может иметь опцию preload или
prefetch. Основная схема:
import { createRouter, Route } from '@tanstack/router';
import { lazy } from 'react';
const Home = lazy(() => import('./Home'));
const router = createRouter({
routeTree: Route({
path: '/',
component: Home,
loader: async () => {
const response = await fetch('/api/home');
return response.json();
},
prefetch: 'intent' // 'hover' | 'intent' | 'visible'
}),
});
Опции prefetching:
hover — загрузка данных и компонентов при наведении
курсора на ссылку маршрута.intent — предзагрузка при явном намерении пользователя
перейти (например, нажатие клавиши Tab для фокусировки).visible — загрузка при появлении ссылки в зоне
видимости (IntersectionObserver).useMatchRoute для управления prefetchingTanStack Router позволяет получать состояние маршрута через хук
useMatchRoute. Это удобно для программного контроля
prefetching:
import { useMatchRoute, useRouter } from '@tanstack/router';
function PrefetchLink({ to, children }) {
const router = useRouter();
const match = useMatchRoute(to);
const handleMouseEnter = () => {
if (match) {
router.prefetchRoute(to);
}
};
return (
<a href={to} onMouseEn ter={handleMouseEnter}>
{children}
</a>
);
}
Такой подход позволяет вручную инициировать prefetching только для маршрутов, которые действительно важны для пользовательского пути.
Для маршрутов с loader prefetching работает следующим
образом:
loader.loader.router.state.Пример с асинхронным API:
const dashboardRoute = Route({
path: '/dashboard',
loader: async () => {
const res = await fetch('/api/dashboard');
if (!res.ok) throw new Error('Ошибка загрузки данных');
return res.json();
},
prefetch: 'hover',
});
Для ленивых компонентов prefetching позволяет уменьшить perceptual delay:
const Reports = lazy(() => import('./Reports'));
const reportsRoute = Route({
path: '/reports',
component: Reports,
prefetch: 'visible',
});
TanStack Router автоматически инициирует загрузку компонента при срабатывании триггера prefetch.
hover, intent,
visible). Баланс между производительностью и экономией
ресурсов.TanStack Router использует внутренний кэш для prefetching:
router.clearPrefetchCache() или
router.reloadRoute(routeId).intent или visible, чтобы не
перегружать сеть.hover
и loader prefetching для мгновенного отображения.Prefetching маршрутов в TanStack Router снижает latency при переходах, повышает отзывчивость интерфейса и улучшает пользовательский опыт. Оптимальная стратегия зависит от размера приложения, сетевой нагрузки и характера пользовательских действий.
Хотите, я могу подготовить подробную схему схему потоков данных prefetching с визуализацией кэша и асинхронных loader’ов, чтобы наглядно показать, как это работает внутри TanStack Router?