React vs Angular,到底誰更牛?

【51CTO.com原創稿件】您是否對當前兩款前端開發框架無從選擇?本文將深入比較並分析 React 和 Angular 哪個項目更適合您。


React vs Angular,到底誰更牛?


在編程領域,Angular 和 React 對於前端開發人員來說是目前最流行的兩款 JavaScript 框架。

2018 年版的 Stack Overflow Developer Survey 認為:Angular、React 和 Node.js 是所有軟件工程師所公認的三大頂級編程框架。

請見:

https://insights.stackoverflow.com/survey/2018/#technology 

無論是從流行程度、架構相似度,還是從基於 JavaScript 的角度考慮,這兩種前端框架都有著諸多相似之處。

在本文中,我們將對 React 和 Angular 進行深入比較。我們會從兩者的框架基本特徵入手。

當然,如果您對此類話題特別感興趣的話,請參見:

https://www.altexsoft.com/blog/engineering/angularjs-vs-knockout-js-vs-vue-js-vs-backbone-js-which-framework-suits-your-project-best/?utm_source=DZone&utm_medium=referral 

Angular 與 React.js 簡要介紹

Angular

Angular 是由 Google 提供支持的一種前端框架,它能夠與大多數常用的代碼編輯器相兼容,它屬於 MEAN stack 的一部分。

請見:

https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-angular-development/#angular%202%20and%20angular%202+ 
https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-javascript-full-stack-development/?utm_source=DZone&utm_medium=referral

而 MEAN stack 是一組免費開源的、以 JavaScript 為中心工具集,可被用於構建動態網站和 Web 應用。

其組件包括:MongoDB(NoSQL 數據庫)、Express.js(Web 應用框架)、Angular 或 AngularJS(前端框架)、以及 Node.js(服務器平臺)。

Angular 框架允許開發人員創建動態的單頁面 Web 應用(Single-Page Web Applications,SPA)。

最初版本的 Angular,解決的是將基於 HTML 文檔轉換為動態內容的問題。

在此,我們將重點關注其較新的版本 Angular 2+,以及它與 AngularJS 的區別。

在業界案例上,Angular 主要被 Forbes、WhatsApp、Instagram、healthcare.gov、HBO、Nike 等組織所使用。

React.js

React.js 是由 Facebook 於 2011 年創建的一種用於構建動態用戶界面的開源 JavaScript 庫。

具體請請見:

https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-reactjs-and-react-native/ 

React 基於 JavaScript 和 JSX,而 JSX 是由 Facebook 所開發的 PHP 擴展,它能夠為前端開發創建可重用的 HTML 元素。React 擁有一個可以被用於移動開發的獨立跨平臺框架 React Native。

在業界案例上,React 主要被 Netflix、PayPal、Uber、Twitter、Udemy、Reddit、Airbnb、Walmart 等組織所使用。

工具集:框架 vs 庫

有過開發經驗的讀者都知道,框架生態系統定義了工程體驗的無縫性。下面,我們來看看 Angular 和 React 的主要特點。

首先,React 並非一個真正的框架,它實際上是一個庫。所以,它需要與其他的工具和庫進行多次集成。

相比而言,在使用 Angular 時,您已經擁有了用於構建應用的一切條件。


React vs Angular,到底誰更牛?


Angular 提供瞭如下各種開箱即用(out of the box)的功能:

  • RxJS:是一個異步程序庫,它通過設置多個數據交換的通道,來減少資源的消耗。
  • RxJS 的主要優點是:它能夠獨立地同步處理事件。不過,伴隨的問題是:雖然 RxJS 可以與許多框架協同運行,但是您必須通過對庫的學習,以充分利用到 Angular。
  • Angular CLI:具有功能強大的命令行界面,可協助創建應用、添加文件、測試、調試和部署。
  • Dependency injection:該框架將各種組件與依賴關係相分離,使之同步運行;同時也能夠在不重新配置組件的情況下更改依賴關係。
  • Ivy renderer:作為新一代的 Angular 渲染引擎,Ivy 的性能有了明顯的提升。
  • Angular Universal:是一種用於服務器端渲染的技術,它能夠快速地渲染出首個應用頁面,或是在可能缺乏渲染資源的瀏覽器端設備(如移動設備)上顯示應用。
  • Aptana、WebStorm、Sublime Text、Visual Studio Code:都是 Angular 的常用代碼編輯器。
  • Jasmine、Karma 和 Protractor:都是在瀏覽器中進行端到端測試與調試的工具。

React 需要通過多種集成和各種支持工具才能運行:

  • Redux:是一種狀態容器,它可以加速 React 在大型應用中的運行,能夠管理具有多種動態元素的應用組件,還可以被用於渲染。

