Skip to content

routerMode: 'hash' navigation broken when using --base (regression in 52.16.0) #2622

Description

@openscript

Describe the bug

Since 52.16.0, navigating between slides is broken when using routerMode: 'hash' and deploying to a sub-directory with --base. The fix from #2562 (prepending import.meta.env.BASE_URL to the route path in getSlidePath) assumes routerMode: 'history', but breaks 'hash' mode.

With createWebHashHistory, Vue Router does not strip the base from paths passed to router.push(). The full base gets prepended to the hash fragment, producing an unmatchable route:

# Expected
https://example.com/my-base/slides/#/4

# Actual (52.16.0 with routerMode: 'hash')
https://example.com/my-base/slides/#/my-base/slides/4

Minimal reproduction

  1. Create a new Slidev project: npm create slidev@latest
  2. Set routerMode: 'hash' in the frontmatter of slides.md
  3. Build with a sub-directory base: slidev build --base /my-base/slides/
  4. Serve the dist/ folder and open the slides
  5. Navigate to the next slide — the URL becomes #/my-base/slides/2 instead of #/2, resulting in a 404/blank page

Root cause

packages/client/logic/slides.tsgetSlidePath now returns:

return `${import.meta.env.BASE_URL}${path}` // e.g. "/my-base/slides/2"

This path is passed directly to router.push({ path: ... }). With createWebHistory the router strips the base and this works correctly. With createWebHashHistory the base is not stripped, so the full string lands in the hash fragment as an unresolvable route.

Environment

  • Slidev version: 52.16.0 (regression from 52.14.2)
  • Browser: Chrome / Firefox
  • OS: Linux

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions