react路由与项目实践 | 青训营笔记

98 阅读8分钟

react路由与项目实践 | 青训营笔记

01 课程简介

image-20230506150216292

02 写过的路由

路由的概念

image-20230506150303777

​ 路由是桥梁,帮助需求方找到供给方,并进行交换

image-20230506150342222

DNS解析寻址、Nignx反向代理、tcp握手级联

parser url:解析url

router Match 匹配对应的路由

response:回溯返回

image-20230506150818839

前端的历史

静态网站

image-20230506151017464

​ 当网页输入url,返回相应的资源,解析头是content-tpye是text/html,说明资源是html。

​ 问题:更新不便利,难以管理

动态网站

image-20230506151326027

左侧是php服务端代码(路由代码的声明) 右侧是html代码

image-20230506151405247

前后端分离

image-20230506151731106

image-20230506151744908

xml筷子,网站数据的展示可以在后端加载后发起接口请求,异步拿到结果,放在前端作展示

html放在服务端托管

js文件由工程打包出来更新到html模板上

单页应用

image-20230506152221849

将共属于同一个频道多张页面的代码仓库整合在一起,做到代码复用;同时将多页的代码构建打包一个bundle资源,通过路由判断究竟哪一个页面要被展现出来,资源包也只会在网页加载的时候进行等待,后续的跳转页面都可以做到及时响应,不会出现白屏。

image-20230506152637917

前端侧会出现路由的概念

image-20230506152656282

03 React-Router

image-20230506152737055

react-router是核心包,dom面向web前端

image-20230506152748997

history负责管理浏览器url的前进后退,react主要提供的是router和route组件,决定视图如何渲染

image-20230506152930311

解析url———url和路由进行匹配———渲染

单页应用部分

image-20230506153237448

Parser Url(history)

image-20230506153346986

memoryhistory 没有浏览器的环境下,比如像test或者reactnative环境下,把location和url 的相关信息存在内存里面

browserhistory 是常见的history

hashrouter 是不想服务端参与,不想 location被服务器感知 就做纯浏览器路由

image-20230506153702150

这三个方法都返回了一个history实例

这里是一个hash history源码

第一个方框里,它依旧调用了windows里面的history,还是借助的ecma标准规范去实现的

第二个方框里,浏览器标准提供的addeventlistener中的popstate和hashchange这两个监听函数去感知到url的变动,之后进行处理抛出去的对应的实例,关于url相关信息和如何去操作url

image-20230506153739687

总结来说:感知并操作url

image-20230506154403843

router match

image-20230506154525881

是用react route做承接

源码

第11行这里创建了一个history,就是上述history返回的一个实例,以标准组件化的形式向下传递

image-20230506154648283

history实例已经注册到了route组件这里,而history还提供了一系列对外的方法,其中有一个listener方法,通过对history的listen做出的一些回调就能立马感知到整个网站发生了什么变化 ,同时借助react中的setstate变更我们的location,再将变更后的信息透传到react的provider里面中去,然后对应的信息由下游嵌套的children层的consumer进行消费

image-20230506154811470

当包裹route层的router透传下来了一系列location的信息,传递下来url是什么,对比当前声明的url看是否一致

image-20230506161250167

总结一下,1.从history开始,暴露封装后history的方法,抹平hash和history的差异

​ 2.返回一个会话管理的实例,灌注给了最外层router的这个组件,这个组件因为是基于react compoment,所以具有reacr生命周期,同时又具有单向数据流向下传递的能力,在router内部的话同时又去监听了history的变动,变动完之后通过setstate给到了contextprovider这一层,并且把变动的信息透传给了嵌套层的里面的consumer,即route组件,在进行url匹配之后,在通过setstate最后去决定页面如何渲染

image-20230506161501338

如果服务端没有定义a/b/v这样的一个router,那么传统的url打到服务端的时候应该会返回一个404

解决方法就是在后端路由定义一个通配符,当通道以根目录为首或以某一个配置时为目录时,那永远只返回一个contorler,而这一块的处理函数,路由对应的解析就完全在前端里面发生了

image-20230506162620156

04 路由项目实践

image-20230506163412131

image-20230506163514168

应用开发构建交付进行切割瘦身

image-20230506163930555

image-20230506163942930

在微前端里面路由扮演什么?

以single spa的源码来演示

image-20230506164205219

调用浏览器上原生的a---listener,感知到浏览器上发生的变化,知道url发生变化之后,加载啥子应用呢

image-20230506164438726

通过rerouter中的getappchanges感知router的变化,从而知道哪些app需要加载是需要进行卸载的

getappchanges的源码:

核心就是拿到了windows上的location,拿完之后在单个的app里面逐个进行判断,判断在当前的路由状态下,当前这个子应用是否需要进行渲染。

image-20230506164654071

image-20230506164902752

包含两个页面,一个homepage和errorreoprtpage ,home访问的uv(电脑客户端访问数)很高,error的pv(页面访问数)极低,但是他的体积很大。存在一些体积较大的单个页面不给他加载

image-20230506165348124

进行异步懒加载

数据加载处理耗时(内容多,接口多)

image-20230506165620856

如果网站的变更频次比较低,可以预先将网站内容生成好分发到cdn上去,所以之后加载的资源直接是从cdn上分发的,不用再经过ajax和fetch,通过bff把数据做提前聚合直接透出给前端,避免在前端侧进行很多api请求

课程总结

image-20230506170205598