此外,React 用到了更為廣泛的 Redux 工具集,其中包括:Reselect、Redux 的選擇器庫和 Redux DevTools Profiler Monitor。

  • Babel:是一種轉換編譯器,它可以將JSX轉換為能夠被瀏覽器理解的 JavaScript 應用。
  • Webpack:由於所有的組件都是用不同的文件編寫而成,因此我們需要將它們捆綁在一起,以便實現更好的管理。而 Webpack 就是一種公認的標準代碼捆綁器。
  • React Router:該路由器是一種常被 React 所使用的標準 URL 路由庫。
  • 與 Angular 類似:在代碼的選擇方面,您並不受限。其常見的編輯器包括 Visual Studio Code、Atom 和 Sublime Text。
  • 與 Angular 不同的是:在 React 中,您無法使用單個工具去測試整個應用,而必須使用不同的工具進行不同類型的測試。

如下是 React 與各種工具的配合列表:

  • Enzyme 和 Unexpected-react,用於組件測試。
  • Jest 用於 JavaScript 代碼。
  • react-testing-library 用於 React DOM 測試。
  • React-unit 用於單元測試。
  • Skin-deep 用於渲染測試。

由 ReselectDevTools(https://github.com/skortchmark9/reselect-tools)所提供的此類工具集,可以被用於調試和可視化。

而 React Developer Tools 的 Chrome Extension 與 Firefox Extension,以及 React Sight 也都能可視化顯示狀態和屬性樹(prop tree)。

這兩種工具都形成了強大的生態系統。通常情況下,用戶傾向於選擇 React,不過 React 需要 Redux 之類的多種集成來擴展其服務能力。

基於組件的體系結構:兩種工具的可重用與可維護組件

兩個框架都具有基於組件的體系結構。這就意味著單個應用可以通過模塊化、內聚且可重用的組件,來構建出各種用戶界面。

在 Web 開發中,基於組件的體系結構通常被認為比使用其他結構更易於維護。

它通過創建單獨的組件來加速開發的進程,並使得開發人員能夠縮短產品上線的時間,也能調整和擴展應用。

①代碼:TypeScript vs JavaScript(JSX)

Angular 使用 TypeScript 語言(當然如果需要的話,您也可以使用 JavaScript)。

TypeScript 是一種適合於大型項目的 JavaScript 超集。它既緊湊,又能夠識別輸入中的錯誤。

TypeScript 的其他優點還包括:更好的導航與自動完成功能,更快的代碼重構。

另外,TypeScript 的可擴展性和簡潔性,也非常適合於企業規模的大型項目。

React 使用的是 JavaScript ES6 和 JSX 腳本。JSX 是 JavaScript 的語法擴展,被用於簡化 UI 編碼,並使得 JavaScript 代碼看起來更像 HTML。JSX 不但能夠檢測各種錯誤,還可以保護代碼免受注入的攻擊。

另外,Babel(https://babeljs.io/)使用 JSX 進行瀏覽器編譯。而 Babel 則是一種將代碼轉換為可被 Web 瀏覽器讀取的格式編譯器。

雖然 JSX 在語法上幾乎能夠實現與 TypeScript 類似的功能,但是一些開發人員仍認為它比較複雜難學。

②DOM:真實 vs 虛擬

文檔對象模型(Document Object Model,DOM)是 HTML、XHTML 或 XML 文檔的編程接口。

它具有一種樹形組織結構,使得腳本能夠動態地與 Web 文檔的內容及結構進行交互,並對它們實現更新。

DOM 有兩種類型:虛擬和真實。在實現原理上,即使有一個元素髮生了變化,傳統的或稱真實的 DOM 也會更新整個樹型結構。

而虛擬的 DOM 則是真實 DOM 的一種映射,因此它只跟蹤變更的部分,僅更新特定元素,而不會影響整個樹中的其他部分。


React vs Angular,到底誰更牛?


React 使用虛擬的 DOM,而 Angular 則在真實的 DOM 上運行,並使用變更檢測來查找那些需要更新的組件。

雖然虛擬的 DOM 被認為比真正的 DOM 操作起來更為快捷,但是在 Angular 中,由於需要進行變更檢測,因此這兩種方法在性能方面實際上是相當的。

③數據綁定:雙向 vs 向下(單向)

數據綁定是在模型(業務邏輯)和視圖(UI)之間同步數據的過程。數據綁定有單向和雙向兩種基本的實現方式。而單向與雙向數據綁定之間的區別,就在於模型視圖的更新過程上。


React vs Angular,到底誰更牛?


Angular 中的雙向數據綁定類似於“模型 - 視圖 - 控制器(Model-View-Controller,MVC)”的體系結構,

具體請參見:

https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller 

由於其中的模型和視圖是同步的,因此數據的變更會影響到視圖上,而視圖的更改也會反過來觸發數據相應的變更。

React 則使用單向或向下的數據綁定。單向數據流不允許子元素在更新時影響到父元素,因此保證了只有已獲准的組件才會發生更改。

可見,此類數據綁定使得代碼更為穩定,當然也需要通過額外的作業來同步對應的模型與視圖。畢竟,由於子組件變更所觸發的父組件配置的更新,需要更多的時間。

總的說來,React 的單向數據綁定更具備可預測性,代碼更為穩定,調試也更加容易。而 Angular 中的傳統雙向數據綁定,則易於被使用。

④應用體積和性能:Angular 略勝一籌

在處理複雜且動態的應用時,AngularJS 的性能較低。而由於用到了虛擬的 DOM,React 各類應用的效率比同等大小的 AngularJS 應用要快一些。

然而,根據來自 freeCodeCamp.org 的 Jacek Schae 研究,新版本的 Angular 比 React + Redux 要略快一些。

具體請參見:

https://medium.freecodecamp.org/a-real-world-comparison-of-front-end-frameworks-with-benchmarks-2018-update-e5760fb4a962 

此外,該研究還表明:Angular 的應用體積略小,受測時的轉換體積(Transfer Size)只有 129 KB,而 React + Redux 則有 193 KB。


React vs Angular,到底誰更牛?


⑤預構建的 UI 設計元素:Angular Material vs 社區支持的組件

Angular:隨著材料設計(Material Design)語言在 Web 應用中流行,更多的工程師受益於其開箱即用的材料工具集。

Angular 擁有預構建的材料設計組件。其 Angular Material 能夠對錶單控件、導航、佈局、按鈕、指示器、彈窗、模塊、以及數據表,實現一系列常見的交互模型。由於各種預構建元素的存在,配置 UI 的速度變得更快。

React:它的大多數 UI 工具都來自於它的社區。目前,React 門戶網站上的 UI 組件板塊(https://reactjs.org/community/ui-components.html)提供了大量免費的和部分收費的組件。

您需要安裝 Material-UI 庫和各種依賴項,才能使用 React 的材料設計進行構建。

此外,您還可能用到由 React 構建的 Bootstrap 組件(https://react-bootstrap.github.io/),以及包含 UI 組件與工具集(https://hackernoon.com/23-best-react-ui-component-libraries-and-frameworks-250a81b2ac42)的其他軟件包。

⑥移動可移植性:NativeScript vs React Native

這兩個框架都附有能讓工程師將現有的 Web 應用移植到移動應用之中的工具。

我們對NativeScript(Angular)和React Native也進行了深入分析和比較。

具體請參見:

https://www.altexsoft.com/blog/engineering/xamarin-vs-react-native-vs-ionic-vs-nativescript-cross-platform-mobile-frameworks-comparison/?utm_source=DZone&utm_medium=referral 

下面是要點簡述:NativeScript(https://www.nativescript.org/)是一款使用 TypeScript 作為核心語言的跨平臺移動框架。其用戶界面是用 XML 和 CSS 來構建的。

開發人員在從 Web 應用處移植業務邏輯,並在其 UI 上使用相同的操作技巧時,該工具允許 iOS 和 Android 平臺共享大約 90% 的代碼。

NativeScript 背後的理念是:為移動設備編寫單個 UI,並根據具體的需求為每個平臺進行微調。

與使用 WebView 來渲染的混合式跨平臺解決方案不同,該框架是在 JavaScript 虛擬機中運行各種應用,並直接連接到原生的移動 API 上,從而保證了具有能夠和原生應用相媲美的高性能。

React Native(https://facebook.github.io/react-native/):該 JavaScript 框架是針對移動應用的跨平臺實現所準備的,同時能夠支持從Web處的移植。

與 NativeScript 相比,React Native 採用了略有不同的方法:它鼓勵其社區為不同的平臺編寫單獨的 UI,並堅持“learn once, write everywhere”的方法。

因此,其代碼的共享程度也有 70%。另外,React Native 還擁有類似 NativeScript 的原生 API 渲染功能。

不過它需要構建額外的橋式 API 層,並運用原生控制器來連接 JavaScript 的 runtime。

總的說來,如果您需要使用同一種業務邏輯同時運行 Web 和移動應用的話,那麼這兩種框架都是不錯的選擇。

當然,NativeScript 更專注於代碼的共享,和產品上線時間的縮短;而 React Native 則會用更長的開發週期換取最終更貼近的原生觀感。

⑦文檔和廠商支持:文檔不足,需依靠大型社區

自 2018 年 1 月以來,由於 Google 持續對 Angular 生態系統進行開發,他們不但能為該框架提供長期支持(Long-Term Support,LTS),還能專注於修復錯誤和積極改進。

不過相比其框架的發展速度,對應的文檔更新則沒有那麼的及時。一些開發人員對其 CLI 文檔更新的速度表示了擔憂。

下圖是旨在方便 Angular 開發人員使用的一款交互式服務界面(https://update.angular.io/),您可以自定義框架的當前版本和更新目標,以獲取更新內容的清單。


React vs Angular,到底誰更牛?


由於 AngularJS 的文檔(https://docs.angularjs.org/api)和教程所提供的範圍比 Angular 2+ 更為廣泛,因此受到了開發人員的稱讚。

而 React 社區則遇到了與 Angular 類似的文檔問題。由於 React 環境及其運行方式經常出現更新,因此在使用 React 時,您必須為各種變化和不斷的學習做好準備。

雖然 React 已有一些最新版本的文檔(請參見:https://reactjs.org/versions/),但是要跟上所有的變更與集成,卻並非一項簡單的任務。

好在其社區的支持在某種程度上抵消了此類問題。React 擁有大量的開發人員,他們能夠在專題論壇上時常分享自己的知識。

⑧學習曲線:Angular 更為陡峭

Angular 的學習曲線被認為比 React 陡峭一些。Angular 是一款複雜且冗長的框架,它能夠通過各種方法去解決某些單個問題。不過它需要通過許多重複性的操作,來實現複雜的組件管理。

正如我們上面所提到的,該框架一直在不斷地發展之中,因此開發人員不得不適應其各種變更。

另外,由於 Angular 2+ 使用了 TypeScript 和 RxJS,儘管 TypeScript 接近於 JavaScript,但是用戶仍然需要花上一些時間去學習 RxJS。

由於更新頻繁,React 也需要用戶不斷地學習。當然,如果您已經擅長於使用 JavaScript 的話,則不需要花費太多的時間重新開始。

目前,由於約有 60% 的 React 應用構建會用到 Redux,因此 Redux 成了一種必備工具,而 React 學習曲線則主要是由 Redux 庫所決定。

不過,React 也為初學者提供了各種實用的教程,具體請參見:

https://reactjs.org/tutorial/tutorial.html 

⑨社區和接受度:兩者不相上下

React 在 GitHub 上的受歡迎程度略高於 Angular。它擁有 113,719 顆星和 6,467 人關注;而 Angular 只有 41,978 顆星和 3,267 人關注。

根據 2018 年版的 Stack Overflow Developer Survey(如下圖所示),Angular 的開發人員佔比為 37.6%,而 React 的用戶佔比為 28.3%。

值得一提的是,該調查涵蓋了 AngularJS 和 Angular 2+ 用戶。


React vs Angular,到底誰更牛?


有趣的是:Angular 在負面評論上也較為領先。根據同一份調查顯示,有 45.6% 的開發人員認為 Angular 是最糟糕的框架之一。

當然,此類負面反饋可能受到了許多開發人員仍在使用 AngularJS,這一客觀事實的影響,畢竟 AngularJS 比 Angular 2+ 存在更多的問題。而且 Angular 的社區規模更為龐大。

相對而言,React 的數字就好看一些,只有 30.6% 的專業開發人員不願意使用它。

您會選擇哪種框架?

綜上所述,Angular 背後的基本理念是:為前端開發的總體體驗提供強大的支持和工具集。

由於擁有 Google 團隊的不斷更新和積極支持,該框架不會出現“野蠻生長”。

其背後的工程師們會努力保護現有的社區,並協助各類開發人員與公司,從 AngularJS 切換到具有更高性能和更小應用體積的 Angular 2+ 上。

同時,隨著您的應用逐漸到達企業級規模,TypeScript 能夠增加應用代碼的可維護性,因此也就變得愈加重要了。當然,這些也會讓開發人員面臨陡峭的學習曲線。

React 提供了一種更為輕量級的方案,適合於沒有太多學習時間就需要快速上手的開發人員。

雖然其代碼庫並未規定各種工具集和方法,但是諸如 Redux 之類的常用工具,還是需要您去額外花時間學習的。

而且,由於 React 的性能與 Angular 旗鼓相當,因此它對於開發人員來說還是頗具吸引力的。


分享到:


相關文章: