TanStack Router предоставляет мощный механизм маршрутизации для современных приложений на JavaScript и TypeScript. Эффективное управление маршрутизацией требует не только правильного построения маршрутов, но и мониторинга их производительности. Профилирование роутинга позволяет выявлять узкие места, измерять время рендеринга компонентов и оптимизировать переходы между страницами.
При работе с TanStack Router следует учитывать несколько ключевых показателей:
loaders, которые могут быть узким
местом, если они выполняют тяжёлые вычисления или сетевые запросы.loader при навигации.Для измерения этих показателей используется комбинация встроенных инструментов браузера, сторонних библиотек и API TanStack Router.
Навигационные хуки
TanStack Router предоставляет хук useNavigation для
отслеживания состояния текущей навигации. Он возвращает объект с
полями:
const navigation = useNavigation();
console.log(navigation.state); // idle | loading | submitting
console.log(navigation.location); // текущее состояние URL
С помощью этого хука можно фиксировать время начала и завершения загрузки маршрута.
Асинхронные loaders с метриками
Любой маршрут может определять loader:
const userLoader = async ({ params }) => {
const start = performance.now();
const response = await fetch(`/api/users/${params.id}`);
const data = await response.json();
const duration = performance.now() - start;
console.log(`Loader для /users/${params.id} занял ${duration}ms`);
return data;
};
Использование performance.now() позволяет точно измерять
время выполнения загрузки данных.
ErrorBoundary и статус загрузки
ErrorBoundary можно комбинировать с профилированием, чтобы фиксировать время, потраченное на успешный рендер или на обработку ошибок:
<Route
path="/users/:id"
element={<UserPage />}
loader={userLoader}
errorElement={<UserError />}
/>
Внутри компонента UserError можно измерять, сколько
времени прошло с момента начала навигации до возникновения
ошибки.
Для глубокого анализа производительности TanStack Router удобно использовать:
loader и эффекты
компонентов.onLoad и onError хуки маршрутов для построения
временных диаграмм.Пример интеграции с React Profiler:
import { Profiler } from 'react';
<Profiler id="UserPage" onRen der={(id, phase, actualDuration) => {
console.log(`${id} рендер ${phase} занял ${actualDuration}ms`);
}}>
<UserPage />
</Profiler>
Профилирование помогает выявлять узкие места и улучшать производительность:
React.lazy() и Suspense для крупных страниц
уменьшает время первоначальной загрузки.loader можно сохранять в глобальном
кэше, чтобы избежать повторных сетевых запросов.defer и
streaming — TanStack Router поддерживает
отложенную загрузку частей данных для ускорения рендеринга критического
контента.const userLoader = async ({ params }) => {
const start = performance.now();
try {
const response = await fetch(`/api/users/${params.id}`);
if (!response.ok) throw new Error('Failed to fetch');
const data = await response.json();
return data;
} finally {
const duration = performance.now() - start;
console.log(`Loader для /users/${params.id} занял ${duration.toFixed(2)}ms`);
}
};
const routes = createRoutes([
{
path: "/users/:id",
element: (
<Profiler id="UserPage" onRen der={(id, phase, duration) => {
console.log(`${id} ${phase} рендер занял ${duration.toFixed(2)}ms`);
}}>
<UserPage />
</Profiler>
),
loader: userLoader,
},
]);
Такой подход обеспечивает полную видимость времени загрузки и рендеринга маршрута, позволяя принимать обоснованные решения по оптимизации.
performance.now()) вместо Date.now() для
большей точности.Профилирование TanStack Router позволяет выявлять узкие места на уровне загрузки данных, рендеринга компонентов и навигационных переходов, обеспечивая плавный пользовательский опыт и высокую производительность приложения.