В официальной документации Vue Router часто приводят достаточно простые примеры:
const routes = [ { path: '/user/:username', component: User, } ]
На первый взгляд всё логично. Но короткие примеры в доках созданы, чтобы показать синтаксис, а не хорошие практики. В реальном проекте, где десятки экранов, несколько разработчиков и сотни переходов, такой подход быстро превращается в источник багов и головной боли.
Давайте разберём два простых правила, которые сделают работу с роутингом безопасной и приятной.
Первое правило: всегда задавайте name
Казалось бы, зачем оно нужно, если есть path? Ответ прост: path меняется, а name остаётся.
Когда вы переходите по маршруту через path:
router.push('/user/basov')
вы жёстко привязываетесь к структуре URL. Стоит вам изменить путь на /profile/:username - как все переходы в проекте сломаются.
С name всё иначе:
router.push({ name: 'profile', params: { username: 'john' } })
Вы говорите роутеру: "Открой экран профиля, а как именно он называется в адресной строке - не твоё дело". Роутинг становится устойчивым к рефакторингу, а компоненты перестают зависеть от структуры URL.
Без name вы теряете возможность безопасно использовать <router-link>.
Второе правило: храните имена в enum (или константном объекте)
Хардкод строк вроде 'profile', 'UserProfile', 'user-profile' выглядит безобидно ровно до тех пор, пока вы не столкнётесь с опечаткой, дублированием или массовым переименованием.
Вместо этого вынесите имена отдельно:
TypeScript (enum)
export enum RouteNames { Profile = 'profile', Dashboard = 'dashboard', Settings = 'settings', }
И используйте их везде:
router.push({ name: RouteNames.Profile, params: { username: 'john' } })
Пример 1: Как выглядит проект без этих правил
// Компонент A router.push('/user/list') // Компонент B <router-link to="/user/settings">Настройки</router-link> // Компонент C if (route.path === '/user/profile') { ... }
Что происходит, когда URL меняется?
Вы меняете
/user/listна/users/allИщете по проекту строку
/user/list(а вдруг кто-то написал/User/List?)Пропускаете один файл
В продакшене кнопка "Пользователи" ведёт в никуда
Отладка, поиск, коммиты, стыд.
Пример 2: Как выглядит проект с правилами
// routes/names.ts export const RouteNames = { UserList: 'user-list', UserSettings: 'user-settings', UserProfile: 'user-profile', } as const; // routes/index.ts { path: '/users/all', name: RouteNames.UserList, component: UserList }, // Любой компонент router.push({ name: RouteNames.UserList })
Что происходит при рефакторинге?
Вы меняете
path: '/users/all'наpath: '/user/list'nameостаётся тем жеНи один переход не ломается
IDE подсказывает имена через автодополнение
Опечатки невозможны
Почему это работает
Без правил |
С правилами |
|---|---|
Строки размазаны по всему проекту |
Все имена в одном файле |
Рефакторинг пути = поиск по строкам |
Рефакторинг пути = изменение в одном месте |
Опечатки ловятся только в рантайме |
Опечатки ловятся на этапе компиляции |
Сложно понять, какие экраны существуют |
Вся карта маршрутов видна сразу |
Документация показывает как написать, а не как поддерживать. Два правила, которые стоит запомнить:
Всегда задавайте
name- чтобы отделить логику навигации от структуры URL.Всегда выносите
nameв enum/константы - чтобы избавиться от хардкода, опечаток и боли при рефакторинге.
Это не серебряная пуля, но это та привычка, которая экономит часы отладки, упрощает код‑ревью и делает проект предсказуемым. Начните использовать её с первого дня нового проекта — и ваше «будущее я» скажет спасибо.
Комментарии (3)

UltraPokemon
04.04.2026 19:37Если лень писать объект для сотен роутов проекта - можно положиться на типизацию, путем использования либы https://www.npmjs.com/package/vue-routes-to-types или возможностей файлового роутинга, который идёт из коробки во vue-router сейчас.
PS: не встречал коллизий именно имён роутов (с конфликтующими paths сталкивался - то ещё удовольствие).
DmitryKazakov8
это не спасет от пересечений имен, так как они заводятся в массиве. Чтобы TS исключал пересечения, нужна объектная структура
В остальном согласен со статьей - по name куда удобнее редиректить в больших проектах, чем по untyped path.
Pnym Автор
Спасибо, такое объявление роутеров через объектную конфигурацию еще не видел, интересный подход)
Честно говоря, с проблемой пересечения имен сталкиваться не приходилось, так как роутеры у меня строго разделены по фича-модулям. Плюс придерживаюсь правила: префикс
nameвсегда беру из названия файла/папки (например,UserList,UserProfileв модулеUser)user.routes.ts