Luy 1.0 :一个React-like轮子的诞生

前言

在过去的一个多月中,为了能够更深入的学习,使用React,了解React内部算法,数据结构,我自己,从零开始写了一个玩具框架。

截止今日,终于可以发布第一个版本,因为就在昨天,我跑通了之前的一个小项目。

真的从零开始吗?

其实并不是,我并没有重新把jsx解析器进行造轮子,我用上了官方的解析器去帮助我解析jsx。

在正式开始写Luy的时候,还是比较盲目和恐惧的,原因如下

  • 虽然都知道React是基于虚拟DOM来渲染的,但是虚拟DOM到底是什么?怎么运作的
    React的setState是异步的,这个我们都知道。但是他的异步和setTimeOut的异步是一样的吗?内部是不是用setTimeOut实现的?
  • react的事件合成系统。在react官方中,几万行代码,有差不多40%左右是用于模拟事件的。这部分内容是如何实现的?为什么这么做呢?
  • React列表中的key为什么那么重要?虚拟DOM的优化策略又是什么?

带着这些疑问,我要么是去读源码,要么去找文章,但是真正弄懂这些知识,可能还得动手自己实践一次我才会感到安心。

制造这个玩具框架碰到了很多问题吗?

虽然说现在React-like的框架一大堆,大家都想做出自己的mini 化方案,但是制造一个React-like框架还是超级困难的,可想而知,当初FB工程师们在没有React的情况下,是如何造出React的,天才。

源码解析不多,而且不完备:很多号称解析React源码的文章其实只是非常浅层次的读一读,基本上的套路就是,看到哪里的代码,网上一帖就成了一篇文章了,很多知识点还是得亲自去打断电调试React官方版本才能知道。

好的文章往往只专研了一两个点,知识点需要慢慢拼凑:网上不乏好文章的,但是好的文章不可能面面俱到。比如有些人研究setState,有些人研究生命周期函数,有些人还研究了ref,甚至有些人研究了Vdom。这些知识点很散乱,非常难以拼凑在一起,基本要花一两天才能搞懂一个知识点。

  • 虚拟dom算法:我说实话,虚拟DOM的算法其实并不难,也就是树的递归遍历,在遍历的同时创建和比对。但是奇妙的就是,市面上有一堆虚拟DOM产品,虽然大致相同,但是在处理某些地方的时候不一样,后文会讲。
  • 列表的key:虚拟DOM算法最难的地方。对应的实际场景就是如下:
<ReactComponent>
  <div key='1'></div>
  <div key='2'></div>
  <div key='3'></div>
  <div key='4'></div>
  <div key='5'></div>
  <div key='6'></div>
  ....
</ReactComponent>

一个部分难就难在「更新」上,这也是每一款虚拟DOM最不一样的地方。

为什么inferno.js这么快?这个回答里,其实给出了答案

Luy使用的算法是:vue2源码学习开胃菜,速度上来说非常不错。

当然我不是吹嘘自己的框架有多牛逼,只是实现了这个算法还是非常开心的。

这部分内容给想学习React源码的朋友们

首先,阅读React代码是最直接的方案,但是因为react源码实在太多了,我们必须另寻出路。有两个办法

  • 阅读react代码最初版本(非常的老了...
  • 阅读市面上比较成熟的react-mini框架的代码

我选择了第二种方式,可能会有人说哎呀,你水平不够。我承认,我水平确实不行,读react源码头有点痛。

我的方法就是先把东西做出来,然后有了基本思路,再看React源码你就知道它在干什么了。一定要注意的是:框架里任何一行代码都是为了解决一个或者多个问题而存在的,当你脑海中不能将这些问题和代码联系在一起的时候,你他吗根本就是在读天书。所以,选择一个代码较少的先读着,理解react的套路

当然,还有很多知识点是通过google得到的,一切来之不易。在读源码的过程中,痛苦但是快乐。

这个框架会有未来吗?

这个项目其实最初的想法只是学习react的内部原理,但是一路走来我的想法也改变了,会尽自己最大的所能,维护下去,并且跟进react官方的变化(说实话createPortal Luy也是支持的!)

毕竟,学习其实就是模仿,创造永远在模仿的前提下。最近公司准备上一个新的小项目,也是我第一个全权负责的项目,所以我决定上一把我的Luy进行试点(好就好在,Luy更换react其实是无痛的,实在有什么问题,直接换react上,哈哈哈

最后

代码在这里,框架地址:Luy,总共加起来目前只有1100+行,不多,可以作为「react套路学习版本」

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom