Vue Router предоставляет мощный механизм управления
маршрутами в приложениях на Vue.js. Один из ключевых аспектов его работы
— это режимы истории, которые определяют, как изменения URL
обрабатываются и отображаются. Помимо стандартных режимов
hash и history, существует абстрактный режим,
часто называемый Memory mode, который не зависит от
браузерного API истории и URL.
Режим Memory используется преимущественно в средах, где нет
стандартного объекта window или history,
например:
Ключевая особенность этого режима — отсутствие взаимодействия с реальным URL. Все маршруты хранятся в памяти, что делает его безопасным для серверного выполнения и тестирования.
Для создания маршрутизатора в Memory mode используется свойство
history при конфигурации createRouter:
import { createRouter, createMemoryHistory } from 'vue-router'
import Home from './views/Home.vue'
import About from './views/About.vue'
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
]
const router = createRouter({
history: createMemoryHistory(),
routes
})
export default router
createMemoryHistory() создает внутреннюю историю,
независимую от браузера.router.push, router.replace)
обновляют только внутреннее состояние, не изменяя
адресную строку.Абстрактный режим поддерживает стандартные методы маршрутизатора:
router.push(location) — добавление нового маршрута в
стек памяти.router.replace(location) — замена текущего
маршрута.router.back() / router.forward() —
навигация по стеку памяти аналогично браузерным кнопкам.Пример:
router.push('/about') // Перейти на маршрут /about
router.back() // Вернуться на предыдущий маршрут
Все операции сохраняются в внутреннем массиве истории, который может быть использован для имитации навигации в тестах.
Компоненты, используемые с Memory mode, не зависят от URL и могут быть динамически изменены через реактивные свойства маршрутизатора:
import { ref, watch } from 'vue'
const currentRoute = ref(router.currentRoute.value)
watch(router.currentRoute, (newRoute) => {
currentRoute.value = newRoute
})
router.currentRoute всегда актуален, независимо от
внешнего браузера.Абстрактный режим идеально подходит для модульных и интеграционных тестов:
Пример с Jest:
import { mount } from '@vue/test-utils'
import { createRouter, createMemoryHistory } from 'vue-router'
import App from './App.vue'
import Home from './views/Home.vue'
import About from './views/About.vue'
const router = createRouter({
history: createMemoryHistory(),
routes: [
{ path: '/', component: Home },
{ path: '/about', component: About }
]
})
test('переход на маршрут /about', async () => {
const wrapper = mount(App, {
global: { plugins: [router] }
})
await router.push('/about')
expect(wrapper.html()).toContain('About')
})
Тем не менее, этот режим позволяет полностью управлять навигацией программно и является незаменимым инструментом для серверного рендеринга и тестирования маршрутов.
Memory mode поддерживает все ключевые события и хуки маршрутизатора:
beforeEach и afterEach работают как
обычно.beforeResolve сохраняет совместимость с асинхронной
загрузкой компонентов.isReady() гарантирует корректное завершение
инициализации маршрутизатора перед рендерингом.Пример с хуками:
router.beforeEach((to, from, next) => {
if (to.path === '/about') {
console.log('Переход на About')
}
next()
})
Все хуки функционируют внутри памяти, что делает их безопасными для серверной среды.
Memory mode в Vue Router обеспечивает абсолютно контролируемую, программную навигацию в приложениях, где URL браузера недоступен или нежелателен, сохраняя при этом полный функционал маршрутизатора.