Lazy loading в TanStack Router позволяет загружать компоненты маршрутов по требованию, что снижает первоначальный размер бандла и ускоряет время первого рендера приложения. Основная идея заключается в том, чтобы импортировать компонент только тогда, когда пользователь переходит на соответствующий маршрут.
React.lazy и SuspenseВ TanStack Router можно интегрировать стандартные возможности React для ленивой загрузки компонентов:
import React, { Suspense } from 'react';
import { RouterProvider, createRouter, Route } from '@tanstack/router';
const Home = React.lazy(() => import('./pages/Home'));
const About = React.lazy(() => import('./pages/About'));
const router = createRouter({
routeConfig: [
{
path: '/',
component: () => (
<Suspense fallback={<div>Загрузка...</div>}>
<Home />
</Suspense>
),
},
{
path: '/about',
component: () => (
<Suspense fallback={<div>Загрузка...</div>}>
<About />
</Suspense>
),
},
],
});
export default function App() {
return <RouterProvider router={router} />;
}
Ключевые моменты:
React.lazy возвращает компонент, который React
загружает асинхронно.Suspense обеспечивает отображение fallback-контента,
пока компонент загружается.<Suspense>
для контроля загрузки именно этого компонента.TanStack Router предоставляет API для более «родного» подхода к
ленивой загрузке через свойства маршрута getComponent. Это
позволяет создавать маршруты, которые подгружают свои компоненты только
при необходимости.
import { createRouter, RouterProvider } from '@tanstack/router';
const router = createRouter({
routeConfig: [
{
path: '/',
getComponent: async () => {
const module = await import('./pages/Home');
return module.default;
},
},
{
path: '/about',
getComponent: async () => {
const module = await import('./pages/About');
return module.default;
},
},
],
});
export default function App() {
return <RouterProvider router={router} />;
}
Особенности getComponent:
<Suspense> вручную.Для асинхронных компонентов необходимо предусматривать обработку ошибок загрузки:
const ErrorBoundary = ({ error }) => (
<div>Ошибка при загрузке: {error.message}</div>
);
const router = createRouter({
routeConfig: [
{
path: '/dashboard',
getComponent: async () => {
try {
const module = await import('./pages/Dashboard');
return module.default;
} catch (error) {
return () => <ErrorBoundary error={error} />;
}
},
},
],
});
Рекомендации:
<Suspense> для показа
индикатора загрузки, пока идет асинхронный импорт.TanStack Router поддерживает ленивую загрузку даже для вложенных маршрутов. Это особенно полезно для крупных секций приложения, например, административной панели.
const router = createRouter({
routeConfig: [
{
path: '/admin',
getComponent: async () => {
const module = await import('./pages/admin/AdminLayout');
return module.default;
},
children: [
{
path: 'users',
getComponent: async () => {
const module = await import('./pages/admin/Users');
return module.default;
},
},
{
path: 'settings',
getComponent: async () => {
const module = await import('./pages/admin/Settings');
return module.default;
},
},
],
},
],
});
Важные моменты:
preload для
ускорения переходов по часто используемым маршрутам.Для улучшения UX и уменьшения времени ожидания переходов можно
использовать метод preload:
const AboutRoute = {
path: '/about',
getComponent: async () => {
const module = await import('./pages/About');
return module.default;
},
};
AboutRoute.preload(); // инициирует загрузку заранее
Преимущества предзагрузки:
getComponent вместо
статического импорта.Suspense и ErrorBoundary для
управления состояниями загрузки и ошибок.Эти подходы обеспечивают гибкость, оптимизацию загрузки и структурированное управление маршрутами в больших приложениях на React с использованием TanStack Router.