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