Universal Router — это легковесная и гибкая библиотека для маршрутизации в JavaScript, позволяющая управлять навигацией как на клиенте, так и на сервере. Для работы с библиотекой необходимо понимать структуру маршрутов и способы их обработки.
Для начала работы необходимо установить пакет и подключить его в проект:
import UniversalRouter from 'universal-router';
const routes = [];
const router = new UniversalRouter(routes);
routes — массив объектов, каждый из которых описывает
путь и логику обработки.router — экземпляр маршрутизатора, через который
происходит разрешение маршрутов.Каждый маршрут представляет собой объект с обязательным полем
path и функцией action. Функция
action вызывается, когда путь маршрута совпадает с текущим
URL.
const routes = [
{
path: '/home',
action: () => 'Главная страница'
}
];
const router = new UniversalRouter(routes);
router.resolve('/home').then(result => {
console.log(result); // 'Главная страница'
});
Ключевые моменты:
path поддерживает как статические строки
('/home'), так и динамические сегменты
('/user/:id').action может возвращать строку, объект, Promise или
выполнять асинхронные операции.Для создания маршрутов с параметрами используют двоеточие перед именем переменной:
const routes = [
{
path: '/user/:id',
action: ({ params }) => `Пользователь с ID: ${params.id}`
}
];
const router = new UniversalRouter(routes);
router.resolve('/user/42').then(result => {
console.log(result); // 'Пользователь с ID: 42'
});
params, передаваемый в
функцию action./post/:postId/comment/:commentId.Universal Router поддерживает вложенность маршрутов, что позволяет организовать сложные структуры приложения:
const routes = [
{
path: '/dashboard',
action: () => 'Панель управления',
children: [
{
path: '/stats',
action: () => 'Статистика'
},
{
path: '/settings',
action: () => 'Настройки'
}
]
}
];
const router = new UniversalRouter(routes);
router.resolve('/dashboard/stats').then(result => console.log(result)); // 'Статистика'
Особенности вложенности:
action, она может быть
вызвана до или после дочерней в зависимости от логики
маршрутизатора.children и
могут иметь собственные динамические сегменты.Для перехвата запросов к несуществующим путям используют специальный
маршрут с path: '(.*)':
const routes = [
{
path: '/home',
action: () => 'Главная'
},
{
path: '(.*)',
action: () => 'Страница не найдена'
}
];
const router = new UniversalRouter(routes);
router.resolve('/unknown').then(result => console.log(result)); // 'Страница не найдена'
(.*) захватывает любой путь, который не был
сопоставлен с другими маршрутами.Функция action может быть асинхронной, что позволяет,
например, загружать данные с сервера перед отображением страницы:
const routes = [
{
path: '/profile/:id',
async action({ params }) {
const user = await fetch(`https://api.example.com/users/${params.id}`).then(res => res.json());
return `Профиль пользователя: ${user.name}`;
}
}
];
const router = new UniversalRouter(routes);
router.resolve('/profile/7').then(result => console.log(result));
resolve всегда возвращает Promise, что делает маршруты
универсальными для синхронных и асинхронных операций.Каждый маршрут включает в себя несколько ключевых элементов:
path — путь маршрута, поддерживающий
динамические сегменты.action — функция обработки маршрута,
может быть асинхронной.children — массив вложенных маршрутов
для организации иерархии.params — объект с параметрами пути,
передаваемый в action.Эта структура позволяет создавать гибкую и мощную маршрутизацию, легко масштабируемую под проекты любого размера.