范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

ReactHooks的实现必须依赖Fiber么?

  React 的 hooks 是在 fiber 之后出现的特性,所以很多人误以为 hooks 是必须依赖 fiber 才能实现的,其实并不是,它们俩没啥必然联系。
  现在,不止 react 中实现了 hooks,在 preact、react ssr、midway 等框架中也实现了这个特性,它们的实现就是不依赖 fiber 的。
  我们分别来看一下这些不同框架中的 hooks 都是怎么实现的:
  react 如何实现 hooks
  react 是通过 jsx 描述界面的,它会被 babel 或 tsc 等编译工具编译成 render function,然后执行产生 vdom:
  图片
  这里的 render function 在 React17 之前是 React.createElement:
  图片
  在 React 17 之后换成了 jsx:
  图片
  这个 jsx-runtime 会自动引入,不用像之前那样每个组件都要保留一个 React 的 import 才行。
  render function 执行产生 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 链表不同的元素上存取值,这就是 react hooks 的原理。
  这个链表有创建阶段和更新阶段,所以你会发现 useXxx 的最终实现都分为了 mountXxx 和 updateXxx:
  图片
  这里的 mount 阶段就是创建 hook 节点并组装成链表的:
  图片
  会把创建好的 hook 链表挂到 fiber 节点的 memorizedState 属性上。
  那更新的时候自然也就能从 fiber 节点上取出这个 hook 链表:
  图片
  这样在多次渲染中,useXxx 的 api 都能在 fiber 节点上找到对应的 memorizedState。
  这就是 react hooks 的原理,可以看到它是把 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 和组件渲染强相关,所以存放在了这些结构上。
  像 react ssr 实现 hooks,就既没有存在 fiber 上,也没有存在 vdom 上:
  react ssr 如何实现 hooks
  其实 react-dom 包除了可以做 csr 外,也可以做 ssr:
  csr 时使用 react-dom 的 render 方法:
  图片
  ssr 的时候使用 react-dom/server 的 renderToString 方法或 renderToStream 方法:
  图片
  大家觉得 ssr 的时候会做 vdom 到 fiber 的转换么?
  肯定不会呀,fiber 是为了提高在浏览器中运行时的渲染性能,把计算变成可打断的,在空闲时做计算,才引入的一种结构。
  服务端渲染自然就不需要 fiber。
  不需要 fiber 的话,它把 hook 链表存放在哪里呢?vdom 么?
  确实可以放在 vdom,但是其实并没有。
  比如 useRef 这个 hooks:
  图片
  它是从 firstWorkInProgressHook 开始的用 next 串联的一个链表。
  图片
  而 firstWorkInProgressHook 最开始用 createHook 创建的第一个 hook 节点:
  图片
  并没有挂载到 vdom 上。
  为什么呢?
  因为 ssr 只需要渲染一次呀,又不需要更新,自然没必要挂到 vdom 上。
  只要每次处理完每个组件的 hooks 就清空一下这个 hook 链表就行:
  图片
  图片
  图片
  所以,react ssr 时,hooks 是存在全局变量上的。
  对比下 react csr 和 ssr 时的 hooks 实现原理的区别:
  csr 时会从 vdom 创建 fiber,用于把渲染变成可打断的,通过空闲调度来提高性能,而 ssr 时不会,是 vdom 直接渲染的
  csr 时把 hooks 保存到了 fiber 节点上,ssr 时是直接放在了全局变量上,每个组件处理完就清空。因为不会用第二次了
  csr 时会把 hook 的创建和更新分为 mount 和 update 两个阶段,而 ssr 因为只会处理一次,只有创建阶段
  hooks 的实现原理其实不复杂,就是在某个上下文中存放一个链表,然后 hooks api 从链表不同的元素上访问对应的数据来完成各自的逻辑。这个上下文可以是 vdom、fiber 甚至是全局变量。
  不过 hooks 这个思想还是挺火的,淘宝出的服务端框架 midway 就在引入了 hooks 的思想:
  midway 如何实现 hooks
  midway 是一个 Node.js 框架:
  图片
  服务端框架自然就没有 vdom、fiber 这种结构,不过 hooks 的思想并不依赖这些,实现 hooks 的 api 只需要在某个上下文放一个链表就行。
  midway 就实现了类似 react hooks 的 api:
  图片
  图片
  具体它这个 hook 链表存在哪我还没看,不过我们已经掌握 hooks 的实现原理了,只要有个上下文存放 hook 链表就行,在哪都可以。
  总结
  react hooks 是在 react fiber 架构之后出现的特性,很多人误以为 hooks 必须配合 fiber 才能实现,我们分别看了 react、preact、react ssr、midway 中的 hooks 的实现,发现并不是这样的:
  react 是把 vdom 转成 fiber,然后把 hook 链表存放到了 fiber.memorizedState 属性上,通过 next 串联
  preact 没有实现 fiber,它是把 hook 链表放到了 vnode._component._hooks 属性上,数组实现的,通过下标访问
  react ssr 时不需要 fiber,但是也没有把 hook 链表挂到 vdom 上,而是直接放在了一个全局变量上,因为只需要渲染一次,渲染完一个组件就清空这个全局变量就行
  midway 是一个 Node.js 框架,它也实现了 hooks 类似的 api,具体放在哪我们没深入,但是只要有个上下文存放 hook 链表就行
  所以,react hooks 必须依赖 fiber 才能实现么?
  明显不是,搭配 fiber、搭配 vdom、搭配全局变量,甚至任何一个上下文都可以。在框架中引入 hooks 的 api 并不难。

