В TanStack Router предзагрузка данных и компонентов является ключевым инструментом для оптимизации производительности приложений. Предзагрузка позволяет загружать ресурсы заранее, снижая время ожидания пользователя при навигации между маршрутами. Основная задача стратегий предзагрузки — уменьшить задержки при рендеринге, особенно в сложных SPA-приложениях с динамическими данными.
TanStack Router поддерживает несколько подходов к предзагрузке:
1.1. loader Loader-функции используются
для асинхронной загрузки данных на уровне маршрута. Они выполняются до
рендеринга компонента, что позволяет получить все необходимые данные
заранее. Пример использования:
import { createRouter, createRouteConfig } from '@tanstack/router';
const usersRoute = createRouteConfig()
.path('/users')
.loader(async () => {
const response = await fetch('/api/users');
return response.json();
});
Ключевые моменты:
1.2. defer Функция defer
позволяет загружать данные параллельно с рендерингом, возвращая
Promise, который может быть использован компонентом позже.
Это особенно полезно для тяжелых ресурсов, которые не критичны для
первоначального рендеринга.
import { defer } from '@tanstack/router';
const postsRoute = createRouteConfig()
.path('/posts')
.loader(() => {
return defer({
posts: fetch('/api/posts').then(res => res.json())
});
});
Особенности defer:
1.3. preload Метод preload
позволяет заранее инициировать загрузку маршрута и его данных, даже если
пользователь ещё не перешел на него. Это особенно эффективно для
прогнозируемой навигации.
usersRoute.preload();
Преимущества использования preload:
TanStack Router позволяет строить стратегии предзагрузки, учитывая пользовательское поведение и состояние приложения.
2.1. Предзагрузка на hover Можно инициировать загрузку маршрута при наведении курсора на ссылку:
<Link
to="/users"
onMouseEn ter={() => usersRoute.preload()}
>
Пользователи
</Link>
2.2. Предзагрузка при idle Использование API
requestIdleCallback позволяет загружать данные, когда
браузер не занят:
requestIdleCallback(() => {
usersRoute.preload();
});
2.3. Приоритетная предзагрузка Маршруты можно ранжировать по приоритету, загружая сначала критические ресурсы, а затем менее важные.
Предзагрузка становится максимально эффективной при использовании кеша. TanStack Router позволяет интегрировать предзагруженные данные с React Query или другими библиотеками кеширования:
import { queryClient } from './queryClient';
usersRoute.loader = async () => {
return queryClient.fetchQuery('users', () =>
fetch('/api/users').then(res => res.json())
);
};
Эффекты интеграции с кешем:
preload ускоряет переходы и уменьшает
нагрузку на сервер.TanStack Router поддерживает ленивую загрузку компонентов с помощью
React.lazy и позволяет предварительно загружать их с
помощью preload.
import { lazy } from 'react';
const UsersPage = lazy(() => import('./UsersPage'));
// Предзагрузка компонента заранее
UsersPage.preload?.();
Особенности:
loader и defer для полной
оптимизации.loader для критичных данных, необходимых
для начального рендера.defer для второстепенных данных, которые
можно загрузить после отображения UI.preload для маршрутов с высокой
вероятностью перехода.Стратегии предзагрузки в TanStack Router позволяют тонко управлять временем загрузки данных и компонентов, обеспечивая баланс между быстродействием приложения и эффективностью использования ресурсов. Они образуют фундамент для построения современных SPA с отзывчивым интерфейсом и минимальной задержкой навигации.