当前位置: 首页 > Web前端 > HTML

Web开发中的路由实现原理

时间:2023-04-02 12:22:12 HTML

Web开发中的路由实现原理分视图服务端路由Demo服务端路由管理,常见的开发方式是前端使用ajax根据不同的url发起异步请求获取不同的页面资源,前端获取资源后更新页面。后端路由处理一般都是基于前后端不分离的项目。HTML和数据绑定发生在后端(后端渲染),有利于SEO,因为每次发送请求都需要获取资源,造成服务器资源浪费。前端页面可能因为网速延迟,页面局部视图更新,ajax请求不同保存当前请求状态,无法使用浏览器的前进后退快捷键。服务器路由处理的实现类似如下:不同的url请求路径返回不同的模板app.get('',function(req,res){res.header('Access-Control-Allow-Origin','*');res.sendFile(__dirname+"/"+"index.html");})app.get('/home.html',function(req,res){res.header('Access-Control-Allow-Origin','*');res.sendFile(__dirname+"/"+"pages/home.html");})app.get('*',function(req,res){res.header('Access-Control-Allow-Origin','*');res.sendFile(__dirname+"/"+"pages/404.html");})在单页(SPA)开发前可以通过Hash实现Hash路由Demo-端路由,hash路由如:http:localhost:8100/#/home,url后缀有#(锚点),用于页面定位,即显示元素所在的区域根据页面id在可见区域。#以下内容的改变不会向服务器发送请求。前端路由需要实现:根据不同的hash,监听对应的页面,监听hash值的变化,保存当前URL的请求状态或者参数(比如页面刷新,分享链接,so其他人可以获得相同的内容)来实现浏览器的前进后退功能原理:可以通过window.location.hash属性获取页面的hash值。当url的hash值发生变化时,会触发window对象的hashchange事件。通过监听hashchange事件和操作window.location.hash属性,Route.jsfunctionRoute(params){if(!params){console.log("Pleasechecktheinitializationdata")returnfalse;}this.registeredRoute=[];this.contentId=params.contentId;this.routes=params.routes;this.devStatus=params.devStatus||'无'this.otherRouter=params.otherRouter;this.init();}Route.prototype={constructor:Route,init:function(){window.addEventListener('hashchange',(function(event){varcurrentHash=location.hash.substring(1)||this.otherRouter;varroute=this.routes&&this.routes.find(item=>item['path']===currentHash);if(this.devStatus==='log'){console.log("hash已更改为:",currentHash)}if(route){this.activeRoute();this.render(route)}}).bind(this))varinitEvent=newEvent('hashchange');window.dispatchEvent(initEvent);},//更新视图render(route){if(!$){console.log("请确保项目正确导入jQuery")returnfalse;}var_routeContent=$(`#${this.contentId}`);if(_routeContent){varcurrentView=`

当前页面:${route['path']}
参数:${JSON.stringify(route['params'])}
查看:${路由['组件']}
`;_routeContent.html(currentView)}else{console.log("请绑定需要更新的视图区域");}},//当前激活的路由样式activeRoute(){var_routeList=$(".route")||[];for(vari=0;i<_routeList.length;i++){var_item=_routeList[i];变量_classList=_item.classList;var_defActice=!location.hash&&_aDome['context'].getAttribute('data-route-param')==='home');var_aDome=$(_item.getElementsByTagName("a")&&$(_item.getElementsByTagName("a")[0]);var_activeBool=_aDome['context'].getAttribute('data-route-param')===location.hash.substring(1)||_defActic;if(_activeBool){_classList.add('active')}else{_classList.remove('active');}}}}index.html片段
HistoryDe??mowindow.history(window是浏览器的全局对象,所以window.history和history一样)是浏览器提供的用于记录和操作浏览器页面历史栈的对象的接口,提供了公共属性和方法:history.back();//返回历史.go(-1);//等同于history.back();history.forward();//转发history.go(1);//等价于forward()window.history.length;//历史栈页数H5扩展了History,增加了两个重要的新方法:History.pushState()//浏览历史将历史记录压入栈中,添加一条历史记录History.replaceState()//浏览器历史记录最后一次数据更新,替换当前历史记录操作pushState和replaceState方法会触发popstate事件,页面刷新事件监听在不同的浏览器是不同的,Chrome和Safari会触发popstate事件,Firefox不会触发。我们可以通过pushState()和replaceState()记录和更新当前的url和参数;pushState()和replaceState()包含三个参数:state:存储当前参数的JSON标题:shortTitle,浏览器实现不统一,有的fireFox会直接忽略,可以设置为null作为占位符,url:当前url,更新浏览器url的值前端路由实现比较hash路由实现:兼容性较好,url丑,不能使用浏览器栈进行前后向操作history路由实现:比较直观,需要服务器配合,用户体验好,响应快,无需每次都发送服务器请求,通过操作浏览器历史栈完成页面跳转,低版本浏览器不支持H5features,推荐使用Hash参考:1.前端路由的前世今生及其实现原理