蓝牙耳机质检报告办理产品质量检验报告(质检报告),是对产品检测之后出具的一份专业客观的产品质量证明文件,此类报告由第三方质检机构出具,主要应用于电商平台的入驻及新品类产品上架发布。产品质量检验报告能全CE认证有效期是多久要看一个产品的CE认证证书是否过期,主要是看两点1从CE认证法规来看。CE认证的有效期要看产品的对应法规的,CE认证的法规也是随着市场产品的更新在不断的更新着的,每一个新的法规更新法国食品级安全法规DGCCRF法国食品级测试1。DGCCFR(法国食品级)介绍FrenchDGCCRF是法国食品级安全法规的英文简写。销往法国的这类产品,除符合欧盟Regulation(EC)No19352004法规要求外,无线SRRC认证是什么?如何办理?一中国无线电型号核准(SRRC)简述SRRC即国家无线电管理委员会(StateRadioRegulationCommittee,SRRC),SRRC安全认证是由国家无线电管理局核发手持风扇USB风扇日本PSE认证办理流程PSE认证介绍PSE认证是日本强制性安全认证,用以证明电机电子产品已通过日本电气和原料安全法或国际IEC标准的安全标准测试。日本的DENTORL法(电器装置和材料控制法)规定,49羽毛球拍第三方CMACNAS检测报告羽毛球拍一般由拍头拍杆拍柄及拍框与拍杆的接头构成。一支球拍的长度不超过68厘米,其中球拍柄与球拍杆长度不超过42厘米,拍框长度不超过25厘米,宽为20厘米,随着科学技术的发展,球拍限200台!Jeep牧马人高地阿拉斯加极光绿特别版10月29日预售日前,Jeep官方宣布,旗下的牧马人车型将推出高地阿拉斯加极光绿特别版。据悉,新车将于10月29日预售,限量200台。新车依旧采用牧马人经典的外观设计,前格栅亦采用更为立体的设计,饱和式投入千人百亿,哪吒汽车自主研发上再出大动作近日,哪吒汽车联合创始人兼首席执行官张勇在接受媒体采访时表示,哪吒汽车正有序推进自主研发进度,打造智能科技的核心竞争力。同时,在深度自研的基础上,与华为地平线等智能化领军企业展开全运动必备价格实惠南卡RunnerCCII骨传导运动耳机前言南卡这个品牌的耳机我已经使用过很多款了,可以说是运动耳机中的翘楚,不同于其他蓝牙耳机,南卡RunnerCCII主打的是骨传导运动耳机,南卡之前也有类似的产品,比如之前的南卡南卡电动牙刷CE认证证书有效期是多长时间?电动牙刷通过电动机芯的快速旋转或振动,使刷头产生高频振动,瞬间将牙膏分解成细微泡沫,深入清洁牙缝,与此同时,刷毛的颤动能促进口腔的血液循环,对牙龈组织有按摩效果。是许多发达国家广泛霸气!跨越速运重磅承诺限时未达,全额退款随着双十一临近,各大电商平台的GMV以及快递订单量持续暴涨,海量的物流运力资源也提前被各大电商巨头抢占,B端企业运力紧缺的问题愈发严重。众所周知,C端电商企业能收获如此大规模的订单
号外!华为认证考试券代金券上线京东啦为帮助广大学生及ICT从业者拓宽知识领域,检验学习成果,提升自我价值,华为企业业务京东自营官方旗舰店正式推出华为认证考试券和华为ICT学院认证考试代金券,考生可通过京东商城在线购买理论加实践GaussDB(forMySQL)数据库知识快速学随着互联网大数据AI和数据挖掘等技术的不断发展,数据库技术和产品日新月异,云端数据库已经成为一种重要的数据库类型。作为华为云新一代高性能企业级分布式数据库,GaussDB(forMCloud认证考试相关问题,答案在这Cloud认证升级常见问题解答共分3期,第一期Cloud认证重磅升级,快来看看都有哪些变化,本期为第二期Cloud认证考试相关问题如何考取Cloud各层级的认证?是否要通过华为云H注意!华为路由交换认证产品公告尊敬的客户及广大考生为了更好地协助您应对市场变化和技术发展创新的挑战,华为特将HuaweiRoutingSwitchingCertification华为路由交换认证产品关键生命周期请查收!Cloud认证发布时间点及新旧认证并行政策Cloud认证升级常见问题解答共分3期,第一期Cloud认证重磅升级,快来看看都有哪些变化,第二期Cloud认证考试相关问题,答案在这!本期为第三期Cloud认证发布与并行策略问题10月底,华为将正式发布这门认证华为认证HCIAMDCApplicationDeveloperV1。0(中文版)预计将于2021年10月30日正式对外发布。为了帮助您做好学习培训和考试计划,现进行预发布通知,请您从这里开启你的AI之路人工智能技术2021年8月,华为发布6本华为高校人才培养指定教材华为ICT学院系列教材丛书。丛书既可作为华为ICT学院相关专业课程的教学用书,也可作为学生考取对应技术方向HCIA认证的参考书。美联储降息仿佛打开了潘多拉的魔盒,股市动荡,我们如何避险投资美联储在7月份议息会议宣布降息25个基点,将联邦利率下调至22。5的水平,原本这次降息符合市场预期,此前市场已经将此消息消化,利好股市债市楼市黄金等资产,市场表现平稳。谁料鲍威尔语贝佐斯履新世界首富个人财富新高,美国债务上限危机卷土重来周一,美股持续强劲涨势,标普纳指不断刷新新高,科技股领涨,亚马逊市值更是屡创收盘纪录新高,CEO贝佐斯不但成为世界首富,而且超越比尔盖茨财富巅峰时刻的峰值,履新个人财富历史最高点。棚改货币化安置还能走多远?三四线房价走向何方棚户改造作为三四线城市去库存,货币摊派的重要途径,在一段时间内还会持续,但随着库存压力减小,引起三四线城市房价非理性上涨后,棚户改造将逐步收紧,政策会更加严格,前一段传闻国开行叫停中秋拍月亮,这份拍月技巧请收下首先祝大家中秋快乐,阖家欢乐!一辅助APP一般拍星空月亮等题材我会用巧摄专业版Planit,有了这个APP可以更好的知道黑夜开始结束时间,月亮升起降落时间,这些对拍摄很有帮助。不过