前端知识库前端路由-简介

简介: 在前端架构中,路由的设计的合理与否决定了这个项目的是否优秀。现在前端的框架angular,vue react都有对应的路由插件,在页面渲染方便基本都不用我们前端工程师考虑,基本上我们安装他们的文档配置好路由都能良好的运行,但是这并不意味我们不需要去掌握路由的实现原理。

前言


在前端架构中,路由的设计的合理与否决定了这个项目的是否优秀。现在前端的框架angular,vue react都有对应的路由插件,在页面渲染方便基本都不用我们前端工程师考虑,基本上我们安装他们的文档配置好路由都能良好的运行,但是这并不意味我们不需要去掌握路由的实现原理。

发展


初始的web路由(后端控制)

  • 后台控制路由渲染
  • 页面跳转会重新渲染整个页面
  • 浏览可以自动记录页面路由跳转历史
  • 所有内容需要浏览器向服务器发出请求
  • 服务器端返回对应路由的信息
  • 需要浏览器再次解析返回信息
var express = require('express');
var path = require('path');
var app = express();
// 设置模版渲染引擎路径
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
//nodejs根据路由渲染
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/index', function(req, res, next) {
  res.render('index', { title: 'I am index.' });
});
/* GET home page. */
router.get('/admin', function(req, res, next) {
  res.render('admin', { title: 'I am admin.' });
});
module.exports = router;

总结:简单来说路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源,请求不同的页面是路由的其中一种功能。

单页面路由机制(前端完全控制)

  • 静态文件只需要请求一次
  • 路由跳转页面只需要部分刷新
  • 前端完全设计路由
  • 只有动态数据与后台进行ajax交互
  • 实现方式:hash和history

对比

后台控制 单页面路由机制
加载速度 加载所有数据,重新渲染dom 部分dom渲染以及部分数据
切换效果 重新刷新中间白屏 平滑过渡
动态数据交互 ajax交互 ajax交互
维护成本 前后端沟通 只需要前端控制

从对比中我们可以发现,单页面路由机制无论在维护成本,渲染速度以及用户体验度上都是完胜后台控制设计的路由。这也是目前除了一些老项目还采用后台控制路由的方式其他基本都是采用单页面路由机制渲染的原因。

注:现在的ssr渲染本质上也是属于单页面路由设计,ssr只是采用了后台进行首屏渲染,路由的实际控制权还是在前端的。

单页面路由实现方式

hash实现方式

  • 介绍:还记得刚开始工作时做过公司的官网,那个时候tab的跳转就是直接加载另一个html,但这样会在第一次切换是如果页面资源过大会导致白屏。后来搜索了下解决方案就是所有的tab内容放到一个页面里每个部分加上不同的hash然后点击tab通过hash来显示相应的html。我想这应该是最初的单页面路由实现方式的。
  • 实现方式:利用dom的事件hashchange(当URL的片段标识符更改时,将触发hashchange事件 (跟在#符号后面的URL部分,包括#符号))来监听路由上hash的边从而渲染对应的页面。
// 监听hash变化
window.addEventListener('hashchange', function(event){ 
    console.log('===current hash===')
    console.log(window.location.hash)
    console.log('new url====='+ event.newURL); // hash 改变后的新 url
    console.log('old url====='+ event.oldURL)// hash 改变前的旧 url
},false)
//或者此种写法
window.onhashchange = funcRef;
function funcRef(event){
    ......
}
let hash = window.location.hash; // 获取当前 hash 值
//在html中可以加入一下代码测试
    <div>
        <a href="#/hash1">hash1</a>
        <a href="#/hash2">hash2</a>
        <a href="#/hash3">hash3</a>
    </div>

注:回调函数中的参数说明请查看文档

  • 总结:hash路由可以较好的实现页面的交互,并且对于浏览器有良好的兼容性,但是唯一不足的是他的设计美观上,hash路由中必须带个#,这对于我们线上项目来说是非常不美观的,随着html5的api发展hash在前端路由中必将会被慢慢的取代。

h5的history实现

  • 介绍:在 HTML5 出现之前,浏览器就已经有了 history 对象。但在早期的 history 中只能用于多页面的跳转有以下的api:
history.go(num);// num 正数为前进num页 负数为后退num页
history.forward();// 前进一页
history.back(); //后退一页

在html5的api中history新增了可以控制路由的几个api:

//param1:状态对象 title:标题(保留字段)   url:路由url
history.pushState(stateObj,title,url)
history.replaceState(stateObj,title,url)  // 替换当前路由状态
history.state   // 获取history中的状态对象

注:详细文档请查看mdn文档

  • 实现方式:
待研究过react-router和vue-route源码后再来补上

对比

hash模式的优点:

  1. 兼容性更好
  2. 无需服务器处理非单页应用中的路由
  3. 当前页面刷新不会404(history需要服务器配置)

history 模式的优点:

  1. 路由设计更优雅(没有#)。
  2. 页面中可以继续使用锚点功能
  3. 相同的路由仍然可以放到历史栈中。

注:就个人而言觉得history是前端路由的发展方向

参考

「前端进阶」彻底弄懂前端路由

总结


自工作以来已有四年多了,接触前端这块应该有五年多了,随着学的东西越多约会发现自己对于知识的匮乏,时而焦虑自己笨拙,时而害怕会被时代抛弃,但随着年龄渐渐的增长,生活渐渐的稳定,心态也慢慢平缓,只要你够努力生活必然不会负你。废话不多说了,最后送诸君一句:书山有路勤为径,学海无涯苦作舟。诸君共勉。

相关文章
|
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
649 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
存储 JavaScript 前端开发
前端 vue:路由的高级使用
前端 vue:路由的高级使用
|
移动开发 缓存 前端开发
深入理解前端路由:原理、实现与应用
本书《深入理解前端路由:原理、实现与应用》全面解析了前端路由的核心概念、工作原理及其实现方法,结合实际案例探讨了其在现代Web应用中的广泛应用,适合前端开发者和相关技术人员阅读。
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
472 1
|
前端开发 JavaScript 开发者
qiankun(乾坤)微前端框架简介
qiankun(乾坤)微前端框架简介
2787 1
|
JavaScript 前端开发 API
前端技术分享:Vue.js 动态路由与守卫
【10月更文挑战第1天】前端技术分享:Vue.js 动态路由与守卫
|
资源调度 JavaScript 前端开发
前端vue:路由的基本使用
前端vue:路由的基本使用
|
移动开发 前端开发 JavaScript
浅谈前端路由原理hash和history
该文章详细解析了前端路由的两种模式——Hash模式与History模式的工作原理及其实现方式,并通过实例代码展示了如何在实际项目中运用这两种路由模式。
|
移动开发 缓存 前端开发
构建高效的前端路由系统:从原理到实践
在现代Web开发中,前端路由系统已成为构建单页面应用(SPA)不可或缺的核心技术之一。不同于传统服务器渲染的多页面应用,SPA通过前端路由技术实现了页面的局部刷新与无缝导航,极大地提升了用户体验。本文将深入剖析前端路由的工作原理,包括Hash模式与History模式的实现差异,并通过实战演示如何在Vue.js框架中构建一个高效、可维护的前端路由系统。我们还将探讨如何优化路由加载性能,确保应用在不同网络环境下的流畅运行。本文不仅适合前端开发者深入了解前端路由的奥秘,也为后端转前端或初学者提供了从零到一的实战指南。
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
298 7

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改