Статические пути

Статические пути в Universal Router представляют собой маршруты, которые точно совпадают с указанным URL. Они не содержат динамических сегментов, параметров или регулярных выражений. Такой тип маршрутов используется для страниц с фиксированными адресами, например /about, /contact или /home.

Пример определения статического маршрута:

import UniversalRouter from 'universal-router';

const routes = [
  {
    path: '/about',
    action: () => 'Страница О нас'
  },
  {
    path: '/contact',
    action: () => 'Страница Контакты'
  }
];

const router = new UniversalRouter(routes);

router.resolve('/about').then(result => console.log(result)); // "Страница О нас"
router.resolve('/contact').then(result => console.log(result)); // "Страница Контакты"

В этом примере path задаётся как строка без каких-либо переменных. Universal Router сравнивает URL запроса с точной строкой path и вызывает соответствующую функцию action.


Особенности маршрутов с конечными слешами

Universal Router различает пути с и без завершающего слеша.

  • /about и /about/ считаются разными маршрутами.
  • Чтобы сделать маршрут независимым от завершающего слеша, можно использовать опцию strict: false при создании маршрута:
const routes = [
  {
    path: '/about',
    strict: false,
    action: () => 'Страница О нас'
  }
];

С strict: false один маршрут будет совпадать как с /about, так и с /about/.


Вложенные статические маршруты

Статические маршруты можно вкладывать друг в друга, создавая дерево маршрутов. Это удобно для организации страниц с общей базой URL.

const routes = [
  {
    path: '/dashboard',
    action: () => 'Главная панель',
    children: [
      {
        path: '/stats',
        action: () => 'Статистика'
      },
      {
        path: '/settings',
        action: () => 'Настройки'
      }
    ]
  }
];

const router = new UniversalRouter(routes);

router.resolve('/dashboard/stats').then(console.log); // "Статистика"
router.resolve('/dashboard/settings').then(console.log); // "Настройки"

При вложении Universal Router автоматически объединяет пути родителей и детей, создавая полный путь.


Приоритет совпадения статических маршрутов

Universal Router проверяет маршруты по порядку их определения. Статические пути всегда имеют высокий приоритет перед динамическими.

const routes = [
  { path: '/user/:id', action: () => 'Профиль пользователя' },
  { path: '/user/admin', action: () => 'Админская панель' }
];

const router = new UniversalRouter(routes);

router.resolve('/user/admin').then(console.log); // "Профиль пользователя"

В приведённом примере /:id сработает первым, так как определяется раньше конкретного пути /user/admin. Чтобы изменить поведение, статические маршруты следует располагать выше динамических:

const routes = [
  { path: '/user/admin', action: () => 'Админская панель' },
  { path: '/user/:id', action: () => 'Профиль пользователя' }
];

router.resolve('/user/admin').then(console.log); // "Админская панель"

Обработка ошибок при несоответствии маршрута

Если ни один статический маршрут не совпадает с URL, Universal Router возвращает undefined или можно настроить маршрут по умолчанию с помощью '*':

const routes = [
  { path: '/home', action: () => 'Главная' },
  { path: '*', action: () => '404 Страница не найдена' }
];

router.resolve('/unknown').then(console.log); // "404 Страница не найдена"

Маршрут с '*' работает как catch-all и обрабатывает все URL, которые не подходят под статические пути.


Советы по использованию статических маршрутов

  • Размещать наиболее часто используемые статические маршруты выше в массиве для ускорения разрешения.
  • Использовать strict: false для маршрутов, где не критично наличие или отсутствие завершающего слеша.
  • Вложенные маршруты упрощают организацию больших приложений с иерархией страниц.
  • Обязательно предусматривать маршрут '*' для обработки неопределённых URL, чтобы избежать ошибок при навигации.

Статические пути — фундаментальная часть маршрутизации в Universal Router, обеспечивающая точное совпадение URL и быстрый доступ к конкретным страницам без необходимости парсинга параметров.