在過去的一個多月中,爲了可以更深刻的學習,使用React,瞭解React內部算法,數據結構,我本身,從零開始寫了一個玩具框架。javascript
截止今日,終於能夠發佈第一個版本,由於就在昨天,我跑通了以前的一個小項目。html
其實並非,我並無從新把jsx解析器進行造輪子,我用上了官方的解析器去幫助我解析jsx。vue
在正式開始寫Luy的時候,仍是比較盲目和恐懼的,緣由以下java
setTimeOut
實現的?帶着這些疑問,我要麼是去讀源碼,要麼去找文章,可是真正弄懂這些知識,可能還得動手本身實踐一次我纔會感到安心。react
雖說如今React-like的框架一大堆,你們都想作出本身的mini 化方案,可是製造一個React-like框架仍是超級困難的,可想而知,當初FB工程師們在沒有React的狀況下,是如何造出React的,天才。git
源碼解析很少,並且不完備:不少號稱解析React源碼的文章其實只是很是淺層次的讀一讀,基本上的套路就是,看到哪裏的代碼,網上一帖就成了一篇文章了,不少知識點仍是得親自去打斷電調試React官方版本才能知道。github
好的文章每每只專研了一兩個點,知識點須要慢慢拼湊:網上不乏好文章的,可是好的文章不可能面面俱到。好比有些人研究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最不同的地方。redux
爲何inferno.js這麼快?這個回答裏,其實給出了答案。segmentfault
而Luy
使用的算法是:vue2源碼學習開胃菜,速度上來講很是不錯。
固然我不是吹噓本身的框架有多牛逼,只是實現了這個算法仍是很是開心的。
首先,閱讀React代碼是最直接的方案,可是由於react源碼實在太多了,咱們必須另尋出路。有兩個辦法
我選擇了第二種方式,可能會有人說哎呀,你水平不夠。我認可,我水平確實不行,讀react源碼頭有點痛。
個人方法就是先把東西作出來,而後有了基本思路,再看React源碼你就知道它在幹什麼了。必定要注意的是:框架裏任何一行代碼都是爲了解決某一個或者多個問題而存在的,當你腦海中不能將這些問題和代碼聯繫在一塊兒的時候,你他嗎根本就是在讀天書。因此,選擇一個代碼較少的先讀着,理解react的套路。
固然,還有不少知識點是經過google獲得的,一切來之不易。在讀源碼的過程當中,痛苦可是快樂。
這個項目其實最初的想法只是學習react的內部原理,可是一路走來個人想法也改變了,會盡本身最大的所能,維護下去,而且跟進react官方的變化(說實話createPortal Luy也是支持的!)
畢竟,學習其實就是模仿,創造永遠在模仿的前提下。最近公司準備上一個新的小項目,也是我第一個全權負責的項目,因此我決定上一把個人Luy進行試點(好就好在,Luy更換react實際上是無痛的,實在有什麼問題,直接換react上,哈哈哈
代碼在這裏,框架地址:Luy,總共加起來目前只有1100+行,很少,能夠做爲「react套路學習版本」