Navigo — это легковесная библиотека для маршрутизации на стороне клиента в JavaScript. Она позволяет управлять URL-адресами, изменять состояние приложения без перезагрузки страницы и создавать динамические интерфейсы. Одной из ключевых возможностей является симуляция переходов, которая позволяет программно инициировать маршруты и тестировать навигацию.
Для начала необходимо создать объект маршрутизатора:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: false });
'/' указывает базовый путь приложения.hash: false отключает использование хэшей
(#) в URL.Экземпляр маршрутизатора предоставляет методы для регистрации маршрутов и управления переходами.
Маршруты связываются с функциями-обработчиками, которые вызываются при совпадении URL:
router.on('/home', () => {
console.log('Главная страница');
});
router.on('/about', () => {
console.log('О странице');
});
router.on('/products/:id', ({ data }) => {
console.log(`Продукт с ID: ${data.id}`);
});
Особенности маршрутов:
:id) позволяют
извлекать параметры из URL.data)
и другими данными маршрута.Для симуляции переходов используется метод navigate:
router.navigate('/home');
router.navigate('/products/42');
Метод navigate выполняет следующие действия:
history.pushState).Важно: при использовании navigate можно
передавать дополнительные опции:
router.navigate('/about', { replace: true });
replace: true заменяет текущую запись в истории вместо
добавления новой.При работе с динамическими маршрутами можно передавать параметры напрямую:
router.navigate('/products/99');
Это автоматически создаёт объект data внутри
обработчика:
router.on('/products/:id', ({ data }) => {
console.log(data.id); // 99
});
Для сложных сценариев, например с query-параметрами, можно использовать строку URL с параметрами:
router.navigate('/search?query=javascript&page=2');
Navigo предоставляет хуки, которые позволяют управлять навигацией до или после перехода:
router.hooks({
before: (done, params) => {
console.log('Перед переходом', params);
done(); // необходимо вызвать для продолжения навигации
},
after: (params) => {
console.log('После перехода', params);
}
});
Для симуляции перехода, аналогичного клику по ссылке, используется
router.navigate совместно с обработкой событий:
document.querySelector('#go-to-about').addEventListener('click', (e) => {
e.preventDefault();
router.navigate('/about');
});
Такой подход обеспечивает единообразное поведение переходов как через UI, так и программно.
Для проверки или повторного выполнения текущего маршрута используется
метод resolve:
router.resolve();
Он анализирует текущий URL и вызывает соответствующий обработчик, что полезно при динамических изменениях состояния приложения.
navigate с асинхронными маршрутамиПри работе с асинхронной загрузкой данных переходы могут быть симулированы без мгновенного отображения контента:
router.on('/dashboard', async () => {
const data = await fetchData();
renderDashboard(data);
});
router.navigate('/dashboard') инициирует асинхронный
маршрут точно так же, как при клике по ссылке, сохраняя
последовательность вызовов хуков.
Симуляция переходов идеально подходит для тестирования SPA:
before и after.Пример тестового сценария:
router.navigate('/home');
router.navigate('/products/101');
router.navigate('/about');
Каждый вызов имитирует поведение пользователя и позволяет проверить обработку маршрутов и динамических параметров.
Navigo использует history.pushState и
history.replaceState для управления URL:
navigate с опцией { replace: false } →
pushStatenavigate с опцией { replace: true } →
replaceStateЭто обеспечивает корректную работу кнопок “Назад” и “Вперед” браузера при программной навигации.
| Метод | Описание |
|---|---|
navigate(path, options) |
Программно инициирует переход по маршруту. |
resolve() |
Выполняет текущий маршрут по URL. |
hooks({ before, after }) |
Управляет действиями до и после перехода. |
on(path, handler) |
Регистрирует обработчик маршрута. |
Использование этих методов позволяет полностью контролировать навигацию в приложении, имитируя переходы пользователя, управлять состоянием истории и обрабатывать асинхронные действия.