Luy 1.0 :一个React-like轮子的诞生
前言
在過去的一個多月中,為了能夠更深入的學習,使用React,了解React內部算法,數據結構,我自己,從零開始寫了一個玩具框架。
截止今日,終于可以發布第一個版本,因為就在昨天,我跑通了之前的一個小項目。
- 預覽地址:動態簡歷luy版本
- 倉庫地址:喜歡的給點星星哦~
- 框架地址:Luy
真的從零開始嗎?
其實并不是,我并沒有重新把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算法最難的地方。對應的實際場景就是如下:
這一個部分難就難在「更新」上,這也是每一款虛擬DOM最不一樣的地方。
為什么inferno.js這么快?這個回答里,其實給出了答案。
而Luy使用的算法是:vue2源碼學習開胃菜,速度上來說非常不錯。
當然我不是吹噓自己的框架有多牛逼,只是實現了這個算法還是非常開心的。
這部分內容給想學習React源碼的朋友們
首先,閱讀React代碼是最直接的方案,但是因為react源碼實在太多了,我們必須另尋出路。有兩個辦法
- 閱讀react代碼最初版本(非常的老了...
- 閱讀市面上比較成熟的react-mini框架的代碼
我選擇了第二種方式,可能會有人說哎呀,你水平不夠。我承認,我水平確實不行,讀react源碼頭有點痛。
我的方法就是先把東西做出來,然后有了基本思路,再看React源碼你就知道它在干什么了。一定要注意的是:框架里任何一行代碼都是為了解決某一個或者多個問題而存在的,當你腦海中不能將這些問題和代碼聯系在一起的時候,你他嗎根本就是在讀天書。所以,選擇一個代碼較少的先讀著,理解react的套路。
- @司徒正美 的anujs:一款了不起的mini 化react方案,支持到IE6。代碼及其好懂和老練,框架如其簽名:javascript魔法師。如果閱讀過anujs的朋友,一定也會發現Luy部分代碼很像anujs,沒錯,有很多代碼我都直接抄的,因為 @司徒正美 的代碼寫的真的很好。RubyLouvre/anu,是世界上最接近react官方的產品了。
- Inferno.js:另外一款出名的react lite框架,Vdom的速度是最高的,一系列的優化方案非常值得學習
- developit/preact:大名鼎鼎的preact,速度快,體積小而著稱。gzip完只有3k,不過對react官方的支持其實非常的差。比較搞笑的是,當你支持react的輪子的時候,使用compact功能時,其性能大大下降!(哈哈哈哈哈哈哈哈哈笑死我了)
- @胡子大哈 :他寫的React.js 小書,非常的棒,給予了我造react的最基本知識。
- 40 行代碼內實現一個 React.js: @胡子大哈 實現的作品
- snabbdom/snabbdom:其實就是vue的vdom了
- preact源碼學習(1) - 個人文章 - SegmentFault
- preact源碼學習(2) - 個人文章 - SegmentFault
- preact源碼學習(3) - 個人文章 - SegmentFault
- preact源碼學習(4) - 個人文章 - SegmentFault:這幾片文章的作者都是 @司徒正美 ,全面的解析和官方的對比。牛x到了極點。
- Build your own React.js · GitBook:一篇外國的文章,看完你基本可以造出一個可以setState的react了
- Build Your Own React:第一次渲染:本文也很重要,介紹了react component的幾種模式
- @程墨Morgan :《深入淺出react和redux》一書非常的實在,我也推薦過很多次了,對我理解react和redux很有幫助.
當然,還有很多知識點是通過google得到的,一切來之不易。在讀源碼的過程中,痛苦但是快樂。
這個框架會有未來嗎?
這個項目其實最初的想法只是學習react的內部原理,但是一路走來我的想法也改變了,會盡自己最大的所能,維護下去,并且跟進react官方的變化(說實話createPortal Luy也是支持的!)
畢竟,學習其實就是模仿,創造永遠在模仿的前提下。最近公司準備上一個新的小項目,也是我第一個全權負責的項目,所以我決定上一把我的Luy進行試點(好就好在,Luy更換react其實是無痛的,實在有什么問題,直接換react上,哈哈哈
最后
代碼在這里,框架地址:Luy,總共加起來目前只有1100+行,不多,可以作為「react套路學習版本」
總結
以上是生活随笔為你收集整理的Luy 1.0 :一个React-like轮子的诞生的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战react技术栈+express前后
- 下一篇: Message,MessageQueue