В официальной документации 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/константы - чтобы избавиться от хардкода, опечаток и боли при рефакторинге.
Это не серебряная пуля, но это та привычка, которая экономит часы отладки, упрощает код-ревью и делает проект предсказуемым. Начните использовать её с первого дня нового проекта - и ваше "будущее я" скажет спасибо.
