Для начала необходимо подключить библиотеку Navigo. В современных проектах на основе модулей ES6 это делается через npm:
npm install navigo
Или с помощью подключения через CDN в браузере:
<script src="https://unpkg.com/navigo@8.11.1/lib/navigo.min.js"></script>
После подключения создаётся экземпляр роутера:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
Здесь первый аргумент указывает базовый путь, второй — конфигурацию.
Опция hash: true позволяет использовать хеш-маршруты
(#/home) вместо стандартного HTML5 History API.
Маршруты задаются с помощью метода .on(). Navigo
поддерживает статические маршруты, динамические сегменты и регулярные
выражения.
router
.on('/', () => {
console.log('Главная страница');
})
.on('/about', () => {
console.log('О проекте');
})
.on('/user/:id', (params) => {
console.log(`Пользователь с ID: ${params.id}`);
})
.resolve();
Ключевые моменты:
:id — динамический сегмент, доступный через объект
params..resolve() — запускает роутер и проверяет текущий
URL.Для программной навигации используется метод
router.navigate():
router.navigate('/about');
При этом вызывается соответствующий обработчик маршрута. Это позволяет реализовать SPA без перезагрузки страницы.
Navigo предоставляет метод .notFound() для обработки
неизвестных URL:
router.notFound(() => {
console.log('Страница не найдена');
});
Методы .before() и .hooks() позволяют
выполнять действия до и после срабатывания маршрута:
router.before((done, params, route) => {
console.log(`Переход на маршрут: ${route.url}`);
done(); // необходимо вызвать для продолжения навигации
});
done() обязателен для продолжения навигации.Маршруты могут создаваться динамически на основе данных:
const pages = ['home', 'about', 'contact'];
pages.forEach(page => {
router.on(`/${page}`, () => {
console.log(`Открыта страница: ${page}`);
});
});
Это упрощает поддержку большого количества однотипных маршрутов.
При тестировании SPA важно проверять правильность маршрутов без реальной перезагрузки страницы. Для этого в E2E тестах можно использовать:
В Cypress пример проверки маршрутов с Navigo может выглядеть так:
describe('Тестирование маршрутов', () => {
beforeEach(() => {
cy.visit('/');
});
it('Переход на About', () => {
cy.window().then(win => {
win.router.navigate('/about');
});
cy.contains('О проекте').should('be.visible');
});
it('Проверка динамического маршрута', () => {
cy.window().then(win => {
win.router.navigate('/user/42');
});
cy.contains('Пользователь с ID: 42').should('be.visible');
});
});
cy.window() позволяет получить доступ к объекту
router..should('be.visible') проверяет корректный рендер
контента после навигации.it('Несуществующий маршрут', () => {
cy.window().then(win => {
win.router.navigate('/nonexistent');
});
cy.contains('Страница не найдена').should('be.visible');
});
Для тестирования хуков можно использовать заглушки (spy)
для функции before:
it('Вызывается before хук', () => {
cy.window().then(win => {
const spy = cy.spy();
win.router.before(spy);
win.router.navigate('/about');
expect(spy).to.have.been.called;
});
});
cy.visit('/')).done() или промисы.router из модуля
приложения.Navigo может использовать pushState без хеша:
const router = new Navigo('/', { hash: false });
import()).Navigo сочетает простоту настройки с мощными возможностями маршрутизации для SPA. При грамотной организации кода и правильном применении хуков он позволяет полностью покрывать маршрутизацию автоматическими E2E тестами, проверяя как статические, так и динамические маршруты, а также обработку ошибок и асинхронные сценарии.