最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • React 设计模式

    正文概述 掘金(? 蘑菇放辣椒)   2021-08-13   460

    三大模块

    我们创建一个Holle World,看一下浏览器的调用栈。你会发现react执行了一大堆函数,我们将这些函数分成调度、协调、渲染三大模块,这三大模块就是接下来要研究的。

    React 设计模式

    设计理念

    在学习之前我们要将思路转变,我们作为开发者总是会去关心API上的事情,但是作为一个框架的开发人员,应该是重点关心设计理念。

    如何设计,决定着这个框架的最终走向,这是十分重要的。

    引用官网说的一句话:React是用 JavaScript 构建 快速响应 的大型应用程序。

    那他是如何做到快速响应的?开发中是什么导致我们的应用不流畅呢?

    可能来源于:大量的计算或者网络请求的延迟。总结起来就是:计算能力与网络延迟。

    计算能力关乎到我们的CPU。网络延迟关乎到IO。这两个是我们的瓶颈。

    React 解决CPU瓶颈的办法

    主流浏览器的刷新频率是60HZ(也就是一帧),也就是16.6ms刷新一次。在这16.6ms中浏览器会依次执行:JavaScript脚本、样式布局、样式绘制。

    我们想一下,如果JavaScript脚本执行时间超过16.6ms(也就是一帧),会发生什么情况?

    答案是:在当前这一帧中就没有时间进行样式布局、样式绘制。会出现掉帧的情况,从而导致卡顿。比如,浏览器滚动不流畅,输入框输入的字符不能及时响应在页面上。

    前端的解决办法大部分是使用防抖或节流的方式,进而限制一定时间内浏览器的响应变化。这种方式是治标不治本的办法。

    React给出的方案:将 同步的更新 转变成 异步可中断的更新

    异步可中断的更新

    如果某一部分的执行时间特别长,React 会中断自己的工作,并将控制权交给浏览器。等待下一帧自己预留的那部分时间到来之后,React 会继续之前被中断的工作。

    这样,浏览器就会有时间进行样式布局、样式绘制。从而达到减少掉帧的可能性。

    React 解决IO瓶颈的办法

    文档上给出的是:将人机交互研究的结果整合到真实的UI中。比如,在屏幕之间切换时显示过多的中间加载状态会使切换的速度变慢。

    新旧的架构对比

    新的架构解决了老架构什么问题?新架构相对于老架构的优点是什么?

    老的架构

    老架构是分成两个部分:

    • 决定渲染什么组件 ---- Reconclier(协调器)
    • 将组件渲染到视图中 ---- Renderer(渲染器)

    Reconclier(协调器)作用:负责本次更新哪些组件被渲染。Diff算法就是发生在Reconclier(协调器)中。

    Diff算法中会将上次更新的组件与本次更新的组件做一个对比,最终只有变化的部分被渲染到视图中。

    经过Diff算法决定渲染的组件会被交给Renderer(渲染器),渲染到视图中。

    不同的Renderer(渲染器)会将组件渲染到不同的数组环境的视图中。比如:

    • ReactDom渲染器,会将组件渲染到DOM/SSR中。
    • ReactNative渲染器,会将组件渲染为APP原生组件。
    • ReactTest渲染器,会将组件渲染为纯JS对象,用于测试。
    • ReactArt渲染器,会将组件渲染到canvas/svg上。

    在React老的架构里,如果页面上的UI发生改变,首先会去执行Reconclier(协调器),然后再去执行Renderer(渲染器)。这两个是交替且同步执行的。

    React 设计模式

    上面这张图,我希望点击button按钮,左页面每个li变为2、4、6。同时不希望Renconclier(协调器)与Renderer(渲染器)同步执行。渲染器在渲染1变为2之后,去中断发生。

    显然老的架构是无法支持的。

    新的架构

    由于老的架构无法中断发生,React16重写了架构。将原先的 同步更新 改为 异步可中断更新

    由于新的架构是可中断的,React加入了一个模块对这些异步更新进行管理。如下三部分:

    • 调度更新 ---- Scheduler(调度器)
    • 决定需要更新什么组件 ---- Reconclier(协调器)
    • 将组件更新到视图中 ---- Renderer(渲染器)

    老的架构中,UI发生更新之后直接会交给Reconclier(协调器)处理。

    新的架构中,UI发生更新会先交给Scheduler(调度器)进行优先级比较,优先级高的会交给Reconclier(协调器)进行处理。

    在协调器采用Diff算法时,产生了更高优先级的更新 Reconclier(协调器)会中断,然后执行更高优先级的更新。

    由于Scheduler(调度器)与Reconclier(协调器)都是在内存中,用户并不会感知到被中断的操作过程。

    当某次更新完成了在协调器中的工作时,Reconclier(协调器)会通知Renderer(渲染器),本次更新中有哪些组件需要进行UI渲染操作。最后会由Renderer(渲染器)来分别执行视图的渲染操作。

    React 设计模式

    上面这张图是产生更新时,三部分是如何相互工作的。

    Scheduler(调度器):评定优先级,将当前评定的高优先级交给Reconclier(协调器)。

    Reconclier(协调器):接收到更新之后创建虚拟DOM,然后给要更新的虚拟DOM打上updata标记,最后交给Renderer(渲染器)。

    Renderer(渲染器):接收到通知,查看哪些虚拟DOM被标记了updata。对应的执行更新DOM操作。

    总结

    • 老架构如何运行的?有什么缺点?
    • 新架构如何解决快速响应问题?
    • 新架构的Scheduler(调度器)、Reconclier(协调器)、Renderer(渲染器)三部分如何配合完成可中断的异步更新的?
    • Diff算法做了什么?

    最后,感谢大家支持啦~~~~~~~~~


    起源地下载网 » React 设计模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元