Skip to content

历史模式

Hash 模式

hash 模式是用 createWebHashHistory() 创建的:

ts
import { createRouter, createWebHashHistory } from 'vue-router'

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    //...
  ],
})

它在内部传递的实际 URL 之前使用了一个井号(#)。由于这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理。不过,它在 SEO 中确实有不好的影响。如果你担心这个问题,可以使用 HTML5 模式。

Memory 模式

Memory 模式(内存模式)是一种不依赖浏览器地址栏 URL 的路由模式,所有路由记录都保存在 浏览器内存中,不会修改或读取浏览器地址。

ts
import { createRouter, createMemoryHistory } from 'vue-router'

const router = createRouter({
  history: createMemoryHistory(),
  routes: [
    { path: '/', component: Home },
    { path: '/about', component: About },
  ],
})
特性说明
🚫 不修改 URL页面地址栏不会变化(比如不会出现 /about)。
🧍 不自动导航创建时不会自动根据当前 URL 导航,需要手动 push。
🧱 没有浏览器历史因为不在浏览器中,无法前进/后退
⚙️ 适用于 SSR常用在 Node.js 服务器渲染 (SSR) 场景下。
🧪 可用于测试在单元测试中也很常见,因为不需要依赖浏览器环境。

HTML5 模式

createWebHistory() 创建 HTML5 模式,推荐使用这个模式:

ts
import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    //...
  ],
})

当使用这种历史模式时,URL 会看起来很 "正常",例如 https://example.com/user/id。漂亮!

不过,问题来了。由于我们的应用是一个单页的客户端应用,如果没有适当的服务器配置,用户在浏览器中直接访问 https://example.com/user/id,就会得到一个 404 错误。这就尴尬了。

不用担心:要解决这个问题,你需要做的就是在你的服务器上添加一个简单的回退路由。如果 URL 不匹配任何静态资源,它应提供与你的应用程序中的 index.html 相同的页面。漂亮依旧!

服务器配置示例

https://router.vuejs.org/zh/guide/essentials/history-mode.html