vuejs/router
Version: 5.0.2 (Feb 2026)
Deps: @babel/generator@^7.28.6, @vue-macros/common@^3.1.1, @vue/devtools-api@^8.0.0, ast-walker-scope@^0.8.3, chokidar@^5.0.0, json5@^2.2.3, local-pkg@^1.1.2, magic-string@^0.30.21, mlly@^1.8.0, muggle-string@^0.4.1, pathe@^2.0.3, picomatch@^4.0.3, scule@^1.3.0, tinyglobby@^0.2.15, unplugin@^3.0.0, unplugin-utils@^0.3.1, yaml@^2.8.2
Tags: next: 4.0.13 (Feb 2022), legacy: 3.6.5 (Sep 2022), edge: 4.4.0-alpha.3 (Jun 2024), beta: 5.0.0-beta.2 (Jan 2026), latest: 5.0.2 (Feb 2026)
References: Docs — API reference, guides • GitHub Issues — bugs, workarounds, edge cases • GitHub Discussions — Q&A, patterns, recipes • Releases — changelog, breaking changes, new APIs
API Changes
This section documents version-specific API changes — prioritize recent major/minor releases.
-
NEW:
— v5 ships the Vite plugin (formerly
) directly in the core package; import from
instead
source
-
NEW:
— v5 export that provides the auto-generated file-based route list; previously required
as a separate package
source
-
NEW:
— v5 export for Webpack/Rollup/esbuild plugins and utilities (
,
,
, etc.); previously imported from
source
-
NEW:
+
(experimental) — v5 adds data loaders directly to
; previously in
unplugin-vue-router/data-loaders
. Install
before the router with
app.use(DataLoaderPlugin, { router })
source
-
NEW:
(experimental) — Pinia Colada-backed loader available at
vue-router/experimental/pinia-colada
; previously
unplugin-vue-router/data-loaders/pinia-colada
source
-
NEW:
(experimental) — class from
returned inside a loader to redirect during navigation (e.g.
return new NavigationResult('/login')
); previously did not exist in vue-router
source
-
NEW: Volar plugins moved to
vue-router/volar/sfc-typed-router
and
vue-router/volar/sfc-route-blocks
— previously
unplugin-vue-router/volar/sfc-typed-router
and
unplugin-vue-router/volar/sfc-route-blocks
source
-
NEW:
module augmentation — v4.4+ interface used to register
for typed routes; augment with
declare module 'vue-router' { interface TypesConfig { RouteNamedMap: RouteNamedMap } }
source
-
BREAKING: IIFE build no longer bundles
— v5 upgraded devtools-api to v8 which has no IIFE build; affects CDN/script-tag setups that relied on the bundled devtools
source
-
NEW: Query params optional by default (experimental) — v5 file-based routing makes query params optional in typed routes by default source
Also changed: types/utilities moved to
(renamed) ·
replaces
(renamed) ·
array on route records for manually connecting data loaders (NEW, experimental) ·
is
Ref<RouteLocationNormalizedLoaded>
— access via
(v4 BREAKING) ·
removed — use
returning a Promise (v4 BREAKING) ·
/
renamed to
/
(v4 BREAKING)
Best Practices
-
Use
directly in guards instead of iterating
— Vue Router merges all ancestor
fields non-recursively, so
already reflects inherited values from parent routes
source
-
Extend the
interface via module augmentation to type all
fields — this enforces that every route declares required fields at compile time rather than relying on runtime checks
source
-
Use
(not
) for operations that must run after async components are resolved — it fires after all in-component guards and async route components are ready, making it the correct place for camera permission checks or final data validation
source
-
Use
inside navigation guards (global or per-route) to access Pinia stores and provided values — this is supported since Vue 3.3 and avoids importing stores outside of
context
source
-
Avoid the
callback in guards — return values (
, a route location, or nothing) instead;
is error-prone because it must be called exactly once per code path and is considered a legacy API
source
-
and check the resolved value to detect navigation failures — the promise resolves to a
when blocked, or
on success; use
isNavigationFailure(result, NavigationFailureType.aborted)
to distinguish the specific failure type
source
-
Set
(or a function) on route records to decouple components from
— components receiving params as props are reusable and testable without a router instance; use the function form (
props: route => ({ query: route.query.q })
) to map query params or cast types
source
-
Watch specific
properties rather than the whole
object —
returns a reactive object, but watching it entirely triggers on any change (hash, query, params); narrow the watcher to
to avoid unnecessary fetches
source
-
(experimental) Use
/
exported from page components for navigation-aware data fetching — loaders exported from lazy-loaded route components are automatically connected to the navigation lifecycle, block the transition until resolved, and expose
/
reactively; set
for non-critical data that should not block navigation
source