TanStack Router предоставляет мощную архитектуру маршрутизации, которая легко расширяется с помощью плагинов и пользовательских расширений. Эти возможности позволяют интегрировать дополнительные функции, управлять состоянием маршрутов, изменять поведение навигации и внедрять кастомную логику без изменения ядра библиотеки.
Плагины в TanStack Router реализуются через
middleware-подобные функции, которые обрабатывают
события роутера на разных этапах жизненного цикла маршрута: навигация,
загрузка данных, рендеринг компонентов. Плагины получают доступ к
объекту router, контексту текущего маршрута и состоянию
навигации.
Основные точки интеграции плагина:
Пример структуры плагина:
const loggingPlugin = {
beforeNavigate: ({ to, cancel }) => {
console.log('Переход на маршрут:', to.path);
if (to.path === '/restricted') cancel();
},
afterNavigate: ({ to }) => {
console.log('Успешно перешли на:', to.path);
},
onError: ({ error }) => {
console.error('Ошибка навигации:', error);
}
};
router.use(loggingPlugin);
TanStack Router позволяет создавать переиспользуемые расширения маршрутов, добавляя к ним пользовательские свойства и методы. Это особенно удобно для реализации авторизации, проверок прав доступа и ленивой загрузки компонентов.
Пример расширения маршрута:
const authRoute = (route) => ({
...route,
beforeLoad: async ({ context, cancel }) => {
const user = await context.getUser();
if (!user.isAuthenticated) cancel('/login');
}
});
const dashboardRoute = authRoute({
path: '/dashboard',
component: Dashboard
});
В этом примере расширение authRoute инкапсулирует логику
проверки авторизации, позволяя использовать её для любого маршрута.
Плагины могут работать с состоянием маршрута, создавая глобальные и локальные состояния, которые автоматически синхронизируются с навигацией. Это подходит для:
Пример глобального состояния:
import { createRouter, RouterState } from '@tanstack/router';
const routerStatePlugin = {
afterNavigate: ({ to, state }) => {
state.set('lastVisited', to.path);
}
};
const state = new RouterState();
const router = createRouter({ routes, state });
router.use(routerStatePlugin);
Плагины часто применяются для управления загрузкой данных перед отображением маршрута. TanStack Router поддерживает промисы и асинхронные функции в хуках плагинов, что позволяет:
Пример плагина для загрузки данных:
const fetchDataPlugin = {
onLoad: async ({ route, context }) => {
try {
const data = await fetch(`/api${route.path}`);
context.setData(route.path, data);
} catch (err) {
console.error('Ошибка загрузки данных:', err);
}
}
};
router.use(fetchDataPlugin);
Плагины позволяют внедрять кастомные стратегии маршрутизации, например:
Пример стратегии ленивой загрузки:
const lazyLoadPlugin = {
beforeNavigate: async ({ to }) => {
if (to.component?.load) {
to.component = await to.component.load();
}
}
};
router.use(lazyLoadPlugin);
Использование плагинов и расширений в TanStack Router:
Эти возможности делают TanStack Router гибкой платформой для построения сложных приложений с динамическими маршрутами и расширяемой логикой навигации.