Navigo — это легковесная библиотека для маршрутизации на стороне
клиента в JavaScript, которая позволяет реализовать SPA (Single Page
Application) без необходимости перегрузки страницы. Она обеспечивает
управление URL, обработку параметров маршрута и упрощает динамическую
смену контента. Основной объект Navigo создаётся с
указанием базового пути и опций:
const router = new Navigo('/', { hash: true });
/ — базовый путь приложения.hash: true — использование
хэш-маршрутов (#) для совместимости с серверной структурой
URL.Методы on и navigate позволяют связывать
маршруты с обработчиками и программно переключать состояние
страницы.
Маршруты в Navigo задаются методом on, который принимает
путь и функцию-обработчик:
router.on('/home', () => {
document.querySelector('#app').innerHTML = '<h1>Главная</h1><p>Добро пожаловать!</p>';
});
router.on('/about', () => {
document.querySelector('#app').innerHTML = '<h1>О нас</h1><p>Информация о компании.</p>';
});
Ключевые особенности:
router.on('/user/:id', (params) => {
document.querySelector('#app').innerHTML = `<h1>Пользователь ${params.id}</h1>`;
});
Здесь :id автоматически попадает в объект
params, что упрощает работу с динамическим контентом.
router.on(['/home', '/dashboard'], () => {
document.querySelector('#app').innerHTML = '<h1>Добро пожаловать!</h1>';
});
Для реализации плавной смены контента используются техники
динамической подгрузки и анимации DOM. Основная стратегия — заменить
содержимое контейнера с помощью innerHTML или через
создание и удаление узлов, интегрируя CSS-анимацию.
Пример с анимацией появления:
function renderContent(html) {
const app = document.querySelector('#app');
app.classList.add('fade-out');
setTimeout(() => {
app.innerHTML = html;
app.classList.remove('fade-out');
app.classList.add('fade-in');
}, 300);
}
// CSS для плавного эффекта
// .fade-in { opacity: 1; transition: opacity 0.3s ease-in; }
// .fade-out { opacity: 0; transition: opacity 0.3s ease-out; }
Использование с маршрутом:
router.on('/services', () => {
renderContent('<h1>Наши услуги</h1><p>Описание услуг.</p>');
});
Метод navigate позволяет программно переключать маршрут
без перезагрузки страницы:
document.querySelector('#go-about').addEventListener('click', () => {
router.navigate('/about');
});
Navigo поддерживает вложенные маршруты и параметры query:
router.on('/products/:category/:id', (params, query) => {
renderContent(`<h1>${params.category}</h1><p>Продукт ID: ${params.id}</p>`);
});
params — объект с динамическими
сегментами маршрута.query — объект с GET-параметрами
(например, /products/electronics/42?ref=homepage).Для группировки маршрутов используется метод on с
объектом:
router.on({
'/contact': () => renderContent('<h1>Контакты</h1>'),
'/faq': () => renderContent('<h1>Вопросы и ответы</h1>')
});
Navigo позволяет контролировать переходы через события
before и after. Это полезно для анимации и
проверки прав доступа:
router.hooks({
before: (done, params) => {
console.log('Переход на маршрут:', params);
done(); // продолжить навигацию
},
after: (params) => {
console.log('Маршрут загружен:', params);
}
});
Для больших приложений важна загрузка контента по требованию. Используется динамический импорт:
router.on('/blog', async () => {
const module = await import('./blog.js');
renderContent(module.renderBlog());
});
Это позволяет уменьшить первоначальный размер скриптов и ускоряет старт приложения.
Чтобы обеспечить плавные переходы по внутренним ссылкам без перезагрузки страницы, нужно использовать обработчик кликов:
document.addEventListener('click', (e) => {
if (e.target.matches('a[data-link]')) {
e.preventDefault();
router.navigate(e.target.getAttribute('href'));
}
});
HTML-ссылки должны содержать атрибут data-link для
идентификации:
<a href="/home" data-link>Главная</a>
<a href="/about" data-link>О нас</a>
Для обработки неизвестных маршрутов используется метод
notFound:
router.notFound(() => {
renderContent('<h1>404</h1><p>Страница не найдена</p>');
});
Маршрут по умолчанию можно задать через / или
navigate('/') для редиректа.
on с функцией для рендера
контента.navigate и обработчиков ссылок для
SPA-навигации.before и after для
контроля переходов.Такой подход позволяет создавать интерактивные, отзывчивые приложения с плавной сменой контента без перезагрузки страницы, используя возможности Navigo и современные стандарты JavaScript.