前端路由的两种模式:Hash 与 History 深度解读
在现代单页应用(SPA)开发中,前端路由是实现无刷新页面切换的关键。Vue-Router 作为 Vue.js 的官方路由管理器,提供了两种模式:hash 模式和history 模式。对于很多初学者来说,这两种模式的区别可能只停留在'hash 模式有#号,history 模式没有'的层面。
默认情况下,Vue-Router 采用 hash 模式,因为它实现简单、兼容性好。然而,随着 HTML5 History API 的普及,history 模式因其更美观的 URL 和更强大的功能,逐渐成为许多项目的首选。
一、hash 模式:#路由
1. 什么是 hash 模式?
hash 模式的 URL 中会包含一个 # 符号,例如 http://www.example.com/#/user/123。这里的 #/user/123 就是 hash 值。hash 的设计初衷是页面内锚点,但当它变化时,浏览器不会向服务器发送请求,因此被前端路由巧妙地用来模拟不同页面的切换。
2. 工作原理
hash 模式的核心是监听浏览器的 hashchange 事件。当 URL 中的 hash 部分发生变化时,该事件会被触发,我们可以在回调中获取当前的 hash 值,并动态渲染对应的组件。下面是一个简化的实现:
window.addEventListener('hashchange', () => {
const hash = location.hash.slice(1); // 去掉 # 号
// 根据 hash 加载对应视图
renderComponent(hash);
});
// 初始化时也需要处理
window.addEventListener('load', () => {
const hash = location.hash.slice(1) || 'home';
renderComponent(hash);
});
此外,hash 变化会被浏览器记录到历史栈中,因此用户可以使用前进/后退按钮导航,这完全由浏览器原生支持。
3. 特点与适用场景
hash 模式最大的优点是 无需后端配合。因为 hash 部分永远不会被发送到服务器,所以无论用户直接访问还是刷新页面,服务器收到的始终是基础 URL(如 http://www.example.com),返回的永远是同一个入口文件。这使得它非常适合部署在静态文件托管服务(如 GitHub Pages)上,或者在后端配置受限的环境中使用。
然而,它的缺点也显而易见:
- URL 不够美观:
#的存在让链接看起来有些'另类'。 - 不利于 SEO:搜索引擎通常不会抓取
#之后的内容,尽管现代搜索引擎有所改进,但依然不如普通路径友好。

