提示:以下是本篇文章正文内容,下面案例可供参考
在前端路由中,hash路由和history路由是两种常见的实现方式。它们各有优缺点,适用于不同的场景。以下是它们的主要区别:
一、工作原理
1. 工作原理
hash 路由
- 实现方式:依赖 url 中的 #(哈希)符号及其后面的部分。
- 浏览器支持:所有现代浏览器都支持,因为这是 html 标准的一部分。
- url 示例:
http://example.com/#/home
- 原理:当 url 的哈希部分发生变化时,浏览器不会重新加载页面,但会触发
hashchange
事件。前端框架可以监听这个事件并处理相应的路由逻辑。 - 实现细节:
- url 中的哈希符号(#)和其后的内容被称为“片段标识符”。
- 浏览器在加载页面时,不会将 # 号及其后面的内容发送到服务器。因此,客户端可以通过监听
window.onhashchange
事件来处理路由变化。
- 浏览器行为:
- 当 url 的哈希部分变化时,浏览器不会重新加载页面,但会触发 hashchange 事件。
- 例如,
http://example.com/#/about
到http://example.com/#/contact
不会刷新页面,但会触发相应的事件。
history 路由
- 实现方式:依赖 html5 history api(pushstate、replacestate 和 popstate 事件)。
- 浏览器支持:html5 兼容的现代浏览器。
- url 示例:
http://example.com/home
- 原理:通过
pushstate
和replacestate
方法来改变 url,而不触发页面刷新。通过popstate
事件来监听浏览器导航(如后退或前进)。 - 实现细节:
- 利用 html5 的 history api,包括 pushstate、replacestate 和 popstate 事件。
- 通过调用
history.pushstate(stateobj, title, url)
或history.replacestate(stateobj, title, url)
来改变 url,而不触发页面刷新。
- 浏览器行为:
- 调用
pushstate
或replacestate
可以改变 url。 - 浏览器
前进
和后退
按钮会触发popstate
事件,使得应用可以响应历史记录变化。 - 例如,从
http://example.com/home
到http://example.com/about
,url 会改变但页面不会刷新。
- 调用
2.url 表现
hash 路由
- url 结构:
http://example.com/#/path
使用 # 号后的部分作为路由路径。哈希符号后的部分是虚拟路径,实际上并未改变服务器请求路径。- 如果用户直接输入带有哈希的 url,页面仍然会加载正确的资源,因为哈希部分由前端处理。
- seo(搜索引擎优化):传统搜索引擎通常忽略 # 后的部分,无法索引其中的内容,导致 seo 效果差。seo 不友好。
- 用户体验:url 包含 # 符号,看起来不如标准路径简洁。
history 路由
- url 结构:
http://example.com/path
使用正常的路径结构,没有 # 号。- 更符合用户直觉和习惯。
- seo:更友好,因为 url 是标准的路径格式,搜索引擎可以正常抓取和索引这些路径,提高 seo 效果。
- 用户体验:url 更加简洁、美观,与传统的网页 url 形式一致,用户体验更好。
3.配置和兼容性
hash 路由
- 服务器配置:无需特殊服务器配置,因为哈希部分不会被发送到服务器,服务器只需返回单一的 html 文件。
- 兼容性:几乎所有浏览器都支持,包括一些较旧的浏览器。
history 路由 - 服务器配置:需要服务器配置支持,因为所有路由路径都需要映射到应用的入口文件(如 index.html)。否则,刷新页面时会导致 404 错误。
- 兼容性:需要现代浏览器支持 html5 history api,但一些较旧的浏览器(如 ie9 及以下)不支持。
4.使用场景
hash 路由
- 适用场景:
- 需要支持旧版浏览器。
- 不需要 seo 的后台管理系统、单页应用等。
- 无法控制服务器配置的项目。
history 路由
- 适用场景:
- 需要 seo 支持的公开网站。
- 用户体验要求高的项目。
- 可以控制服务器配置,并确保正确处理所有路由请求。
5. 性能
- 性能:两者在性能上的差异主要体现在初次加载和页面切换上。
- hash 路由:由于不涉及服务器请求,页面切换速度快。
- history 路由:初次加载时可能需要更多配置,但页面切换同样迅速。在 spa(单页应用)中,两者差异不明显。
总结
hash 路由:更简单、兼容性好,适用于不需要 seo 和简单的单页应用。
history 路由:url 更加美观、seo 友好,但需要额外的服务器配置支持,适用于对 seo 有要求、能控制服务器配置的项目。
发表评论