vue的history和hash模式有什么不一样

Vue Router 的 History 模式 ​ 和 Hash 模式​ 是两种不同的路由实现方式,主要区别如下:

1. URL 表现形式不同

复制代码
// Hash 模式
http://example.com/#/user/profile
// URL 中带有 # 符号

// History 模式
http://example.com/user/profile
// URL 看起来更自然,没有 # 符号

2. 实现原理不同

Hash 模式

  • 基于 window.location.hashonhashchange事件

  • 只改变 URL 中 # 后面的部分,不会触发页面刷新

  • 不会将 URL 发送到服务器

    // 改变 hash
    window.location.hash = '/user'

    // 监听变化
    window.addEventListener('hashchange', () => {
    console.log('hash changed:', window.location.hash)
    })

History 模式

  • 基于 HTML5 History API(pushState、replaceState)

  • 可以修改完整的 URL 而不刷新页面

  • 需要服务器端配合

    // 添加历史记录
    history.pushState({}, '', '/user')

    // 替换当前历史记录
    history.replaceState({}, '', '/user')

3. 服务器配置要求

Hash 模式

  • 不需要服务器特殊配置

  • 因为 # 后面的内容不会被发送到服务器

  • 部署简单,所有路由都指向同一个 HTML 文件

History 模式

  • 需要服务器配置

  • 用户直接访问或刷新子路由时,服务器会返回 404

  • 需要配置所有路径都返回 index.html

    Nginx 配置示例

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

4. 兼容性

  • Hash 模式:兼容性更好,支持 IE8+

  • History 模式:需要 IE10+ 或现代浏览器支持

5. SEO 友好性

  • Hash 模式:不利于 SEO,# 后面的内容传统爬虫不会抓取

  • History 模式:对 SEO 更友好,URL 完整可被爬虫识别

6. 配置方式

复制代码
// router/index.js
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'

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

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

使用建议

  1. 使用 Hash 模式

    • 简单项目或 demo

    • 没有服务器配置权限

    • 需要兼容低版本浏览器

    • 不关心 SEO

  2. 使用 History 模式

    • 需要干净的 URL

    • 需要 SEO 支持

    • 有服务器配置权限

    • 现代浏览器项目

注意事项

  • 使用 History 模式时,确保服务器已正确配置

  • 两种模式在开发环境下通常都能正常工作,差异主要在部署时

  • Vue Router 会自动根据模式使用相应的底层 API

相关推荐
架构师老Y18 分钟前
003、Python Web框架深度对比:Django vs Flask vs FastAPI
前端·python·django
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
xiaotao1317 小时前
第九章:Vite API 参考手册
前端·vite·前端打包
午安~婉8 小时前
Electron桌面应用聊天(续)
前端·javascript·electron
彧翎Pro8 小时前
基于 RO1 noetic 配置 robosense Helios 32(速腾) & xsense mti 300
前端·jvm
小码哥_常8 小时前
解锁系统设置新姿势:Activity嵌入全解析
前端
之歆9 小时前
前端存储方案对比:Cookie-Session-LocalStorage-IndexedDB
前端
哟哟耶耶9 小时前
vue3-单文件组件css功能(:deep,:slotted,:global,useCssModule,v-bind)
前端·javascript·css
是罐装可乐9 小时前
深入理解“句柄(Handle)“:从浏览器安全到文件系统访问
前端·javascript·安全
华科易迅9 小时前
Vue如何集成封装Axios
前端·javascript·vue.js