前兩篇介紹了JSX,稍微熟悉之後就正式地介紹一下React這位朋友。首先React是Library 不是Framework,雖然滿多人提到前端框架時,都會把React算進去,甚至面試時面試官也弄錯。
註: 庫(Library)與 框架(Framework)的差別
- 當你在調用Library的時候, 你按照自己的意願來control他(比如jQuery)。
- 對於framework, 那麼control就是倒轉過來了,是他在調用你(比如bootstrap)。
大約在2010年時,Facebook開發團隊發現網站功能越多觸發頁面的事件越多,前端資料狀態的變化和DOM結構也越來越頻繁,前端的程式越來越難以維護,每次維護都是浩大的工程。
因此React就產生了
2011年-React開始時做來解決上述的問題
2013年-Instagram 使用React進行改版,也在Github上開放程式碼。
原因是基於HTML前端介面變得越來越複雜,最根本的問題是如何將來自於伺服器端或使用者輸入的動態數據快速的反應到複雜的介面上,來自Facebook的React Library是能夠完全解決此問題的。出發點就是用於開發數據不斷變化的大型應用程式。
首先來討論DOM的問題,它的速度很慢,看到JS比他快很多倍,如果要用JS在前端即時改變UI的話,哪怕只是增加一點點小東西,也要整個重新重新繪製,如果大量操作元件的話效能就很不好。
其實就是用一個物件來描述DOM,透過比對前後兩者的差異,最終只把有變化的部分重新渲染,提高渲染的效率。而為什麼要用虛擬DOM,因為當DOM更改時需要遍歷,而原生DOM可遍歷的屬性多達231個,且大部分與渲染無關,更新頁面的代價太。
當使用React的時候,在某個時間點render()建立了一個React元件樹,在下一個state或者prop更新時,render()將建立一個新的React元件樹,React將對比這兩個元件樹不同之處,計算出如何高效的更新UI(只更新有變化的地方)。Diff算法有幾種: