安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

ReactHooks的实现必须依赖Fiber么?

9月21日 不将就投稿
  React的hooks是在fiber之后出现的特性,所以很多人误以为hooks是必须依赖fiber才能实现的,其实并不是,它们俩没啥必然联系。
  现在,不止react中实现了hooks,在preact、reactssr、midway等框架中也实现了这个特性,它们的实现就是不依赖fiber的。
  我们分别来看一下这些不同框架中的hooks都是怎么实现的:
  react如何实现hooks
  react是通过jsx描述界面的,它会被babel或tsc等编译工具编译成renderfunction,然后执行产生vdom:
  图片
  这里的renderfunction在React17之前是React。createElement:
  图片
  在React17之后换成了jsx:
  图片
  这个jsxruntime会自动引入,不用像之前那样每个组件都要保留一个React的import才行。
  renderfunction执行产生vdom:
  图片
  vdom的结构是这样的:
  图片
  在React16之前,会递归渲染这个vdom,增删改真实dom。
  图片
  而在React16引入了fiber架构之后就多了一步:首先把vdom转成fiber,之后再渲染fiber。
  图片
  vdom转fiber的过程叫做reconcile,最后增删改真实dom的过程叫做commit。
  为什么要做这样的转换呢?
  因为vdom只有子节点children的引用,没有父节点parent和其他兄弟节点sibling的引用,这导致了要一次性递归把所有vdom节点渲染到dom才行,不可打断。
  万一打断了会怎么样呢?因为没有记录父节点和兄弟节点,那只能继续处理子节点,却不能处理vdom的其他部分了。
  所以React才引入了这种fiber的结构,也就是有父节点return、子节点child、兄弟节点sibling等引用,可以打断,因为断了再恢复也能找到后面所有没处理过的节点。
  fiber节点的结构是这样的:
  图片
  这个过程可以打断,自然也就可以调度,也就是schdule的过程。
  所以fiber架构就分为了schdule、reconcile(vdom转fiber)、commit(更新到dom)三个阶段。
  函数组件内可以用hooks来存取一些值,这些值就是存在fiber节点上的。
  比如这个函数组件内用到了6个hook:
  图片
  那么对应的fiber节点上就有个6个元素的memorizedState链表:
  图片
  通过next串联起来:
  图片
  不同的hook在memorizedState链表不同的元素上存取值,这就是reacthooks的原理。
  这个链表有创建阶段和更新阶段,所以你会发现useXxx的最终实现都分为了mountXxx和updateXxx:
  图片
  这里的mount阶段就是创建hook节点并组装成链表的:
  图片
  会把创建好的hook链表挂到fiber节点的memorizedState属性上。
  那更新的时候自然也就能从fiber节点上取出这个hook链表:
  图片
  这样在多次渲染中,useXxx的api都能在fiber节点上找到对应的memorizedState。
  这就是reacthooks的原理,可以看到它是把hook存在fiber节点上的。
  那preact有什么不同呢?
  preact如何实现hooks
  preact是兼容react代码的更轻量级的框架,它支持class组件和function组件,也支持了hooks等react特性。不过它没有实现fiber架构。
  因为它主要考虑的是体积的极致(只有3kb),而不是性能的极致。
  图片
  刚才我们了解了react是把hook链表存放在fiber节点上的,那preact没有fiber节点,会把hook链表存在哪呢?
  其实也很容易想到,fiber只是对vdom做了下改造用于提升性能的,和vdom没啥本质的区别,那就把hook存在vdom上不就行了?
  确实,preact就是把hook链表放在了vdom上。
  比如这个有4个hooks的函数组件:
  图片
  它的实现就是在vdom上存取对应的hook:
  图片
  图片
  它没有像react那样把hook分为mount和update两个阶段,而是合并到一起处理了。
  如图,它把hooks存在了component。hooks的数组上,通过下标访问。
  这个component就是vdom上的一个属性:
  图片
  也就是把hooks的值存在了vnode。component。hooks的数组上。
  对比下react和preact实现hooks的差异:
  react中是把hook链表存放在fiberNode。memorizedState属性上,preact中是把hook链表存放在vnode。component。hooks属性上
  react中的hook链表通过next串联,preact中的hook链表就是个数组,通过下标访问
  react把hook链表的创建和更新分离开,也就是useXxx会分为mountXxx和updateXxx来实现,而preact中合并在一起处理的
  所以说,hooks的实现并不依赖fiber,它只不过是找个地方存放组件对应的hook的数据,渲染时能取到就行,存放在哪里是无所谓的。
  因为vdom、fiber和组件渲染强相关,所以存放在了这些结构上。
  像reactssr实现hooks,就既没有存在fiber上,也没有存在vdom上:
  reactssr如何实现hooks
  其实reactdom包除了可以做csr外,也可以做ssr:
  csr时使用reactdom的render方法:
  图片
  ssr的时候使用reactdomserver的renderToString方法或renderToStream方法:
  图片
  大家觉得ssr的时候会做vdom到fiber的转换么?
  肯定不会呀,fiber是为了提高在浏览器中运行时的渲染性能,把计算变成可打断的,在空闲时做计算,才引入的一种结构。
  服务端渲染自然就不需要fiber。
  不需要fiber的话,它把hook链表存放在哪里呢?vdom么?
  确实可以放在vdom,但是其实并没有。
  比如useRef这个hooks:
  图片
  它是从firstWorkInProgressHook开始的用next串联的一个链表。
  图片
  而firstWorkInProgressHook最开始用createHook创建的第一个hook节点:
  图片
  并没有挂载到vdom上。
  为什么呢?
  因为ssr只需要渲染一次呀,又不需要更新,自然没必要挂到vdom上。
  只要每次处理完每个组件的hooks就清空一下这个hook链表就行:
  图片
  图片
  图片
  所以,reactssr时,hooks是存在全局变量上的。
  对比下reactcsr和ssr时的hooks实现原理的区别:
  csr时会从vdom创建fiber,用于把渲染变成可打断的,通过空闲调度来提高性能,而ssr时不会,是vdom直接渲染的
  csr时把hooks保存到了fiber节点上,ssr时是直接放在了全局变量上,每个组件处理完就清空。因为不会用第二次了
  csr时会把hook的创建和更新分为mount和update两个阶段,而ssr因为只会处理一次,只有创建阶段
  hooks的实现原理其实不复杂,就是在某个上下文中存放一个链表,然后hooksapi从链表不同的元素上访问对应的数据来完成各自的逻辑。这个上下文可以是vdom、fiber甚至是全局变量。
  不过hooks这个思想还是挺火的,淘宝出的服务端框架midway就在引入了hooks的思想:
  midway如何实现hooks
  midway是一个Node。js框架:
  图片
  服务端框架自然就没有vdom、fiber这种结构,不过hooks的思想并不依赖这些,实现hooks的api只需要在某个上下文放一个链表就行。
  midway就实现了类似reacthooks的api:
  图片
  图片
  具体它这个hook链表存在哪我还没看,不过我们已经掌握hooks的实现原理了,只要有个上下文存放hook链表就行,在哪都可以。
  总结
  reacthooks是在reactfiber架构之后出现的特性,很多人误以为hooks必须配合fiber才能实现,我们分别看了react、preact、reactssr、midway中的hooks的实现,发现并不是这样的:
  react是把vdom转成fiber,然后把hook链表存放到了fiber。memorizedState属性上,通过next串联
  preact没有实现fiber,它是把hook链表放到了vnode。component。hooks属性上,数组实现的,通过下标访问
  reactssr时不需要fiber,但是也没有把hook链表挂到vdom上,而是直接放在了一个全局变量上,因为只需要渲染一次,渲染完一个组件就清空这个全局变量就行
  midway是一个Node。js框架,它也实现了hooks类似的api,具体放在哪我们没深入,但是只要有个上下文存放hook链表就行
  所以,reacthooks必须依赖fiber才能实现么?
  明显不是,搭配fiber、搭配vdom、搭配全局变量,甚至任何一个上下文都可以。在框架中引入hooks的api并不难。
投诉 评论 转载

SqlFly的介绍介绍一个好用的Java语言orm框架,在线文档:http:sqlfly。dev33。cn特点对内将jdbc繁琐步骤进行封装,并对外提供简洁好用的API自动将查询结果集映射……自带万元级音响,新一代华为智慧屏V系列发布提到帝瓦雷大家不会陌生,作为全球TOP3专业音响品牌,其凭借颠覆性的模拟数字混合放大技术成为了备受赞誉的音频技术创新企业。2019年,华为联合帝瓦雷打造了SoundX智能音箱,……这条赛道一年融资20起!它帮企业搭建乐高,如何赢得超20万客在刚刚过去的2021年,低代码无代码可以说成为了企业服务领域为数不多的真正风口。从资本下场情况看,该赛道创业公司融资热从年初持续到年终,甚至多家公司获得23轮以上的融资。……iPhone爆史诗级漏洞!知道电话就被监控专家惊叹国家级骇客iPhone爆重大漏洞,连Google也称这是有史以来最高明的漏洞。Google旗下资安团队ProjectZeroteam解析一款监控软件Pegasus骇进iPhone的手法,……ReactHooks的实现必须依赖Fiber么?React的hooks是在fiber之后出现的特性,所以很多人误以为hooks是必须依赖fiber才能实现的,其实并不是,它们俩没啥必然联系。现在,不止react中实现了……打造数字基座实现多维服务管理中欧启动智慧校园项目图说:中欧国际工商学院智慧校园项目启动仪式采访对象供图新民晚报讯(记者易蓉)今天,中欧国际工商学院启动智慧校园,将基于新型网络基础设施,运用人工智能、云计算、大数据等新技……利用深度视觉技术提供3D重建服务,众趣科技想做中国的matt随着VR技术的普及,将实体场景数字化重建变得越来越重要。这条赛道上国外最知名的公司非Matterport莫属,通过提供专业相机、云服务帮助企业快速进行大场景3D重建,今年8月已……三星三季度在韩智能手机市场份额扩至85,折叠屏新机成最大功臣据韩国《亚洲经济》微博12月6日消息,市场调查机构CounterpointResearch于6日表示,三星电子三季度在韩国智能手机市场份额为85,环比扩大14个百分点。分析称,……3A中端甜品主机怎么装?可以参考一下这套配置AMD推出了新甜品卡RX6600XT之后,玩家打造甜点级游戏主机又有了新选择。趁着RX6600XT的热度,赶紧给大家带来一套采用了RX6600XT的3A配置,对这款显卡感兴趣的……苹果汽车正和多家亚洲车企进行合作,预计2024年交付汽车据报道,苹果公司正着眼于亚洲各个供应商,苹果公司需要为AppleCar奠定基础。据报道,这家科技巨头正计划访问丰田,讨论AppleCar的量产,据车武林预计苹果汽车将于2024……雷军可能没料到,小米被突然截胡,高通这次可能也要输了?随着时间进入12月份后,2021年的手机行业也随之进入了尾声,11月国内新机发布的数量也是屈指可数,各家厂商都在为明年的旗舰机型憋着一口劲。不过在这种情况下,高通的出现又让国内……推荐10部嵌入式Linux开发有关的电子书《嵌入式Linux软硬件开发详解》嵌入式Linux应用开发详解立足于嵌入式Linux平台,侧重于实际开发应用,是一本结合嵌入式Linux技术最新发展潮流和编者多年开发经验……
入手一款既能远程控制又能统计电量的智能插线板曝接近真全面屏三星S23Ultra,三星S22彻底让路,价格外媒太空互联网首批卫星成功发射12GB512GB5020mAh,官方直降4000元,网友幸电脑上有哪些免费的视频制作剪辑软件?港股25日跌2。47收报21404。88点为何越来越多的人,社交从QQ换成微信?原因很现实,望周知!教你如何挑选对讲机光有大屏幕不行,配上小鸟K7才叫家庭影院新年新市场,折叠屏产品越来越多,到底值不值得入手?怎么选?非对称加密算法什么专业未来有前途?夸夸我的同桌要提高员工培训效果的分餐制培训法12nm16核龙芯3系列最新处理器即将出货关于我的好朋友作文900字你的电脑上网慢只要改了它就可以了怎么让皮肤变白变嫩小学语文修辞手法专项练习及答案知识点各世界十大未解之谜至今科学家还在研究万圣节怎么化妆?历史上刘武周怎么死的李渊与刘武周谁先起兵介绍几种牛鞭的烹饪方法以达到更好的壮阳效果营销团队宣传口号

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利