Vue Router的三种历史模式应用与对比详解

 更新时间:2025年10月14日 09:18:39   作者:一只小风华~  
在 Vue.js 单页应用(SPA)中,vue-router 提供了三种不同的 历史模式 来管理路由导航和 URL 显示方式,每种模式适用于不同场景,下面小编就和大家简单介绍一下吧

核心概览

在 Vue.js 单页应用(SPA)中,vue-router 提供了三种不同的 历史模式 来管理路由导航和 URL 显示方式。每种模式适用于不同场景,理解其原理与配置是构建现代前端应用的关键。

模式创建函数特点SEO 友好服务器要求
Hash 模式createWebHashHistory()使用 # 分隔真实路径与路由信息,兼容性好❌ 不友好
HTML5 模式createWebHistory()正常 URL 形式,美观且利于 SEO✅ 友好需要回退配置
Memory 模式createMemoryHistory()不依赖浏览器环境,适合 SSR 和测试环境⚠️ 视情况

一、Hash 模式(哈希模式)

基本概念

  • 利用 URL 中的 # 后面的部分(即 hash)来模拟页面跳转。
  • 浏览器不会将 # 后的内容发送到服务器,因此无需后端支持。

示例代码

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

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    { path: '/home', component: Home },
    { path: '/about', component: About }
  ]
})

访问地址如:https://example.com/#/home

优点

  • 兼容老版本浏览器(IE9+)
  • 无需服务器额外配置
  • 开发调试方便

缺点

  • URL 不美观,带有 #
  • 对 SEO 不友好(搜索引擎可能忽略 hash 内容)

二、HTML5 模式(浏览器历史记录模式)

 基本概念

使用 HTML5 的 history.pushState() API 实现真实的 URL 路径。

URL 更加“正常”,例如:https://example.com/user/123

示例代码

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

const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: '/user/:id', component: UserComponent }
  ]
})

关键问题:404 错误

当用户直接访问 /user/123 时,请求会发送给服务器。如果服务器没有对应资源,则返回 404。

解决方案:Fallback 回退机制

所有非静态资源请求都应返回 index.html,交由前端路由处理。

常见服务器配置示例:

服务器:nginx

配置方法

location / {
  try_files $uri $uri/ /index.html;
}

Apache 

| Express (Node.js) | 使用中间件:

const history = require('connect-history-api-fallback');
app.use(history());

| Firebase Hosting | 在 firebase.json 添加:

{
  "hosting": {
    "rewrites": [
      { "source": "**", "destination": "/index.html" }
    ]
  }
}

| Netlify | 创建 _redirects 文件:

