閱讀前端專案原始碼的正確姿勢

jayzou發表於2018-03-14

這篇文章主要介紹下筆者看原始碼的一些心得和方式,由於筆者看的大部分是前端專案,當然也看過一些其它領域的原始碼,不過不多,所以內容主要還是以前端專案為主

瞭解和熟悉

  1. 在準備看一個開源專案原始碼的時候先去熟悉下這個專案的背景功能以及相應的API。這步為了理解整個專案的功能做準備,也是為了後面重點看哪些模組做準備
  2. 檢視專案的README.md檔案。有些專案會在將設計文件和架構圖放到md檔案上,這樣會讓你巨集觀上對一些概念有些認識。例如immer
  3. 檢視專案整體的檔案結構。比如下面提到一些重點需要檢視的檔案
    • package.json,可以從這個檔案看到整個專案的入口檔案、開發/測試/釋出編譯的各種命令,也可以瞭解到專案的依賴庫、工具以及框架等等。
    • webpack/gulp/rollup配置檔案,從這個檔案裡面可以看到專案整體的工具配置,也包含入口檔案以及編譯之後的程式碼檔案,以及一些配置項的功能
  4. 知道一些預設命名的檔案規則,比如
    • dist,表示編譯之後的原始檔
    • src,原始碼檔案
      • index.xx,一般會用來作為前端的入口檔案
      • app.xx、server.xx,一般會用來做後端的入口檔案
    • static,靜態檔案,前端專案一般都會用來作為給瀏覽器執行的入口檔案
    • test,測試用例資料夾
      • e2e,端對端測試
      • unit,單元測試
    • ... 這期間哪怕你遇到一些檔案你不知道有什麼用,有2個方式可以瞭解到
  • 直接用google搜該檔名,往往能找到相關答案,比如**.eslintrc.js**
    圖片描述
  • 進去看檔案內容,一般會有註釋,如果都沒有的話說明這個檔案往往不是很重要,可以先忽略

上手

做完前面的準備工作後,這時候你應該對這個專案有一個大致的瞭解,這裡你可以先簡單寫寫你對這個專案的一些疑惑,請注意!!!這裡的問題很重要,因為看原始碼必須要帶著問題去看,不然你會摸不到方向。至於這裡的問題,你可以先列個清單,比如mpvue

  • 小程式是不支援npm引入庫檔案的,但是mpvue支援,是怎麼做到的呢?
  • 小程式和vue都有自己的生命週期,框架是怎麼去相容?
  • mpvue是怎麼樣讓小程式支援單檔案元件(.vue) .....

接著我可以開始正式的看原始碼了,這裡容我說句題外話。有人可能喜歡先從第一個commit看起,因為第一個commit的原始碼會比較簡單易懂,但是我並不喜歡這樣,因為第一個commit的程式碼往往跟現有的文件差距比較大(除非這個專案比較新),無法瞭解到整體的結構,而且第一個commit的程式碼可能跟最新的程式碼在架構上面有著翻天覆地的變化,反而做了一些無用功。

1.入口檔案,幾乎所有的專案都會有一個入口檔案,其實你做上面的準備工作之後,基本你都能找到入口檔案,無非就是從2個方面入手

  • package.json,因為是入口檔案,一般都會使用預設命名,比如index.xx app.xx之類。
  • 工具的配置檔案,比如webpack的entry欄位,gulp.src執行的檔案路徑等等

2.以模組為單元開始閱讀,帶著你上面準備的問題,抽絲剝繭、層層深入。這裡分享一個小技巧,可以先Fork下一個專案,在閱讀的過程中不斷加上自己的註釋和理解,一個好的專案往往在結構上面都是很清晰,例如

圖片描述

好的原始碼是可以從命名上面都能直接給讀者一些資訊,方便閱讀。

3.當你深入讀到某一塊原始碼不理解,先試著在網上找找有沒有相關的資料學習下,實在找不到可以先標記下放著,等你看到後面再回過頭來看不理解的地方或者會茅塞頓開。

技巧

1.在你閱讀的過程中,如果發現一些程式碼片段很精妙的可以記錄一下,或者嘗試下有沒有更好的方式去實現,也許你就成了這個專案contributors了

2.當你不瞭解某個模組的作用時,你可以去看看測試用例,特別是單元測試(unit),測試用例包含對輸入輸出的校驗,從這裡可以快速瞭解到模組相關的作用

圖片描述

3.要學會給專案打斷點,在邊讀邊執行專案原始碼的過程中,通過斷點輸出當前執行的堆疊資訊對你理解專案也是有很大的幫助

建議

初學者在github上面閱讀原始碼的時候可以先從一些小的專案入手,比如實現了某個功能或者元件這樣的專案,先不要看一些大而全的框架,比較容易上手,當你積累了一定的經驗後再嘗試下看框架的原始碼。 另外搭配一些工具來閱讀或者會更好,筆者推薦一些工具給大家

  • Octotree,瀏覽器擴充套件,在github上面顯示程式碼樹,對你瞭解整個專案結構有著非常大的幫助
  • webstorm,這個看個人喜好吧,筆者比較喜歡WS,主要是裡面的工具比較全面,比如支援typescript、babel等等一些前端經常用到的工具
  • SourceTree,git視覺化客戶端工具,如果你喜歡從第一個commit開始看,那麼這個工具對你比較有幫助,看看快速瞭解到每個版本提交的內容以及原始碼變更記錄,筆者以前比較喜歡用這個,但是後面WS有自帶的視覺化工具之後就沒用過了。

總結

學習專案原始碼不是一蹴而就,往往週期比較長,最好的就是能夠將專案Fork下來,單獨準備好一份筆記,慢慢去研究、記錄看原始碼過程中的一些心得,到最後看完再回過頭來你能說出它的架構和設計,那麼我覺得這個學習是有意義,所以我認為閱讀原始碼的終究目標是瞭解專案,最終能實現它

相關文章