Для работы с библиотекой Universal Router в среде
CommonJS необходимо использовать синтаксис require, так как
стандартный import поддерживается только в модулях ES.
Основной подход заключается в установке пакета через менеджер npm и
последующем подключении его в коде.
const UniversalRouter = require('universal-router').default;
Обратите внимание на использование .default. Дело в том,
что Universal Router написан с использованием ES Modules. При импорте
через CommonJS объект, экспортированный по умолчанию, помещается в
свойство default.
Для корректного подключения сначала нужно установить пакет:
npm install universal-router
После установки библиотека становится доступной для
require в Node.js или в сборщиках вроде Webpack, которые
поддерживают CommonJS.
Маршруты в Universal Router определяются массивом объектов, где каждый объект описывает путь и обработчик. Пример структуры маршрутов:
const routes = [
{
path: '/',
action: () => 'Главная страница'
},
{
path: '/about',
action: () => 'О нас'
},
{
path: '/users/:id',
action: ({ params }) => `Пользователь с ID: ${params.id}`
}
];
Ключевые моменты:
path может содержать динамические сегменты
(:id), которые Universal Router автоматически разбирает и
передает в объект params.action вызывается при совпадении маршрута и может
возвращать любой результат: строку, объект, Promise.После создания массива маршрутов роутер инициализируется следующим образом:
const router = new UniversalRouter(routes);
Если требуется асинхронная обработка, action может быть
асинхронной функцией:
{
path: '/async',
async action() {
const data = await fetchData();
return data;
}
}
Universal Router корректно обрабатывает промисы и возвращает результат после завершения асинхронных операций.
Для поиска подходящего маршрута и вызова его обработчика используется
метод resolve:
router.resolve('/users/42').then(result => {
console.log(result); // Пользователь с ID: 42
});
Метод resolve принимает строку с URL или объект с полями
pathname и query. Он возвращает промис, что
позволяет работать с асинхронными действиями внутри маршрутов.
router.resolve({ pathname: '/about', query: { ref: 'newsletter' } })
.then(result => console.log(result));
Universal Router поддерживает цепочку действий для маршрута через
свойство before. Оно позволяет выполнять проверку или
подготовку данных перед вызовом action:
const routes = [
{
path: '/dashboard',
before: (context, next) => {
if (!context.user) {
throw new Error('Не авторизован');
}
return next();
},
action: () => 'Панель пользователя'
}
];
Особенности работы с before:
next.Ошибки в Universal Router можно обрабатывать с помощью стандартных
конструкций try/catch или через метод .catch
промиса:
router.resolve('/dashboard')
.then(result => console.log(result))
.catch(error => console.error('Ошибка маршрута:', error.message));
При работе в CommonJS это особенно важно, так как отсутствие обработки промисов приведет к необработанным исключениям в Node.js.
Universal Router передает объект контекста в каждую функцию маршрута.
Контекст может содержать любые данные, необходимые для работы
action или before:
const context = { user: { id: 1, name: 'Alice' } };
router.resolve('/dashboard', { context })
.then(result => console.log(result));
Таким образом, можно легко передавать глобальные параметры, состояние приложения или сервисы в обработчики маршрутов.
npm install universal-router.require с использованием
.default.path и
action.new UniversalRouter(routes).resolve для обработки маршрутов.before для промежуточной логики.try/catch или
.catch.Эта схема позволяет полностью использовать возможности Universal Router в среде CommonJS, включая динамические маршруты, асинхронные действия и контекстные данные.