TanStack Router предоставляет гибкую систему маршрутизации для современных веб-приложений на JavaScript и TypeScript. Одной из важных задач при работе с этим инструментом является структурирование и визуализация дерева маршрутов, что упрощает понимание вложенных маршрутов и их взаимосвязей.
Маршруты в TanStack Router описываются в виде иерархии объектов, каждый из которых представляет отдельный путь приложения. Базовая структура маршрута выглядит следующим образом:
import { createRouter, Route } from '@tanstack/router';
const rootRoute = new Route({
path: '/',
component: RootComponent,
children: [
new Route({
path: 'dashboard',
component: DashboardComponent,
}),
new Route({
path: 'settings',
component: SettingsComponent,
children: [
new Route({
path: 'profile',
component: ProfileComponent,
}),
new Route({
path: 'security',
component: SecurityComponent,
}),
],
}),
],
});
const router = createRouter({ routeTree: rootRoute });
Ключевые моменты структуры:
path — путь маршрута относительно родителя.component — React-компонент, который рендерится при
совпадении маршрута.children — массив вложенных маршрутов, создающий
иерархию.Для удобства понимания структуры маршрутов часто применяют графическое или текстовое представление дерева. Рассмотрим несколько подходов:
Самый простой способ — вывести дерево маршрутов в консоль с помощью рекурсивной функции:
function printRoutes(route, prefix = '') {
console.log(`${prefix}${route.path}`);
if (route.children) {
route.children.forEach(child => printRoutes(child, `${prefix} `));
}
}
printRoutes(rootRoute);
Вывод будет выглядеть как текстовое дерево:
/
dashboard
settings
profile
security
Такой метод позволяет быстро увидеть иерархию без дополнительных библиотек.
Для больших приложений текстовое дерево может быть неудобным. Более наглядным будет использование визуальных графических библиотек, например, D3.js или React Flow, чтобы отобразить маршруты как граф:
import { Graph } from 'react-d3-graph';
const data = {
nodes: [
{ id: '/' },
{ id: '/dashboard' },
{ id: '/settings' },
{ id: '/settings/profile' },
{ id: '/settings/security' },
],
links: [
{ source: '/', target: '/dashboard' },
{ source: '/', target: '/settings' },
{ source: '/settings', target: '/settings/profile' },
{ source: '/settings', target: '/settings/security' },
],
};
Такой подход позволяет:
Для поддержки динамически создаваемых маршрутов или большого количества вложенных роутов полезно генерировать дерево автоматически:
function generateGraphData(route, parentPath = '') {
const fullPath = parentPath + route.path;
const nodes = [{ id: fullPath }];
const links = [];
if (route.children) {
route.children.forEach(child => {
const childData = generateGraphData(child, fullPath + '/');
nodes.push(...childData.nodes);
links.push({ source: fullPath, target: fullPath + '/' + child.path }, ...childData.links);
});
}
return { nodes, links };
}
const graphData = generateGraphData(rootRoute);
Такой метод позволяет интегрировать автогенерацию визуализации в реальном времени, что особенно полезно для крупных приложений с динамической маршрутизацией.
/user/:id) можно отображать с подстановочными значениями
или как отдельные узлы, чтобы сохранить читаемость дерева.В результате, визуализация дерева маршрутов в TanStack Router становится не только инструментом понимания структуры приложения, но и важным средством поддержки масштабируемости и читаемости кода.