Universal Router — это гибкая и минималистичная
библиотека маршрутизации для JavaScript, которая позволяет определять
маршруты через объекты и функции. Настройка роутера осуществляется через
опции, передаваемые при создании экземпляра
UniversalRouter. Разбор этих опций позволяет максимально
эффективно использовать возможности маршрутизатора в проектах различной
сложности.
routes — это ключевая опция,
определяющая структуру маршрутов. Она представляет собой массив
объектов, каждый из которых описывает отдельный маршрут. Структура
объекта маршрута может включать следующие свойства:
path — строка с шаблоном пути
(например, /users/:id).action — функция, вызываемая при
совпадении маршрута. Может возвращать значение, промис или результат
рендеринга.children — массив дочерних маршрутов
для вложенной маршрутизации.name — уникальное имя маршрута,
полезное для генерации ссылок.data — произвольные данные, доступные
в action.Пример использования:
import UniversalRouter from 'universal-router';
const routes = [
{
path: '/',
action: () => 'Главная страница'
},
{
path: '/users/:id',
action: ({ params }) => `Пользователь с ID ${params.id}`
},
{
path: '/about',
children: [
{
path: '/team',
action: () => 'Наша команда'
}
]
}
];
const router = new UniversalRouter(routes);
context — объект, который передается в
каждый action маршрута. Используется для хранения общих
данных, сервисов или зависимостей, доступных во всех маршрутах. Это
позволяет избежать импорта общих модулей в каждой функции отдельно.
Пример:
const router = new UniversalRouter(routes, {
context: {
apiClient,
userService
}
});
router.resolve('/users/42').then(result => {
console.log(result); // Использует apiClient и userService внутри action
});
resolveRoute — функция, которая
вызывается для каждого маршрута перед тем, как выполнить его
action. Она позволяет реализовать кастомную логику
сопоставления маршрута или предварительную обработку. Функция получает
объект маршрута, context и параметры.
Пример:
const router = new UniversalRouter(routes, {
resolveRoute: async (route, context, params) => {
if (route.requiresAuth && !context.user.isAuthenticated) {
return '/login';
}
return route;
}
});
Эта опция особенно полезна для проверки прав доступа или редиректов перед выполнением действия маршрута.
errorHandler — функция для обработки
ошибок при разрешении маршрута. Она вызывается, если промис,
возвращаемый action, отклоняется, либо если маршрут не
найден. Это позволяет централизованно управлять ошибками и реализовывать
собственные страницы 404 или страницы ошибок сервера.
Пример:
const router = new UniversalRouter(routes, {
errorHandler: (error, context) => {
if (error.status === 404) {
return 'Страница не найдена';
}
return 'Произошла ошибка на сервере';
}
});
stringifyQuery — функция для
преобразования объекта с параметрами запроса в строку URL. Позволяет
настраивать формат query-параметров, например, использовать собственный
сериализатор или кодировщик.
Пример:
const router = new UniversalRouter(routes, {
stringifyQuery: params => {
return Object.keys(params)
.map(key => `${key}=${encodeURIComponent(params[key])}`)
.join('&');
}
});
matchRoot — булева опция, определяющая,
будет ли роутер пытаться сопоставить маршрут с корнем (/)
при отсутствии явного совпадения. Значение по умолчанию —
true.
const router = new UniversalRouter(routes, { matchRoot: false });
Если установлено false, маршруты будут разрешаться
только при точном совпадении.
baseUrl — базовый URL, который
добавляется к всем маршрутам. Это удобно для приложений, развернутых не
в корне домена. Например, если приложение находится по пути
/app, можно указать baseUrl: '/app', чтобы все
маршруты автоматически строились относительно этого пути.
const router = new UniversalRouter(routes, { baseUrl: '/app' });
Эти опции делают Universal Router максимально гибким и
позволяют строить как простую маршрутизацию для SPA, так и сложные
универсальные маршруты для серверного рендеринга.