URL---history和hash模式的区别

前端路由核心:Hash 与 History 模式的原理及区别

单页应用(SPA)实现 "无刷新切换视图" 的核心是前端路由,其主流方案 Hash 模式与 History 模式,基于不同的浏览器特性构建,底层原理和核心区别如下:

一、核心原理拆解

1. Hash 模式:基于 URL 哈希值的锚点机制

Hash 模式的核心是利用 URL 中 # 后面的 "哈希值" 特性:

  • 哈希值(如 https://xxx.com/#/home 中的 /home)仅在客户端生效,浏览器解析 URL 时,会将 # 及后续内容视为 "锚点标识",不会随 HTTP 请求发送到服务器
  • 当哈希值发生变化(如点击导航切换 #/home 到 #/about)时,浏览器会触发 hashchange 事件,前端路由监听该事件后,解析新的哈希值,匹配对应的路由规则并渲染目标视图;
  • 即使页面刷新,浏览器仅请求主域名对应的入口文件(如 index.html),哈希值仍保留在 URL 中,路由可通过解析哈希值恢复对应视图。

2. History 模式:基于 HTML5 History API 的历史记录操作

History 模式依托 HTML5 新增的 History API(pushState()、replaceState())实现,核心逻辑如下:

  • 通过 history.pushState(state, title, url) 可向浏览器历史记录栈中添加一条新记录,同时修改 URL 路径(如 https://xxx.com/home),不会触发页面刷新或服务器请求
  • history.replaceState() 则用于替换当前历史记录栈中的记录,同样不触发刷新;
  • 当用户点击浏览器前进 / 后退按钮时,会触发 popstate 事件,前端路由监听该事件后,解析当前 URL 路径,匹配路由规则并渲染视图;
  • 关键限制:该模式下的 URL 是 "真实路径",若直接输入路径或刷新页面,浏览器会向服务器发送该路径的资源请求,需服务器配合配置才能避免 404 错误。

二、核心区别对比表

|-----------|---------------------------------|-------------------------------------------|
| 对比维度 | Hash 模式 | History 模式 |
| URL 格式 | 包含 # 号,如 https://xxx.com/#/home | 无 # 号,如 https://xxx.com/home |
| 底层依赖 | 浏览器原生锚点机制,无需额外 API | HTML5 History API(pushState/replaceState) |
| 服务器请求行为 | 哈希值不发送到服务器,仅请求主入口文件 | 直接输入 / 刷新时,请求对应路径的服务器资源 |
| 触发路由变化的事件 | hashchange 事件 | popstate 事件(前进 / 后退触发) |
| 兼容性 | 兼容所有浏览器(含 IE6/7 等低版本) | 仅兼容 IE10+ 及现代浏览器(依赖 HTML5) |
| 原生锚点冲突 | 与页面原生锚点(如 #footer)冲突 | 不影响原生锚点使用 |
| 路由参数格式 | 参数暴露在哈希值中(如 #/user?id=1) | 参数嵌入路径(如 /user/1),更规范 |

相关推荐
-To be number.wan5 小时前
【数据结构真题解析】哈希表中等难度挑战:冲突处理与查找效率深度剖析
数据结构·哈希算法
-To be number.wan13 小时前
【数据结构真题解析】哈希表高级挑战:懒惰删除、探测链断裂与查找正确性陷阱
数据结构·算法·哈希算法
Miqiuha15 小时前
二次散列学习
学习·算法·哈希算法
结衣结衣.16 小时前
Redis中的Hash哈希
数据库·redis·哈希算法
Remember_99318 小时前
【数据结构】深入理解Map和Set:从搜索树到哈希表的完整解析
java·开发语言·数据结构·算法·leetcode·哈希算法·散列表
燃于AC之乐18 小时前
我的算法修炼之路--8——预处理、滑窗优化、前缀和哈希同余,线性dp,图+并查集与逆向图
算法·哈希算法·图论·滑动窗口·哈希表·线性dp
MSTcheng.18 小时前
【C++】链地址法实现哈希桶!
c++·redis·哈希算法
MSTcheng.19 小时前
【C++】使用哈希表封装unordered_set和unordered_map!
c++·哈希算法·散列表·map/set封装
43v3rY0unG1 天前
哈希表学习
学习·哈希算法·散列表
Remember_9931 天前
【数据结构】深入理解优先级队列与堆:从原理到应用
java·数据结构·算法·spring·leetcode·maven·哈希算法