Плагины и расширения

Navigo предоставляет минималистичный роутер, но его функциональность можно значительно расширить с помощью плагинов. Плагин — это модуль, который внедряет дополнительное поведение в роутер без изменения его внутреннего кода. Плагины могут обрабатывать события маршрутизации, добавлять middleware, реализовывать аутентификацию, логирование или интеграцию с другими библиотеками.

В основе работы плагинов лежит метод use, который позволяет зарегистрировать плагин в экземпляре роутера:

import Navigo from 'navigo';

const router = new Navigo('/');
router.use(myPlugin, {option1: true, option2: 'value'});

Здесь myPlugin — это функция, принимающая два аргумента: экземпляр роутера и объект с настройками плагина. Такой подход позволяет централизованно управлять поведением всех маршрутов.


Создание собственного плагина

Структура плагина обычно включает:

  1. Регистрацию обработчиков событий: подписка на изменения URL или события маршрутизации.
  2. Взаимодействие с роутером: добавление новых методов или расширение существующих.
  3. Настройки конфигурации: возможность передачи параметров при подключении плагина.

Пример простого плагина для логирования переходов между маршрутами:

function loggerPlugin(router, options) {
    router.hooks({
        before: (done, params) => {
            if (options.logBefore) {
                console.log('Переход начинается на маршрут:', params.route);
            }
            done();
        },
        after: (params) => {
            if (options.logAfter) {
                console.log('Переход завершён на маршрут:', params.route);
            }
        }
    });
}

const router = new Navigo('/');
router.use(loggerPlugin, {logBefore: true, logAfter: true});

В этом примере плагин использует хуки before и after для логирования действий. Этот подход демонстрирует, как плагин может внедрять функциональность, не затрагивая основной код приложения.


Middleware через плагины

Плагины в Navigo позволяют реализовать middleware — промежуточную обработку запросов перед вызовом целевого маршрута. Это удобно для проверки прав доступа, предзагрузки данных или реализации редиректов.

function authPlugin(router, options) {
    router.hooks({
        before: (done, params) => {
            if (!options.isAuthenticated()) {
                router.navigate('/login');
            } else {
                done();
            }
        }
    });
}

const router = new Navigo('/');
router.use(authPlugin, {isAuthenticated: () => !!localStorage.getItem('token')});

Здесь плагин проверяет, авторизован ли пользователь, и перенаправляет на страницу входа, если проверка не пройдена. Middleware через плагины интегрируются напрямую с роутером, что делает их мощным инструментом управления маршрутизацией.


Расширение маршрутов и кастомные методы

Плагины могут добавлять новые методы к экземпляру Navigo, что позволяет расширять стандартный API. Например, можно создать плагин для динамического добавления маршрутов из конфигурационного файла:

function dynamicRoutesPlugin(router, routes) {
    routes.forEach(route => {
        router.on(route.path, route.handler);
    });
}

const routes = [
    {path: '/home', handler: () => console.log('Home')},
    {path: '/about', handler: () => console.log('About')}
];

const router = new Navigo('/');
router.use(dynamicRoutesPlugin, routes);

Такой подход облегчает масштабирование приложения, особенно если маршруты хранятся в отдельной конфигурации или загружаются динамически.


Интеграция с внешними библиотеками

Плагины позволяют объединять Navigo с другими инструментами, такими как state-менеджеры, аналитика или UI-фреймворки. Например, плагин для интеграции с Redux может автоматически отправлять действия при изменении маршрута:

function reduxPlugin(router, store) {
    router.hooks({
        after: (params) => {
            store.dispatch({type: 'ROUTE_CHANGED', payload: params.route});
        }
    });
}

import {store} from './store';
const router = new Navigo('/');
router.use(reduxPlugin, store);

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


Особенности и ограничения

  • Плагины должны быть чистыми функциями и не изменять внутренние структуры Navigo напрямую.
  • Возможны конфликты, если несколько плагинов используют одинаковые хуки без правильной последовательности вызовов.
  • Рекомендуется документировать все добавленные методы и параметры, чтобы избежать путаницы при масштабировании проекта.

Использование плагинов делает Navigo гибким и расширяемым инструментом, позволяя создавать сложные SPA с кастомной логикой маршрутизации, интеграцией сторонних библиотек и централизованным управлением маршрутов.