Skip to main content

前端路由 hash 和 history 模式

· 4 min read
Zeffon Wu

在使用 Vue 或者 React 框架搭建的前端项目时,通常会有 hash 模式和 history 模式两种路由方式。本文主要对其的特点、使用场景进行对比。参考自《前端路由模式详解》和《你真的了解前端路由吗?》。

Hash 路由

Hash 路由主要是基于锚点的原理实现,使用 URL 的 Hash 来模拟一个完整的 URL,因此当 URL 改变的时候页面并不会重载。它会监听 url 中 hash 的变化,根据不同的 hash 值渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持。

锚点是网页制作中超级链接的一种,又叫命名记,像一个迅速定位器一样,是一种页面内的超级链接,运用相当普遍。 使用命名记可以在文档中设置标记,这些标记通常放在文档的特定主题处或顶部。 然后可以创建到这些命名记的链接,这些链接可快速将访问者带到指定位置。

Hash 路由会在 url 后面加上 # 的模式,如 http://127.0.0.1:8000/test/index.html#/login 这个 url 后面的 #/login 就是 hash 值。当井号 # 后面的路径发生变化时,浏览器并不会重新发起请求,而是会触发 hashchange 事件。

优点

  1. 实现简单,兼容性好(兼容到ie8
  2. 绝大多数前端框架均提供了给予 hash 的路由实现
  3. 不需要服务器端进行任何设置和开发
  4. 除了资源加载和 ajax 请求以外,不会发起其他请求

缺点

  1. 对于部分需要重定向的操作,后端无法获取 hash 部分内容,导致后台无法取得 url 中的数据,典型的例子就是微信公众号的 oauth 验证
  2. 服务器端无法准确跟踪前端路由信息
  3. 对于需要锚点功能的需求会与目前路由机制冲突
  4. 路径在井号 # 的后面,看起来不怎么美观

History 路由

History 路由则会直接改变 URL,所以在路由跳转的时候会丢失一些地址信息,在刷新或直接访问路由地址的时候会匹配不到静态资源,会出现 404 页面。它会监听 url 中的路径变化,需要客户端和服务端共同的支持。

优点

  1. 对于重定向过程中不会丢失 url 中的参数。后端可以拿到这部分数据
  2. 绝大多数前段框架均提供了 History 的路由实现
  3. 后端可以准确跟踪路由信息
  4. 可以使用 history.state 来获取当前 url 对应的状态信息

缺点

  1. 兼容性不如 hash 路由(只兼容到 IE10)
  2. 需要后端支持,每次返回 html 文档,否则刷新会出现 404 页面