React源碼解析-從頭寫一個React的難點與思路


MayReact發布了~看看這是不是你想做的重寫React~

https://github.com/sven36/MayReact

---------------------------------------------------------------------------------------------------------------------

2017-12-6更新:

這么長時間竟然有好多人看過,還有幾個小伙伴給我的github幾個start,心中甚是惶恐,擔心誤人子弟,便再更新自己的一些看法。

 

言歸正傳:其實當時我的水准應當還算可以~畢竟看了很多很多書~  不過對React的理解還是有些勉強了,當時寫這個LittleReact算是照貓畫虎吧,跟着斷點一點一點寫下來了的,所以只是描摹了一些,很多地方都沒有思考過;

雖然努力不會白費,但這樣寫一遍下來對React的理解我估計撐死也就三成;

 

如果你工作比較穩定,沒那么着急~那就這么來:真正的自己實現一個React,先學會karma  rollup這兩個工具karma是用來做單元測試的,rollup是用來打包代碼的;把preact(迷你版react),react,anu(司徒正美先生寫的一個類react框架很棒的),下載到自己本地,react的單元測試是用的facebook自己的jest先不用管~,先看preact這個庫比較簡單,然后自己一點點寫,寫一部分然后就跑跑單元測試(單元測試這個三個框架都有,自己一點一點寫相似的單元測試);過程中一定要自己寫,把React對應的api當成黑盒子自己

實現自己的邏輯,實在不知道怎么寫再看看別人怎么寫的,這個過程會比較漫長,不過你肯定會收獲滿滿~我現在就在這么做~在這給你安利下我的  MayReact    https://github.com/sven36/MayReact

最后的效果就是你會寫一個能在生產環境使用的React~因為你最終會把所有的單元測試都跑一遍~ 再之后就是同樣的思路寫寫react-redux,react-router,那時再使用React  如烹小鮮爾~(我目前還在寫React之中,這些都完成之后我打算寫寫webpack和babel了~)

路漫漫其修遠兮~願你我都能孜孜以求~

 

 

----------------------------------------------------------------------------------------------------------------------------2333的分割線~~以下為原文就不修改了算是對自己的中二一種紀念吧~---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

前言:最近一直在看React源碼,看了幾天總有霧里觀花之感;便想着自己從頭寫一遍,這幾天基本上寫了個大概了;

React的VirtualDOM,DOM diff,生命周期管理,單向數據流動等等都具備了;

當然也省略了非常多的細節和檢查,事件系統和CallBackQuenue,PoolClass等都沒有~(暫時DOM diff不太全,我再想想怎么寫更好);

不過這樣足夠理解React了,而且React剩下的部分看看就基本知道作用了;

代碼我已經上傳到GitHub,地址是:https://github.com/sven36/LittleReact

 

 

 

那么言歸正傳:說一說我個人感覺其中比較難得地方和一些思路;(我使用的是React15.3版本

首先:React現在已經非常龐大了,我當初本想多寫幾篇一點一點介紹的,不過我發現即使寫了光看的話肯定看不明白的,最好的方法只能是自己寫一遍;

第二點:必須要首先弄懂Transition事務模塊;

Transition模塊:現在React絕大部分模塊都需要Transition觸發的,這個是一個包裹函數,構造函數需原型繼承Transaction,或原型方法逐個賦值。且getTransactionWrappers方法用於添加前置鈎子與后置鈎子;reinitializeTransaction方法在初始化時調用,用於清空前、后置鈎子;perform方法實際執行method函數、及前后鈎子。(看不懂可以去跑一跑我的Git上的示例)

第三點:ReactElement以及ReactComponent;傳入的參數先轉化為ReactElement,然后根據不同的node類型轉換為不同的ReactComponent;

第四點:ReactComponent的遞歸渲染和ReactClass的原型混入傳入的參數,在遞歸渲染時原型調用(這個我有些說不明白),我是調試React的運行過程,看了十來遍看明白的~~

第五點:紙上得來終覺淺,絕知此事要躬行~~

 

如圖:絕大部分代碼都加上注釋了,想自己寫一寫的可以參照一下;

最后附上我的參照資料,也深深感謝這兩位作者:

http://purplebamboo.github.io/2015/09/15/reactjs_source_analyze_part_two/

http://schifred.iteye.com/category/368891

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM