Маршрутизация в современных SPA (Single Page Application) построена
на манипуляциях с историей браузера. Основной объект, отвечающий за
историю, — это window.history, который
предоставляет методы pushState, replaceState и
событие popstate. Эти методы позволяют изменять URL без
полной перезагрузки страницы, что и используется фреймворками вроде
Vue.js для реализации клиентской навигации.
Существует три основных способа управления историей в веб-приложениях:
Hash-based (хэш-история) Использует часть URL
после символа #. Например,
example.com/#/about. Хэш не отправляется на сервер, поэтому
нет необходимости в дополнительной конфигурации сервера. Этот метод
поддерживается всеми браузерами, включая старые, и обеспечивает
мгновенную навигацию между «страницами» SPA.
HTML5 History API Позволяет управлять историей с
помощью методов pushState и replaceState,
формируя чистые URL без #, например,
example.com/about. Этот подход выглядит как стандартная
навигация между страницами и требует настройки сервера для обработки
всех маршрутов приложения на одну точку входа
(index.html).
Abstract mode Применяется для окружений без настоящей истории браузера, например, при рендеринге на сервере или в тестах. В этом режиме маршруты хранятся исключительно в памяти.
Vue Router предоставляет гибкую конфигурацию режимов истории через
свойство history при создании маршрутизатора.
import { createRouter, createWebHistory, createWebHashHistory, createMemoryHistory } from 'vue-router';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
];
// HTML5 History
const routerHistory = createWebHistory();
// Хэш-режим
// const routerHistory = createWebHashHistory();
// Память (Abstract)
// const routerHistory = createMemoryHistory();
const router = createRouter({
history: routerHistory,
routes
});
Каждый режим имеет свои особенности:
createWebHistory() Использует HTML5
History API. Позволяет создавать чистые URL без символа #.
Поддерживает методы push, replace и обработку
событий popstate. Требует серверной настройки для
маршрутов, иначе при перезагрузке на подстранице возникнет ошибка
404.
createWebHashHistory() Обеспечивает
маршрутизацию через хэш в URL. Все переходы не требуют серверной
поддержки. Отличается простотой и полной совместимостью с любыми
браузерами. Недостаток — урлы содержат #, что выглядит
менее эстетично.
createMemoryHistory() Ведёт историю
в памяти и подходит для Node.js или тестирования. URL в браузере не
изменяется, что делает его идеальным для SSR (Server-Side
Rendering).
Vue Router позволяет работать с историей через методы
push, replace и слушатели событий:
router.push('/about'); // Добавляет новый маршрут в историю
router.replace('/contact'); // Заменяет текущий маршрут
Для отслеживания изменений маршрута используются глобальные хуки:
router.beforeEach((to, from, next) => {
console.log(`Переход с ${from.fullPath} на ${to.fullPath}`);
next();
});
При использовании HTML5 History важным моментом является поддержка
браузеров, не умеющих работать с pushState. В таких случаях
рекомендуется fallback на хэш-режим или проверка поддержки API перед
инициализацией роутера.
Для режима createWebHistory() необходимо настроить
сервер так, чтобы любые запросы к маршрутам SPA возвращали
index.html. Например, для Nginx:
location / {
try_files $uri /index.html;
}
Это обеспечивает корректную загрузку страниц при обновлении браузера или прямом переходе по URL.
push, replace и событие
popstate лежат в основе навигации SPA.История браузера и режимы роутера формируют фундамент навигации в Vue.js, определяя способ отображения маршрутов, взаимодействие с сервером и поведение при обновлении страницы.