# What changed in vue-router

> 107 changes in vue-router 4 to 5 from its official release notes, upgrade guides and advisories: 11 breaking, 5 deprecations, 1 security, 19 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/vue-router/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## vue-router 5

### Breaking changes

- Experimental hash handling no longer decodes the hash and only protects encoding. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental query params cannot be both required and have a default. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental query values are normalized to arrays, changing the shape developers receive when reading query values. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental redirects no longer inherit params, query, or hash. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- The type for a definePage param default is stricter. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- The experimental miss() now throws internally and returns never. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- The experimental selectNavigationResult API is removed. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- The package uses type module. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Devtools are removed from the IIFE build. (5.0.2) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.2)
- Missing param parsers now produce a runtime error. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- The IIFE build no longer includes @vue/devtools-api because its upgraded v8 does not expose an IIFE build. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)

### Security

- Query objects use Object.create(null) to prevent prototype pollution. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)

### Deprecations

- Warns about removal of legacy optional params. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- The discarded params warning now hints at the `params: {}` workaround. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- NavigationResult is deprecated in favor of reroute(to). (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Using the next() callback in navigation guards now triggers a deprecation warning. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Experimental resolver warns against non-absolute aliases. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)

### New APIs and options

- createRouter accepts a prebuilt matcher. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental definePage can extract hash params. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental definePage allows custom regular expressions for path params. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental support lets developers configure required and default hash params. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Adds onRouteRendered. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Adds UseScrollRestoration for scroll restoration. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- The useRouter() return type can be overridden through the experimental types config. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- Raw param parsers can be forced to have an array type. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- Repeatable params are supported in subsegments as an experimental feature. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- Param parsers now support include and exclude options. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- Standard schema param parsers are now supported. (5.0.5) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.5)
- Nested folders support _parent; conflicts warn, and _parent is non-matchable by default. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Adds experimental reroute() as the replacement for NavigationResult. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Data loaders are added as an experimental feature. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- resolveOptions is exposed for unplugin integrations. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- The Volar plugin allows configuring rootDir. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- A route JSON schema is added. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)

### Performance

- Resolves absolute locations without depending on the current route. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Avoids tracking currentRoute for absolute string locations. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)

### Behavior and default changes

- Hashes and the top position are restored by default. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Skips scroll computation based on history.scrollRestoration. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- The global Router type can be overridden. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- defineParamParser() was made more intuitive. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- Aliases are displayed in logs. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Experimental resolvers now handle aliasOf. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Aliases are extracted from definePage. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Experimental resolvers generate aliases from overrides. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Warns when routes have conflicting components. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Query params are optional by default. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)

### Tooling

- Narrows typeof useRoute in a type context. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Adds helpful diagnostics for developers. (5.2.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.2.0)
- The params.path value in definePage is typed. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- Vite is added as an optional peer dependency for types. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- Automatic types are added for param parsers. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- unplugin-vue-router is merged into the core package, so developers can upgrade to Vue Router 5 instead of using it as a separate package. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- Volar plugins are added for use with Vue Router. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)

### Fixes and other changes

- Sanitizes the named view in a definePage import. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental guard redirects during history navigation are resolved against the navigation target. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental hash parameter parsing is aligned with query parsing. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental hash params can be optional and nullable. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Duplicate hash params keep the last value instead of throwing. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Keeps the declared case of a static prefix when building a matcher pattern path. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Keeps hexadecimal character codes in parameter-segment regular expressions. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Experimental query params with defaults are optional when pushing a route. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Hash params with defaults are excluded from the required set. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Obsolete scroll positions are invalidated. (5.4.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.4.0)
- Handles non-string params for isActive. (5.3.1) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.1)
- Prevents a race condition that caused a dev-only error. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Allows unsetting a route name with false. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Generated parameter types are sorted and deduplicated. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Unnamed parameters are omitted from generated route types. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Generates parameter types from override paths and stops inheritance on absolute overrides. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Skips saving scroll position when the pop direction is unknown. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Reports unnamed parameters once per route. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Removes the listener to prevent focus stealing in Edge. (5.3.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.3.0)
- Vue Router now allows Pinia 4. (5.2.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.2.0)
- Ignores stale asynchronous scrollBehavior results. (5.2.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.2.0)
- Rejects invalid hex digits in [x+hh] character codes. (5.2.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.2.0)
- Invalid query params are filtered without causing route matching to fail. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- Undefined values are allowed for params in query. (5.1.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.1.0)
- definePage path-param parser overrides are now applied. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- Param tokens are finalized before an escaped colon is processed. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- The unplugin no longer generates empty routes. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- Resolved params omit empty optional params. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- RouteNamedMap is wired through generated routes.d.ts. (5.0.7) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.7)
- Fixes a missing closing quote in a generated import. (5.0.6) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.6)
- Tracking definePage imports per-file fixes a named view race condition. (5.0.5) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.5)
- Hashes on string locations are no longer decoded twice. (5.0.5) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.5)
- Allows pushing to auto routes. (5.0.4) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.4)
- Restores context across sequential awaits in loaders. (5.0.4) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.4)
- Prevents false duplicate route warnings for named views. (5.0.4) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.4)
- Avoids iterator helpers for Node 20 compatibility. (5.0.4) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.4)
- Escapes backslashes in string literals. (5.0.4) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.4)
- Auto-routes no longer include non-matchable routes. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Nested groups are handled correctly. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- _parent.vue files no longer have a name. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Route ordering is stable for group folders with the same path and corrected for group nodes with inflated scores. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Old route overrides are cleaned up. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- The RouteMapGeneric constraint is relaxed for interface-based RouteNamedMap. (5.0.3) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.3)
- Fixes handling of empty options in Volar. (5.0.2) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.2)
- The vue-router version check is loosened. (5.0.2) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.2)
- Typed plugins now work with vue-tsc. (5.0.1) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.1)
- Navigation guards are triggered when a keep-alive component is reactivated for a different route. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- A fix avoids breaking support for older browsers. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- Param parsers work when the declaration file is not at the root. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)
- Tildes in paths are escaped. (5.0.0) — [release notes](https://github.com/vuejs/router/releases/tag/v5.0.0)

## vue-router 4

### New APIs and options

- Experimental basic alias support was added. (4.6.4) — [release notes](https://github.com/vuejs/router/releases/tag/v4.6.4)
- Experimental support was added for handling redirect types. (4.6.4) — [release notes](https://github.com/vuejs/router/releases/tag/v4.6.4)

### Fixes and other changes

- The build output was made compatible with v4.5. (4.6.4) — [release notes](https://github.com/vuejs/router/releases/tag/v4.6.4)
- Experimental isActive handling was fixed for custom params. (4.6.4) — [release notes](https://github.com/vuejs/router/releases/tag/v4.6.4)
