前端路由解析(二) —— history路由

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 前端路由解析(二) —— history路由

640.jpg

写在前面


现在的前端应用很多都是单页应用。路由对于单页应用来说,是一个重要的组成部分。本系列文章将讲解前端路由的实现原理。这是系列文章的第二篇:history路由。


系列文章第一篇:前端路由解析(一) ——  hash路由


history api


HTML5引入了history.pushStatehistory.replaceState方法,他们分别可以添加和修改历史记录条目。pushStatereplaceState都接收三个参数:

  1. state: 一个JS对象。在popstate事件中使用。
  2. title: 标题。一般浏览器都忽略这个参数。
  3. url:  任意url,可以是相对路径,也可以是绝对路径。但是必须与当前url同源。

一个pushState的例子,假如我们在https://www.google.com/执行以下代码:


let stateObj = {    foo: "bar",};
history.pushState(stateObj, "page 2", "bar.html");


浏览器的地址栏将变成:https://www.google.com/bar.html

但是,浏览器并不会刷新。此时,history.state的值为:{foo: "bar"}

我们点击浏览器的后退按钮,浏览器会重新回到https://www.google.com/

replaceStatepushState的用法一样,仅有一处不同:

history.pushState是在保留当前记录记录的基础上,再添加一个新的url。而history.replaceState是将当前历史记录替换为新的url。


什么时候会触发popstate事件呢?无论什么时候用户导航到新的状态,popstate事件就会被触发。举个例子,我们在某个页面执行下面的代码:


history.pushState({ page: 1 }, '', 'page1.html');history.pushState({ page: 2 }, '', 'page2.html');


执行完成后,页面会链接为:xxxx/page2.html

此时,点击浏览器后退按钮,页面会回到 xxxx/page1.html,并且会触发一次popstate事件,且事件对象的state参数值为:{ page: 1}。再次点击浏览器历史记录前进按钮,页面回到 xxxx/page2.html,触发一次popstate事件,事件对象的state参数值为:{page : 2}


history路由


history路由就是通过history.pushStatehistory.replaceState 以及 popstate来实现的。我们实现一个最简单的,包含下面两个方面功能:


1、用户点击a标签,可以进行路由跳转。

2、用户点击浏览器的前进后退按钮,可以进行路由跳转。


<html>  <body>      <a href='/p1'>page1</a>      <a href='/p2'>page2</a>      <a href='/p3'>page3</a>      <main>          <div id="content">              这是首页          </div>      </main>  </body>  <script>  window.onload = function () {
    const routerMap = {        '/p1': () => {            document.getElementById('content').innerHTML = '这是段落1111的内容'        },        '/p2': () => {            document.getElementById('content').innerHTML = '这是段落22222的内容'        },        '/p3': () => {            document.getElementById('content').innerHTML = '这是段落33333的内容'        },    };
    const handleRoute = function(inputUrl) {        const url = '/' + inputUrl;        const routeCb = routerMap[url];        if(typeof routeCb === 'function') {            routeCb();        }    }
    window.onpopstate = function (e) {        const url = e.state && e.state.url || '';        url &&  handleRoute(url);    }
    document.addEventListener('click', e => {                if(e.target.tagName !== 'A') return;        e.preventDefault();
        const href = e.target.getAttribute('href');        if(!href) return;
        const url = href.split('/').pop();        window.history.pushState({ url }, null , url);        handleRoute(url);    });  }</script></html>


最终的效果如下:

640.gif


这里需要注意的是,history路由往往需要服务端的配合。虽说 history api 不会刷新页面,但是当用户处在某一个路由并刷新页面时,或者用户直接访问带有路由的页面时,如果服务端没有对当前url进行处理,那么很可能就直接404了。所以需要服务端把相关的url,全都匹配到对应的单页应用的html上。


history路由和hash路由对比


结合之前的hash路由原理,我们可以简单对比一下:


1、history路由比hash路由"长"得好看一下,毕竟url里面带有#看起来不太美观。

