一、基本概念
1. Hash 模式
原理:
- 通过 URL 中的
#(哈希值)来模拟路由,比如http://example.com/#/home。 - 浏览器原生支持
hashchange事件,当#后的内容变化时,页面不会刷新,但会触发路由切换。
特点:
- 兼容性好:支持所有浏览器(包括 IE8)。
- 服务端无压力 :因为
#后的内容不会发送到服务器,完全由前端处理。
示例:
javascript
// 监听路由变化
window.addEventListener('hashchange', () => {
console.log('当前哈希:', location.hash); // 输出 "#/home"
});
2. History 模式
原理:
- 基于 HTML5 的
History API(pushState、replaceState),直接操作浏览器历史栈,URL 更简洁(如http://example.com/home)。 - 需要服务端配合:因为路径是真实的,刷新页面时会向服务器请求该路径,需配置兜底返回
index.html。
特点:
- URL 美观 :没有
#,更符合传统 URL 习惯。 - 需服务端支持:否则刷新页面会 404。
示例:
less
// 添加新路由记录
history.pushState({}, '', '/home'); // URL 变为 /home,无刷新
对比总结
| 对比点 | Hash 模式 | History 模式 |
|---|---|---|
| URL 美观性 | 带 #,不美观 |
无 #,更简洁 |
| 兼容性 | 所有浏览器 | 需要 IE10+ |
| 服务端要求 | 无需配置 | 需配置兜底路由 |
选择建议:
- 如果需要兼容旧浏览器或快速搭建,用
hash。 - 如果追求美观且能控制服务端配置,用
history。
二、刷新页面情况
1. Hash 模式
-
不会刷新页面的情况:
- 修改
#后的哈希值(如#/home→#/about),触发hashchange事件。 - 调用
router.push()或手动修改location.hash。
- 修改
-
会刷新页面的情况:
-
直接修改
#前的部分(如域名、路径、查询参数):inilocation.href = 'http://example.com/new-path#/home'; // 刷新页面 -
手动刷新页面(F5 / 浏览器刷新按钮) :
页面会重新加载,但路由仍会匹配
#后的内容(因为#后的部分不会发送到服务端)。
-
2. History 模式
-
不会刷新页面的情况:
- 调用
history.pushState()或history.replaceState()修改 URL。 - 前端路由库(如 Vue Router、React Router)的导航方法(如
router.push('/about'))。
- 调用
-
会刷新页面的情况:
-
手动刷新页面(F5 / 浏览器刷新按钮) :
浏览器会向服务器请求当前 URL(如
http://example.com/about),若服务端未配置兜底路由(返回index.html),会返回 404。 -
直接输入 URL 并回车 :
等同于刷新页面,行为同上。
-
修改非路由部分的 URL(如域名、协议、端口):
inilocation.href = 'http://new-domain.com/about'; // 刷新并跳转
-
关键对比
| 操作 | Hash 模式 | History 模式 |
|---|---|---|
修改 # 后的部分 |
❌ 不刷新 | - |
调用 pushState/push |
- | ❌ 不刷新 |
| 手动刷新页面(F5) | ⭕ 刷新 | ⭕ 刷新(需服务端支持) |
| 直接输入 URL 回车 | ⭕ 刷新 | ⭕ 刷新(需服务端支持) |
| 修改 URL 非路由部分(如域名) | ⭕ 刷新 | ⭕ 刷新 |