1.1 React 介紹

1.1.1 React 是什麼

React IS A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES

來自:React 官方網站

狹義來講 React 是 Facebook 內部開源出來的一個前端 UI 開發框架,廣義來講 React 不僅僅是 js 框架本身,更是一套完整的前端開發生態體系,這套體系包括:

  1. React.js

  2. ReactRenders: ReactDOM / ReactServer / ReactCanvas

  3. Flux 模式及其實現(Redux , Fluxxor)

  4. React 開源組件

  5. React Native

  6. GraphQl + Relay

任何技術都是一樣,技術本身的核心不會太複雜,但是圍繞這個主體會有很多依附的知識點形成了體系化的技術棧。 所以我們談學習 React 並不僅僅是學習 React 本身,而是學習這套開發體系,整個技術棧, 本書也是圍繞這個技術棧系統的講解。

本書中除了 React Native 以外都會進行系統的講解,React Native 是相對於 WEB 來說另外一個較大的技術體系,本書會把重點放於 React Web 開發。

1.1.2 React 中的基本概念

我們先來認識一下 React 中的基本概念

React.js

React.js 是 React 的核心庫,在應用中必須先載入核心庫。

ReactDOM.js

ReactDOM.js 是 React 的 DOM 渲染器,React 將核心庫和渲染器分離開了,為了在 web 頁面中顯示開發的組件,需要調用 ReactDOM.render 方法, 第一個參數是 React 組件,第二個參數為 HTMLElement。

JSX

JSX 是 React 自定義的語法,最終 JSX 會轉化為 JS 運行於頁面當中。

組件

組件是 React 中的核心概念,頁面當中的所有元素都是通過 React 組件來表達, 我們將要寫的 React 代碼絕大部分都是在做 React 組件的開發。

VIRTUAL DOM

React 抽象出來的虛擬 DOM 樹,虛擬樹是 React 高性能的關鍵。

單向數據流:one-way reactive data flow

React 應用的核心設計模式,數據流向自頂向下

1.1.3 Hello React World

我也是性子急的人,按照技術界的慣例,在學習一個技術前,首先得說一句: 「Hello World!」。

<!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <title>Hello React!</title> <script src="http://facebook.github.io/react/js/react.js"></script> <script src="http://facebook.github.io/react/js/react-dom.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> var Hello = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; } }); ReactDOM.render( <Hello name="World" />, document.getElementById("example") ); </script> </body></html>

讀者可以複製代碼到一個新的 HTML 文件中,並通過瀏覽器打開,上面的 html 中目前我們只用關心 script 標籤內的代碼,script 標籤內的語法為 JSX 語法,ReactDOM 是 React 的 DOM 渲染器。

了解了基本概念以及看過 Hello World 後,讀者可能會開始產生疑問了:

1. jsx 語法怎麼和 HTML 寫法一樣?

答:是的,看上去一樣, 但jsx 和 HTML 本質的不同是 jsx 直接在函數中寫 xml 標籤。在 1.2 節中,會詳細介紹 jsx 以及和 HTML 做更多的對比。

2. 看上去 React 除了 jsx 以外,並沒有什麼特殊的地方,不就是將模板字元串渲染到 DOM 中嗎?你能告訴我 React 和其他框架有什麼不同之處嗎?

答:答案見 1.1.4 節

3. Hello World 也並不能看出 React 的能力,你能先告訴我 React 能做些什麼嗎?

答:答案見 1.1.5 節

1.1.4 React 的獨特之處

相比其他前端框架,為什麼 React 獨樹一幟,能夠脫穎而出呢?

  1. 組件的組合模式

  2. 單向數據流的設計

  3. 高效的性能

  4. 分離的設計

1.1.4.1 組件的組合模式

組合模式:組合模式有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和複雜元素的概念,客戶程序可以向處理簡單元素一樣來處理複雜元素,從而使得客戶程序與複雜元素的內部結構解耦。

React 就是基於組合模式, 無論是應用等級還是一個表單亦或是一個按鈕都視為一個組件, 然後基於組件的組合構建整個應用,這樣的結構一直是前端界想要卻遲遲不來的 web component。

React 中組件的組合:

基於組合模式的優點:

  1. 構建可重用的組件:組件的開發能夠形成公司的組件庫,每個業務的開發都能積累可重用的組件。

  2. 無學習障礙:天然符合 HTML 的結構, 對前端開發者來說幾乎沒有學習障礙。

  3. 具有彈性的架構:組合模式很簡單卻很有效,能夠構建簡單的頁面也能構建大型的前端應用。

  4. 源碼高可維護性:開發只是工作中的一部分,應用的上線才是噩夢的開始,很多大型應用因為複製的業務邏輯導致無法快速響應業務需求,可維護性低。

1.1.4.2 單向數據流的設計

我們都知道 Javascript 是腳本語言,不能像靜態語言一樣通過編譯定位問題,想要清晰的定位到應用中的 bug 需要深入了解業務代碼,對於大型前端應用來說,因為業務代碼量很大且複雜,很難定位到 bug。 然而 React 的單向數據流的設計讓前端 bug 定位變得簡單, 頁面的 UI 和數據的對應是唯一的,我們可以通過定位數據變化就可以定位頁面展現問題。

單向數據流設計:

1.1.4.3 高效的性能

這裡要提一個概念, 可能你已經了解或聽說了,就是 virtual dom。 React 之所以能夠這樣設計要歸功於 Virtual DOM 演算法, 基於演算法可以讓只有需要改變的元素才去重渲染。在後面的內部實現章節中會詳細講解 virtual DOM 演算法的實現

1.1.4.4 分離的框架設計

React.js 現在的版本已經將源碼分開為 ReactDOM 和 React.js . 這就意味著 React 不僅僅能夠在 web 端工作, 甚至可以在服務端(nodejs),Native 端運行。

與此同時, 我們可以自定義自己的渲染器, 實現比如 Three.js, Pixi.js, D3.js 的 React 方式渲染。

1.1.5 React 應用範圍

React 可應用的範圍:

  1. web 端應用

  2. 原生應用 - IOS、Android、Native 應用

  3. Node.Js 服務端渲染

1.1.5.1 Web 端應用

Web 應用是 React 的出發點,我們可以通過 React 構建從簡單的 TODOAPP 到大型的電商購物網站應用。 同時除了能夠處理 HTML 以外, 在 Web 端, 我們同樣可以通過 React 來實現數據可視化, 圖表展現,甚至是遊戲開發:

1.1.5.2 原生應用

除了 Web 端以外,我們可以使用同樣的 jsx 語法構建 IOS 或者 Android 應用, 這要歸功於 facebook 開源的 React Native。 基於 React Native , 我們將可以使用 jsx 來實現具有原生應用性能的 UI 運行於 IOS 和 android 中,同時我們也可以通過 NW.js 或者 Electron 來實現基於 React 的桌面應用。

1.1.5.3 服務端渲染

React 除了在 Web 和 Native 環境以外, 也可以通過 React 實現在伺服器端渲染出 HTML。

推薦閱讀:

React Render Array 性能大亂斗
從輸入 URL 到頁面載入完成的過程中都發生了什麼
瀏覽器的緩存機制小結
極樂技術周報(第二十二期)

TAG:React | 前端开发 | JavaScript |