В библиотеке Navigo обертки и адаптеры используются для создания гибкой структуры маршрутизации, позволяющей интегрировать Navigo с различными компонентными системами и фреймворками. Обертка — это слой, который инкапсулирует базовый функционал маршрутизатора, предоставляя упрощённый или модифицированный интерфейс. Адаптер же служит для привязки Navigo к специфической архитектуре приложения или к конкретным жизненным циклам компонентов.
Обертка позволяет скрыть детали реализации Navigo и стандартизировать работу с маршрутами. Основные задачи обертки:
Пример базовой обертки:
import Navigo from 'navigo';
class RouterWrapper {
constructor(root = '/') {
this.router = new Navigo(root, { hash: true });
this.middlewares = [];
}
use(middleware) {
this.middlewares.push(middleware);
}
addRoute(path, handler) {
this.router.on(path, (params, query) => {
this.middlewares.forEach(fn => fn(params, query));
handler(params, query);
});
return this;
}
navigate(path) {
this.router.navigate(path);
}
resolve() {
this.router.resolve();
}
}
// Пример использования
const appRouter = new RouterWrapper();
appRouter.use((params) => console.log('Middleware', params));
appRouter.addRoute('/users/:id', (params) => console.log('User ID:', params.id));
appRouter.navigate('/users/42');
Ключевые моменты:
this.middlewares — хранит функции
промежуточной обработки.Адаптер — это мост между Navigo и сторонними библиотеками или фреймворками, например, React, Vue или Svelte. Он обеспечивает автоматическое управление состоянием компонентов при изменении маршрута.
Пример адаптера для условного компонента:
class ComponentAdapter {
constructor(router) {
this.router = router;
this.components = {};
}
register(path, componentClass) {
this.components[path] = componentClass;
this.router.addRoute(path, (params) => {
const Component = this.components[path];
const instance = new Component(params);
instance.render();
});
}
}
// Использование с оберткой
const componentRouter = new ComponentAdapter(appRouter);
componentRouter.register('/dashboard', class Dashboard {
constructor(params) { this.params = params; }
render() { console.log('Rendering dashboard with', this.params); }
});
Особенности:
Middleware в Navigo позволяет добавлять сквозную обработку маршрутов: логирование, авторизацию, валидацию параметров и пр. В обертках middleware можно комбинировать и вызывать в нужном порядке:
appRouter.use((params) => {
if (!params.id) console.warn('ID не указан');
});
appRouter.use((params) => {
console.log('Проверка завершена для', params);
});
Преимущества использования middleware через обертку:
Обертки позволяют создавать маршруты на лету, что удобно для крупных приложений с модульной структурой:
function loadModuleRoutes(router, moduleConfig) {
moduleConfig.routes.forEach(route => {
router.addRoute(route.path, route.handler);
});
}
// Пример конфигурации модуля
const userModule = {
routes: [
{ path: '/profile', handler: () => console.log('Profile loaded') },
{ path: '/settings', handler: () => console.log('Settings loaded') }
]
};
loadModuleRoutes(appRouter, userModule);
Преимущества:
Комбинация оберток и адаптеров позволяет строить масштабируемую архитектуру:
Пример полной схемы:
appRouter.use(authMiddleware);
componentRouter.register('/dashboard', DashboardComponent);
componentRouter.register('/settings', SettingsComponent);
appRouter.resolve();
Таким образом, Navigo с обертками и адаптерами становится полноценным инструментом для организации маршрутизации в SPA, поддерживая модульность, расширяемость и контроль над жизненным циклом компонентов.