想要一份senior工作,務必要讀 React 原始碼嗎?

FateRiddle發表於2018-07-08

打算試著記錄下每日的感悟,有趣的庫,有趣的文,有趣的事,和思考。走一路,留下些腳印。

關於讀原始碼

這段面試了一些。很多公司都會甩這個問題給你:讀過 React 的原始碼嗎? 答曰:沒讀過。瞬間感到自己的自信心掉了一塊。網上也不乏各種分析原始碼的文章和精讀,只是我還是沒有那個勇氣和興趣去讀如此成熟的一個庫的原始碼,甚至想讀也不知從何讀起。

但為了面試,似乎這是必須的?

於是跑上 Reddit 發了一貼,想問問看老外們是怎麼看這個問題的。

十分鐘過去了,得到一個回覆,全文如下:

But I can't bring myself on reading the source code of such a mature project, I don't even know where to begin.

Don't feel bad. I think every one of us on the core team has parts of React that we have not read (or at least are only vaguely familiar with).

So I wonder, especially for those who've read the code, is it important to read the source code if you are searching for a senior job?

My feeling is a strong "no" for this one. You don't need to read the source code to use React effectively. The docs should be sufficient! If they aren't, we've done a poor job.

簡單翻譯如下:

我讀不來原始碼,都不知道從哪兒開始

不要感到難過,我們React核心開發團隊的每個人都或多或少有一部分原始碼沒有讀過。

想問一下讀過的人,找一份senior工作,讀原始碼是否必要?

我個人強烈認為“No”。即使不讀原始碼也能高效使用 React。官方文件應該已經足夠了!如果不夠,說明我們的工作沒做好。

哈哈,驚不驚喜,意不意外。逛貼吧撞上facebook大佬。大佬表態了,估計說該讀的人也都退散了。沒聽到反面的聲音也算一大遺憾,當然比不過收到這個回覆的驚喜。

個人觀點是:

  1. 瞭解生命週期
  2. 瞭解diff的演算法(文件 reconciliation )

就算React是一個黑箱子,知道它運作的規則可以自我解答很多“這樣寫影不影響效能”的疑問。

第二個回覆的 acemarke 是redux文件的維護者,經常熱心解答各種問題,他說自己沒讀過原始碼讓我吃了一驚。同時決定暫時不去讀了。畢竟還有那麼多想要做的事,想要學的東西。前端的更新速度真是太瘋狂了。讓面試見鬼去吧(說笑)。

問題

  1. diff 的演算法複雜度是多少?
  2. 如果兩個子元素的key一樣,React的diff演算法會怎麼做(沒法用key區分哪個是哪個了)?

第一題 O(n) 。第二題懇請知道答案的各位大牛慷慨留言 :D

補充:拿了幾個demo試驗了一下,key相同的情況渲染結果很不穩定,最簡單陣列map到div似乎能正常渲染,但拿todolist試驗發現只要出現重複key只會渲染第一條。有趣的是,連warning文字在幾個情況下也有些許不同(也可能是react版本不同造成),但大致的意思是:重複key會引起未知狀況,帶重複key的元素渲染有可能會被忽視,也有可能出現重複。這裡果然是要看原始碼才能知道內部是怎麼處理的。

問題

  1. 可以在 React 元件裡定義 React 元件嗎?
  2. 可以在 render() 函式裡定義 React 元件嗎?

答案是:可以和不可以。React元件可以作為另一個元件的例項方法。感覺就是函式裡面定義函式,沒問題。

但是在render() 裡定義 React 元件會出事。這裡就涉及到diff的演算法的第一假設,如果兩次 render 的元件不同, 那React就會銷燬原元素,然後重新渲染新的元素。這不僅僅是效能,所有元件及其子元件的state都被銷燬了。那麼為啥在render() 裡定義元件會讓 render認為元件不同呢?因為元件是一個class或者是function,js裡對比兩個class 或者是 function 是否相等是看兩者的引用(reference),所以必然不相等。

const a = class {}
const b = class {}
a === b // false
複製程式碼

一般不會有人在元件裡定義元件(這麼做是可以的),更別提在render() 函式裡了。不過我確實遇到了這樣的情況,比如在render()裡使用HOC。

最近忙就寫這些吧。

最後推薦一篇早上看了開我眼界的文章:用webflow設計App

一直以為像webflow這樣的工具是給不會css的設計師寫網頁用的。但是一個使用 React + GraphQL 框架的公司也決定使用webflow,而且完美整合。也許像webflow一樣的工具會是前端開發的未來呢。

我寫的其他專欄文章列表 傳送門

相關文章