В приложениях на Vue часто возникает необходимость корректно обрабатывать ситуации, когда пользователь пытается перейти на несуществующий маршрут. Для этого используется механизм обработки «404 Not Found» в Vue Router. Vue Router предоставляет гибкие средства для настройки таких случаев, позволяя перенаправлять пользователей на специальную страницу или компонент.
Основной подход заключается в добавлении маршрута с
«ловушкой», который будет совпадать со всеми путями, не
определёнными в конфигурации. Это реализуется с помощью символа
:pathMatch(.*)*:
import { createRouter, createWebHistory } from 'vue-router';
import Home from './components/Home.vue';
import About from './components/About.vue';
import NotFound from './components/NotFound.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
];
const router = createRouter({
history: createWebHistory(),
routes,
});
export default router;
Ключевые моменты:
:pathMatch(.*)* захватывает любые пути, не совпавшие с
предыдущими маршрутами.name: 'NotFound' позволяет легко программно переходить
на этот маршрут через
router.push({ name: 'NotFound' }).NotFound.vue используется для отображения
страницы с сообщением о том, что запрашиваемая страница не найдена.Иногда полезно передавать несуществующий путь в компонент, чтобы отображать информацию о том, какой URL был недоступен. Это делается с помощью props:
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: NotFound,
props: route => ({ invalidPath: route.path })
}
В компоненте NotFound.vue можно использовать переданный
параметр:
<template>
<div>
<h1>Страница не найдена</h1>
<p>URL "{{ invalidPath }}" не существует.</p>
</div>
</template>
<script>
export default {
props: ['invalidPath'],
};
</script>
Вместо отдельной страницы можно настроить автоматическое перенаправление на существующий маршрут:
{
path: '/:pathMatch(.*)*',
redirect: '/'
}
В этом случае любое обращение к несуществующему маршруту перенаправляется на корневую страницу.
Для оптимизации производительности можно использовать динамический импорт компонента NotFound:
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('./components/NotFound.vue')
}
Это особенно важно в больших приложениях, где каждая страница может содержать значительный объём кода.
Vue Router работает на клиенте, поэтому при прямом обращении к несуществующему пути через адресную строку браузера сервер должен быть настроен на возврат index.html, чтобы Vue Router мог обработать путь. Например, для Nginx:
location / {
try_files $uri $uri/ /index.html;
}
Или для Express.js:
app.use((req, res, next) => {
res.sendFile(path.resolve(__dirname, 'dist', 'index.html'));
});
Это гарантирует корректную работу маршрутов даже при обновлении страницы на несуществующем пути.
Можно дополнительно обрабатывать неизвестные пути через global beforeEach:
router.beforeEach((to, from, next) => {
const routeExists = router.getRoutes().some(route => route.path === to.path);
if (!routeExists) {
next({ name: 'NotFound' });
} else {
next();
}
});
Этот подход полезен для динамически создаваемых маршрутов, когда заранее неизвестно, какие пути будут доступны.
:pathMatch(.*)* должен располагаться
последним, иначе он перехватит все переходы.children, чтобы обрабатывать ошибки
внутри отдельных секций приложения.redirect вместо компонента обеспечивает
прозрачное перенаправление, но не позволяет показывать
индивидуальное сообщение для конкретного недоступного URL.Обработка несуществующих маршрутов в Vue Router позволяет создать более надёжное и предсказуемое поведение приложения, предотвращая неожиданные ошибки и улучшая пользовательский опыт.