自從React的內部實現改為Fiber之後,原始碼就變得相當晦澀,啃了一個月之後,稍微總結的了一點經驗、閱讀時的誤區、以及為什麼很多次看不下的原因,但是我相信,這些經驗可以成為我將來閱讀原始碼的過程中最大的武器。我相信閱讀原始碼並從中提煉知識是最好的學習方式。
1. 模組化閱讀,不能在某個分支下越走越深,丟失全域性觀
這一點尤其是對React16而言,因為整個呼叫棧會非常的深,深到超過你的記憶和理解能力。你需要去先了解React16的設計,用法,然後利用函式名、檔名、模組劃分,去理解當前這個函式屬於整個流程的那個階段。 就React而言,從初始話建立ReactElement、ReactRoot、FiberRoot、rootFiber這些過程,再到scheduler各種任務的過程、再到通過fiber進行的reconciler的過程,最後到commit,環環相扣,如果你一開始的閱讀是從頭看到尾,你可能會暈頭轉向、然後說這坑爹啊。 這些流程、設計理念往往在官方文件中會涉及、或者上網看一些大牛的文章,先了解整個模組劃分、流程是非常有意義的,這個年代了,大把的知識分享沒理由不好好利用對吧。
2. 從官方contribution文件中獲得幫助
我們生產開發的版本和框架開發者的設計是不一樣的,我們用的往往是打包之後的結果,不信你可以試試從React的master分支clone一個倉庫下來看看。 contribution文件最大的作用是,框架開發者們告訴你怎麼測試、除錯、打包這個框架。他們會告訴怎麼打包有sourceMap、怎麼打包最快、測試哪個功能可以用哪個demo,這無疑會讓我省下大量精力去熟悉專案配置、寫demo測試等等。甚至會有閱讀指導?
3. 如果可以的話,從模組開始突破
這一點在webpack原始碼中就非常的明顯了,webpack的plugin機制基於Tapable, 而Tapable整個模組都是基於事件的,如果你不瞭解Tapable,你只會發現webpack的原始碼在莫名其妙的跳轉。 當你從React中找到獨立的模組時,別想了,猛攻就是。
4. 自己給自己提問
有時候,我們會在閱讀的過程之中丟失閱讀的意義,為了閱讀而閱讀,不僅消磨耐心和鬥志,也會讓你毫無收穫。 提問題有幾種方式
- 閱讀之前給自己提個問題,然後根據這個問題去除錯、閱讀。或者可以在網上搜相關的面試題、然後在原始碼中自己找到答案。
- 閱讀的時候要多問自己,為什麼作者會這樣寫,舉個例子,嘗試從效能角度考慮,因為作為框架、很多細微的效能優化都會考慮
5. 做好長期戰鬥的過程,因為會遇到很多不熟悉的知識
因為框架開發和應用層開發不一樣,這會讓你遇到很多不熟悉的領域,需要你去另外研究,再回來一遍。 在React中看到的位運算、連結串列操作在前端常規開發中都比較少遇到,如果你發現了你是因為不熟悉某些知識而看不懂,那麼恭喜你了,你發現自己的知識盲區了,趕緊去補一補。
6. 不要依賴全域性搜尋
我一向喜歡研究提升開發效率的工具,webstorm的各種功能當然也用得溜,但是對於一個新專案,太過依賴全域性搜尋,往往會丟失對模組的認識,有時候手動找找檔案,多看看目錄名和檔名、熟悉一下函式位置,都能提高你對專案的熟悉度。
7. 學會猜測
如果讓我總結,我會覺得閱讀原始碼就是一個猜測與驗證的過程。 我們可以從變數名、模組名中猜測這個模組/函式的功能。猜是非常重要的,帶著我們預測的思路去看程式碼,哪怕是錯的思路,這也可以集中自己的注意力,然後在發現錯誤的時候更深刻的理解。
8. 你要非常熟悉這個庫
這一點可能老生常談了。但的確非常重要。 如果是一個比較小型的庫,你大可以先寫個demo,瞭解功能,然後開始閱讀原始碼,順便利用demo斷點除錯一下。但是對於稍大一點的庫,我建議還是先從api、設計理念、這個庫想解決的問題這幾點入手。而且要熟讀官方文件。 當然,與其主動熟悉某個倉庫,還不如直接從平時生產中常用的工具庫中選一個來閱讀,既能提高生產和debug的效率,又能提高知識的深度,何樂而不為。
9. 倉庫與程式碼註釋、流程圖
當準備閱讀原始碼就是一場持久戰,在閱讀的過程中,可能會有大量重複或者不理解的地方,如果不理解大可以標記個TODO避免死磕細節。每次看懂的地方也需要註釋,因為很有可能看到後面忘了前面,註釋不怕囉嗦,就怕不寫。 我的建議是從框架github fork一份,註釋也可以推送自己的fork倉庫。 此外,當某個模組看完,或者看得累,建議及時輸出一份流程圖,既可以用於幫助理解,也可以用於將來複習。
10. 寫文章輸出
這一點可能不止是在閱讀原始碼中需要用到,在任何技術知識的學習,輸出文章用於是最好的學習方法,當你試圖講清一個知識,你會發現自己對知識的漏洞,並且組織文章過程可以系統規劃整理整個知識脈絡。而且可以加強印象便於將來複習,看自己文章複習會比上網查一篇來回顧效率高得非常多。 很多知識是需要回顧複習的,你可以想想你剛畢業的時候學的理論知識,現在還能否瞭然於胸?