/* /index.html 200

| Vercel | 创建 vercel.json

{ "rewrites": [{ "source": "/:path*", "destination": "/index.html" }] }

优点

  • URL 美观,符合现代 Web 标准
  • 利于 SEO 优化
  • 用户体验更自然

缺点

  • 必须配合服务器正确配置
  • 配置不当会导致 404

三、Memory 模式(内存模式)

基本概念

将路由状态保存在内存中,不依赖浏览器的 URL 或历史栈。

完全由 JavaScript 控制导航。

示例代码

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

const router = createRouter({
  history: createMemoryHistory(),
  routes: [
    { path: '/login', component: LoginComponent }
  ]
})

// 手动触发初始导航(必须!)
router.push('/login')

适用场景

  • 服务端渲染(SSR)
  • Node.js 后端环境
  • 单元测试或自动化脚本
  • 移动端 WebView 或 Electron 应用(可选)

注意事项

  • 浏览器中无法使用前进/后退按钮
  • 页面刷新后路由状态丢失
  • URL 不更新,不利于分享

补充知识点:处理 404 页面

由于 HTML5 模式下所有路径都被重定向到 index.html,服务器不再返回 404,因此需要在前端实现通用匹配路由。

前端万能路由配置

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
  // 通配符路由必须放在最后
  { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFoundComponent }
]

也可以解构参数:

// 访问 /not-found 时
this.$route.params.pathMatch // "not-found"

更佳实践(SSR 场景)

在服务端预先用路由器匹配 URL:

  • 匹配成功 → 渲染页面
  • 匹配失败 → 返回 HTTP 404 状态码

查看 Vue SSR 文档 获取更多细节。

对比图表:三种历史模式一览表

特性Hash 模式HTML5 模式Memory 模式
是否改变真实 URL否(仅改 hash)
是否需要服务器配置
支持前进/后退否(除非手动模拟)
SEO 友好性取决于上下文
适用环境浏览器浏览器浏览器 / SSR / 测试 / Node
URL 示例/#/user/1/user/1(无变化)
初始化是否需手动 push?

知识点详解

下列为解决上述内容所涉及的核心知识点:

1.HTML5 History API

通过 $window.history.pushState() 动态修改 URL 而不刷新页面,是实现 HTML5 模式的基础。它允许 SPA 拥有“真实”路径。

2.URL 重写与回退机制

服务器需配置将所有未命中静态资源的请求指向 index.html,从而交由前端路由处理,避免 404 错误。

3.通配符路由匹配

使用 /:pathMatch(.*)* 捕获任意未知路径,在前端展示 404 页面,弥补服务器回退带来的错误掩盖问题。

总结建议

使用场景推荐模式理由
普通生产环境 Web 应用✅ HTML5 模式更好的用户体验和 SEO
快速开发、演示或无后端支持项目✅ Hash 模式零配置,开箱即用
SSR、测试、Node.js 环境✅ Memory 模式独立于浏览器环境,便于控制
移动 Hybrid 应用⚠️ Hash 或 Memory根据容器能力选择

附加提示

若部署在子目录(如 /my-app/),记得设置 base: '/my-app/'

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

构建工具(Vue CLI / Vite / Nuxt)通常已集成相关插件,但仍需手动配置服务器规则。

使用 CI/CD 部署时,确保 _redirectsvercel.json 等文件包含在构建输出中。

到此这篇关于Vue Router的三种历史模式应用与对比详解的文章就介绍到这了,更多相关Vue Router历史模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue中通过minio上传文件的详细步骤

    Vue中通过minio上传文件的详细步骤

    最近项目中使用了minio作为静态资源管理服务,所以简单写一下如何通过minio来上传图片,下面这篇文章主要给大家介绍了关于Vue中通过minio上传文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Vue中的计算属性和axios基本使用回顾

    Vue中的计算属性和axios基本使用回顾

    这篇文章主要介绍了Vue中的计算属性和axios基本使用回顾,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue3中使用codemirror的详细教程

    vue3中使用codemirror的详细教程

    这篇文章主要给大家介绍了关于vue3中使用codemirror的详细教程,CodeMirror是一款功能强大的代码高亮插件,他不仅提供了高亮功能,其丰富的方法属性也封装了缩进、自动换行、获取编辑文本、设置编辑文本、回退功能等多种实用效果,需要的朋友可以参考下
    2023-09-09
  • Vue.js bootstrap前端实现分页和排序

    Vue.js bootstrap前端实现分页和排序

    这篇文章主要为大家详细介绍了Vue.js结合bootstrap前端实现分页和排序效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • vuejs实现下拉框菜单选择

    vuejs实现下拉框菜单选择

    这篇文章主要为大家详细介绍了vuejs实现下拉框菜单选择,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • vue项目中公用footer组件底部位置的适配问题

    vue项目中公用footer组件底部位置的适配问题

    footer为公用组件,其他页面都需要引入。接下来通过本文给大家分享vue项目中公用footer组件底部位置的适配问题,需要的朋友可以参考下
    2018-05-05
  • Vue3中插槽slot的使用方法详解

    Vue3中插槽slot的使用方法详解

    在Vue 3中,插槽(slot)是一种强大的内容分发API,它允许组件的模板开发者定义一种插槽,下面就跟随小编一起来学习一下它的具体使用吧
    2024-11-11
  • Vue3+TypeScript报错:无法找到模块xx的声明文件问题

    Vue3+TypeScript报错:无法找到模块xx的声明文件问题

    这篇文章主要介绍了Vue3+TypeScript报错:无法找到模块xx的声明文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • vue中如何使用echarts和echarts-gl实现3D饼图环形饼图

    vue中如何使用echarts和echarts-gl实现3D饼图环形饼图

    现在vue是很多公司前端的主流框架,我目前所在公司接触的项目也都是使用vue来实现的,很少有完全使用原生的JavaScript来写项目的了,下面这篇文章主要给大家介绍了关于vue中如何使用echarts和echarts-gl实现3D饼图环形饼图的相关资料,需要的朋友可以参考下
    2023-03-03
  • vue的基本用法与常见指令

    vue的基本用法与常见指令

    Vue.js是JavaScript MVVM(Model-View-ViewModel)库,十分简洁,Vue核心只关注视图层,相对AngularJS提供更加简洁、易于理解的API。接下来通过本文给大家介绍vue的基本用法与常见指令,感兴趣的朋友一起看看吧
    2017-08-08

最新评论