2、history路由兼容性不够完美,毕竟是使用了html5标准的api,并且,history路由往往需要服务端的配合。

3、hash路由的兼容性更好。


在实际项目中,根据自己的实际情况来选择使用哪种路由就好了。


写在后面


本文解析了history api,以及history路由的实现原理,符合预期。后续会对react-router的源码进行解析。

相关文章
|
存储 前端开发 安全
前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
本文全面解析前端三种数据存储方式:Cookie、LocalStorage与SessionStorage。涵盖其定义、使用方法、生命周期、优缺点及典型应用场景,帮助开发者根据登录状态、用户偏好、会话控制等需求,选择合适的存储方案,提升Web应用的性能与安全性。(238字)
552 0
|
6月前
|
Web App开发 前端开发 JavaScript
前端性能优化利器:图片懒加载实战解析
前端性能优化利器:图片懒加载实战解析
|
5月前
|
人工智能 JSON 前端开发
如何解决后端Agent和前端UI之间的交互问题?——解析AG-UI协议的神奇作用
三桥君指出AG-UI协议通过SSE技术实现智能体与前端UI的标准化交互,解决流式传输、实时进度显示、数据同步等开发痛点。其核心功能包括结构化事件流、多Agent任务交接和用户中断处理,具有"一次开发到处兼容"、"UI灵活可扩展"等优势。智能体专家三桥君认为协议将AI应用从聊天工具升级为实用软件,适用于代码生成、多步骤工作流等场景,显著提升开发效率和用户体验。
1185 0
|
7月前
|
存储 前端开发 JavaScript
|
8月前
|
存储 前端开发 JavaScript
调用DeepSeek API增强版纯前端实现方案,支持文件上传和内容解析功能
本方案基于DeepSeek API增强版,提供纯前端实现的文件上传与内容解析功能。通过HTML和JavaScript,用户可选择文件并调用API完成上传及解析操作。方案支持多种文件格式(如PDF、TXT、DOCX),具备简化架构、提高响应速度和增强安全性等优势。示例代码展示了文件上传、内容解析及结果展示的完整流程,适合快速构建高效Web应用。开发者可根据需求扩展功能,满足多样化场景要求。
2628 64
|
6月前
|
JSON 前端开发 安全
前端开发中常用的鉴权方式解析与实践要点
本文深入探讨了前端开发中常用的鉴权方式,包括HTTP基本鉴权、Session-Cookie鉴权、Token验证、JWT(JSON Web Tokens)、单点登录(SSO)和OAuth等。文章首先明确了认证、授权、鉴权和权限控制的概念及关系,随后详细解析每种鉴权方式的工作原理、优缺点及适用场景。例如,HTTP基本鉴权简单但安全性低,适合内部网络;Session-Cookie鉴权易受CSRF攻击,适用于同域Web应用;Token和JWT无状态且扩展性好,适合分布式系统;SSO提升用户体验,适用于多系统统一登录;OAuth安全方便,适合第三方授权接入。
470 2
|
10月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
664 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
移动开发 缓存 前端开发
深入理解前端路由:原理、实现与应用
本书《深入理解前端路由:原理、实现与应用》全面解析了前端路由的核心概念、工作原理及其实现方法,结合实际案例探讨了其在现代Web应用中的广泛应用,适合前端开发者和相关技术人员阅读。
|
负载均衡 网络协议 定位技术
在数字化时代,利用DNS实现地理位置路由成为提升用户体验的有效策略
在数字化时代,利用DNS实现地理位置路由成为提升用户体验的有效策略。通过解析用户请求的来源IP地址,DNS服务器可判断其地理位置,并返回最近或最合适的服务器IP,从而优化网络路由,减少延迟,提高访问速度。示例代码展示了如何基于IP地址判断地理位置并分配相应服务器IP,实际应用中需结合专业地理数据库和动态调整机制,以应对复杂网络环境带来的挑战。
317 6
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
480 1

推荐镜像

更多
  • DNS