JavaScript框架Angular和React深度對比
本文通過從概念和使用思路上的車別,詳細(xì)給讀者分析了Angular和React這兩個(gè)JavaScript框架的區(qū)別之處,希望我們整理的對你有用。
Angular和React這兩個(gè)JavaScript框架可謂紅的發(fā)紫,同時(shí)針對這兩個(gè)框架的選擇變成了當(dāng)下最容易被問及或者被架構(gòu)設(shè)計(jì)者考慮的問題,本文或許無法告訴你哪個(gè)框架更優(yōu)秀,但盡量從更多的角度去比較兩者,盡可能的為你在選擇時(shí)提供更多的參考意見。
選擇的方法
在選擇之前,我們嘗試帶著一些問題去審視你將要選擇的框架(或者是任何工具),嘗試用這些問題的答案來幫助我們更加了解框架,也更加讓選擇變得更容易
框架本身的問題: 是否成熟?誰在背后支持呢?具備的功能?采用什么架構(gòu)和模式?生態(tài)系統(tǒng)是否豐富? 需要自我反思的問題: 我和我的團(tuán)隊(duì)能否輕松學(xué)習(xí)并掌握?是否適合我的項(xiàng)目?開發(fā)體驗(yàn)是否足夠好?
嚴(yán)格說來,Angular和React的比較是不公平的,因?yàn)锳ngular是一個(gè)功能豐富的框架,而React是一個(gè)UI的組件庫,所以我們在接下來的分析中會將一些經(jīng)常和React在一起使用的類庫放在一起討論。
OK,開始… …
成熟度
作為一名成熟的開發(fā)人員或者是能夠決定架構(gòu)及技術(shù)走向的人員,一項(xiàng)必備的技能就是能夠在工作和項(xiàng)目中平衡成熟技術(shù)與最前沿框架之間的關(guān)系,既能保持人員及技術(shù)的前進(jìn),又能保證項(xiàng)目或產(chǎn)品的交付質(zhì)量,所以,必須小心以下可能的風(fēng)險(xiǎn):
該框架可能是不穩(wěn)定的。主要的開發(fā)方(贊助方)可能會突然的放棄。如果你需要幫助,可能沒有大型知識庫或社區(qū)可用。
幸好,無論是Angular還是React,似乎都不需要擔(dān)心以上的風(fēng)險(xiǎn)
React
React由Facebook開發(fā)和維護(hù),用于自己的產(chǎn)品,包括Instagram和WhatsApp。現(xiàn)在已經(jīng)有大約三年半的時(shí)間。 它也是GitHub 最受歡迎的項(xiàng)目之一。
Angular
Angular由Google進(jìn)行維護(hù),并用于Google 的Adwords 和Fiber項(xiàng)目。既然AdWords是Goolge重要的吸金利器,自然Angular不太可能突然夭折。
功能
如前文提到的,Angular本身會比React自帶很多的功能,當(dāng)然,更豐富的功能對于一個(gè)框架來說,是優(yōu)點(diǎn)也有可能是缺點(diǎn)。兩個(gè)框架都具備一些相同的核心功能:組件化、數(shù)據(jù)綁定以及平臺無關(guān)的Render機(jī)制。
Angular
Angular除了提供一些需要最新瀏覽器支持的功能外,同時(shí)提供以下標(biāo)準(zhǔn)功能:
依賴注入模板路由(@angular/router) AJAX(@angular/http)表單(@angular/forms)組件化CSS封裝 XSS保護(hù)單元測試工具
功能豐富的好處就是你不需要額外費(fèi)精力去挑選第三方的類庫,然而,這也同樣讓你沒得選擇,即使你并不需要這些功能(最新發(fā)布的Angular4貌似已經(jīng)意識到了這個(gè)問題)
React
相對Angular,React本身提供的功能就相對“簡約“:
無依賴注入使用JSX代替?zhèn)鹘y(tǒng)的HTML Templates XSS保護(hù)單元測試工具
相對Angular,React讓你有很大的自由度去挑選第三方的類庫,比如:
路由(React-router) AJAX(Fetch or axios)各種CSS封裝(詳見:https://github.com/MicheleBertoli/css-in-js)更強(qiáng)大的單元測試(Enzyme)
可以根據(jù)自己的需求很自由(或者定制)需要的類庫,同時(shí)這些第三方的類庫都是很容易學(xué)習(xí)的。
語言與模式
隨著兩個(gè)框架的流行,一些概念和技術(shù)也隨著浮出,如果想真正的用好或者說掌握這兩個(gè)框架,了解隨之而出的這些概念或者技術(shù)是非常必要的:
React JSX
JSX是一個(gè)很有爭議的話題:有些人喜歡它,而其他人認(rèn)為這是一個(gè)很大的退步。React決定使用一種類似XML的語言在組件中把標(biāo)記和代碼結(jié)合起來,直接在JavaScript代碼中編寫HTML標(biāo)記。
盡管混合標(biāo)記與JavaScript的話題可能是有爭議的,但它具有無可爭議的優(yōu)點(diǎn):靜態(tài)分析。如果在JSX標(biāo)記中發(fā)生錯(cuò)誤,編譯器會立即報(bào)錯(cuò)而不是留待運(yùn)行時(shí)出現(xiàn)莫名其妙的問題。這有助于開發(fā)人員快速排查錯(cuò)誤以及避免其它愚蠢的錯(cuò)誤,比如拼寫錯(cuò)誤。
Flow
Flow是由Facebook開發(fā)的JavaScript類型檢查工具。它可以解析代碼并檢查常見的類型錯(cuò)誤,如隱式轉(zhuǎn)換或取消引用。
與類似目的的TypeScript不同,它不需要開發(fā)人員遷移到新語言,并為你的代碼注釋類型檢查工作。在流程中,類型注釋是可選的,可用于向分析器提供其他提示。如果你想使用靜態(tài)代碼分析,同時(shí)避免重寫現(xiàn)有的代碼,F(xiàn)low是一個(gè)很好的選擇。
Redux
Redux是一個(gè)可以以清晰的方式管理狀態(tài)變化的庫。它的靈感來自Flux,但是有一些簡化。Redux的關(guān)鍵思想在于,應(yīng)用程序的整個(gè)狀態(tài)由單個(gè)對象表示,該對象由名為reducers的函數(shù)進(jìn)行突變。Reducers本身是純功能,與組件分開實(shí)現(xiàn)。這樣可以更好地分離問題和測試。
如果你正在開展一個(gè)簡單的項(xiàng)目,那么引入Redux可能有點(diǎn)得不償失,但對于中等和大型項(xiàng)目來說,這是一個(gè)很好的選擇。
Angular TypeScript
TypeScript是一種基于JavaScript開發(fā)并由Microsoft開發(fā)的新語言。它是JavaScript ES2015的超集,并包含較新版本的語言的功能。你可以使用它而不是Babel來編寫最先進(jìn)的JavaScript。它還可以通過使用注釋和類型推斷的組合來靜態(tài)分析你的代碼。
還有一個(gè)更微妙的好處。TypeScript受到Java和.NET的嚴(yán)重影響,所以如果你的開發(fā)人員有這些語言之一的背景知識,他們可能會比簡單的JavaScript更容易找到TypeScript(請注意我們?nèi)绾螐墓ぞ咔袚Q到你的個(gè)人環(huán)境)。 雖然Angular是第一個(gè)積極采用TypeScript的主要框架,但它也可以與React一起使用。
RxJS
RxJS是一個(gè)響應(yīng)式編程庫,可以靈活地處理異步操作和事件。它是將Observer和Iterator模式與功能編程相結(jié)合的組合。RxJS允許您將任何東西視為連續(xù)的流,并對其進(jìn)行各種操作,例如映射,過濾,拆分或合并。
該類庫已被Angular采用其HTTP模塊以及一些內(nèi)部使用。當(dāng)您執(zhí)行HTTP請求時(shí),它返回一個(gè)Observable,而不是通常的Promise。 雖然這個(gè)類庫非常強(qiáng)大,但也很復(fù)雜。要掌握它,您將需要了解不同類型的“可觀察”,“主題”以及大約一百種方法和操作符 。
當(dāng)您使用連續(xù)數(shù)據(jù)流(如Web套接字)工作很多的情況下,RxJS非常有用,但是對于其他任何東西來說似乎過于復(fù)雜。 無論如何,當(dāng)你使用Angular時(shí),您至少應(yīng)該了解RxJS的基本知識。
TypeScript可以說是Angular中非常重要的特點(diǎn),首先他給原本C#/Java開發(fā)人員提供了很容易進(jìn)入前端的機(jī)會,另外TypeScript也想比JavaScript更容易理解,尤其是代碼量或者業(yè)務(wù)復(fù)雜的項(xiàng)目中。
生態(tài)系統(tǒng)
開源框架這么流行的原因之一,就是圍繞著他們,會有無數(shù)的工具、類庫、擴(kuò)展來支撐整個(gè)框架,有時(shí),這些工具可能比框架本身更有幫助,接下來我們就來看看相關(guān)這兩個(gè)框架最流行的工具和類庫。
Angular Angular CLI
現(xiàn)代框架的流行趨勢是使用CLI工具,可以幫助您引導(dǎo)項(xiàng)目,而無需自行配置構(gòu)建。Angular有Angular CLI。它允許您僅使用幾個(gè)命令來生成和運(yùn)行項(xiàng)目。負(fù)責(zé)構(gòu)建應(yīng)用程序的所有腳本,啟動開發(fā)服務(wù)器和運(yùn)行測試都會在node_modules中隱藏。您也可以在開發(fā)過程中使用它來生成新的代碼。這使得新項(xiàng)目的設(shè)置變得輕而易舉。
Ionic 2
Ionic 2 是開發(fā)混合移動應(yīng)用程序的流行框架的新版本。它提供了一個(gè)與Angular 2完美集成的Cordova容器,以及一個(gè)漂亮的材料組件庫。 使用它,您可以輕松地設(shè)置和構(gòu)建移動應(yīng)用程序。 如果您喜歡使用混合應(yīng)用程序,那么這是一個(gè)不錯(cuò)的選擇。
Material design components
如果您熱衷于設(shè)計(jì)Material,您會很高興聽到Angular有一個(gè)Material組件庫。
Angular universal
Angular universal是一個(gè)種子項(xiàng)目,可用于創(chuàng)建支持服務(wù)器端渲染的項(xiàng)目。
@ngrx/store
@ngrx/store是由Redux啟發(fā)的Angular的狀態(tài)管理庫,基于由pure reducer進(jìn)行突變的狀態(tài)。它與RxJS的集成允許您利用推送更改檢測策略獲得更好的性能。
關(guān)于更多的有關(guān)Angular相關(guān)類庫和工具可以參考:the Awesome Angular list
React Create React App
Create-react-app 是一個(gè)CLI工具,用于快速創(chuàng)建新的React應(yīng)用??梢陨梢粋€(gè)新的工程,啟動開發(fā)服務(wù)器并創(chuàng)建綁定。Jest(來自Facebook的一個(gè)單元測試工具)也同時(shí)集成在Create-react-app內(nèi)部,更方便的讓我們進(jìn)行單元測試。
React Native
React Native 是Facebook開發(fā)的基于React在移動端的開發(fā)平臺,借助此平臺,React可以創(chuàng)建真正的Native的UI。提供了一系列標(biāo)準(zhǔn)的React組件用于綁定。同時(shí)允許創(chuàng)建自己的組件并與Objective-C、Java或者Swift的代碼進(jìn)行綁定。
Material UI
還有一個(gè)可用于React的Material Design Component。與Angular的版本相比,這個(gè)版本比較成熟,可以使用更廣泛的組件。
Next.js
Next.js 是React應(yīng)用程序的服務(wù)器端呈現(xiàn)的框架。它提供了一種在服務(wù)器上完全或部分呈現(xiàn)應(yīng)用程序的靈活方式,將結(jié)果返回給客戶端并在瀏覽器中繼續(xù)。它試圖使創(chuàng)建通用應(yīng)用程序的復(fù)雜任務(wù)盡可能簡單,所以設(shè)置被設(shè)計(jì)為盡可能簡單,最少量的新原語和對項(xiàng)目結(jié)構(gòu)的要求。
MobX
MobX 是用于管理應(yīng)用程序狀態(tài)的替代庫。不像Redux那樣將狀態(tài)保存在一個(gè)不可變的存儲中,它鼓勵(lì)您僅存儲最低限度的必需狀態(tài),并從其中獲取剩余的數(shù)據(jù)。它提供了一組裝飾器來定義可觀察和觀察者,并將反應(yīng)邏輯引入到你的狀態(tài)管理代碼中。
Storybook
Storybook是React的組件開發(fā)環(huán)境。它允許您快速設(shè)置單獨(dú)的應(yīng)用程序來顯示您的組件。除此之外,它提供了許多附加組件來記錄,開發(fā),測試和設(shè)計(jì)您的組件。
同樣的,可以從Awesome React list了解更多的工具和類庫。
學(xué)習(xí)曲線與開發(fā)體驗(yàn)
選擇新技術(shù)的一個(gè)重要標(biāo)準(zhǔn)是學(xué)習(xí)它是否容易。當(dāng)然,答案取決于廣泛的因素,例如您以前的經(jīng)驗(yàn)和對相關(guān)概念和模式的普遍了解。如果我們假設(shè)你已經(jīng)知道ES6 +,構(gòu)建工具和所有這些,我們來看看你還需要了解什么。
React
有了React,你會遇到的第一件事就是JSX。對于一些開發(fā)人員來說似乎剛開始會覺得很別扭,但它并沒有增加復(fù)雜性; 只是表達(dá)式,實(shí)際上還是JavaScript,還有一個(gè)特殊的類似HTML的語法。您還需要學(xué)習(xí)如何編寫組件,使用props進(jìn)行配置和管理內(nèi)部狀態(tài)。不需要學(xué)習(xí)任何新的邏輯結(jié)構(gòu)或循環(huán),因?yàn)樗羞@些都是純JavaScript。
官方教程是開始學(xué)習(xí)React的好地方。一旦完成了官方教程,接下來應(yīng)該熟悉并掌握React的路由機(jī)制 。React Router v4版本可能稍微復(fù)雜和非常規(guī),但也不許太過擔(dān)心。
使用Redux將需要一個(gè)范式的轉(zhuǎn)變,免費(fèi)入門Redux視頻課程可以快速介紹核心概念。根據(jù)項(xiàng)目的大小和復(fù)雜性,找到并學(xué)習(xí)一些額外的庫,這可能是棘手的一部分,但之后,一切都應(yīng)該變得順利。
其實(shí),React的上手非常容易,最難的部分可能是如何挑選合適你項(xiàng)目或產(chǎn)品的類庫。
Angular
Angular將向您介紹比React更多的新概念。首先,您需要使用TypeScript。對于具有靜態(tài)類型語言(如Java或.NET)經(jīng)驗(yàn)的開發(fā)人員,這可能比JavaScript更容易理解,但對于純JavaScript開發(fā)人員,這可能需要一些額外的學(xué)習(xí)。
框架本身豐富的技術(shù)主題可以從諸如模塊,依賴注入、裝飾器、組件、服務(wù)、管道、模板和指令等基礎(chǔ)開始,到更高級的主題,如更改檢測,區(qū)域,AoT編譯和RxJS。這些都在文檔中。RxJS是一個(gè)很重的話題,在官方網(wǎng)站上有詳細(xì)描述。雖然在基本功能層面上使用起來相對容易,但在轉(zhuǎn)到高級應(yīng)用時(shí)會變得更加復(fù)雜。
總而言之,我們注意到Angular的進(jìn)入壁壘高于React。新概念的數(shù)量絕對令新來者感到困惑。又是碰到一些問題還不得不Google后才能找到答案,但是,就像之前說的,是否合適,還是取決于更多的因素。
前景 Angular
就在2017年的3月,Angular已經(jīng)發(fā)布了4.0的版本(兼容2.x版本),關(guān)于為什么是4.0,官方的解釋是因?yàn)镽outer這個(gè)主要核心組件的版本已經(jīng)是4.0.0,如果Angular還用3.0會引起混淆,如下圖:
4.0版本中主要是大幅度的減小了代碼體積(60%),同時(shí)提高了加載的速度(肉眼可查的程度),同時(shí)報(bào)錯(cuò)的信息更清晰了。根據(jù)官方的文檔,Angular的版本升級會以比較快的速度進(jìn)行迭代
無論是大版本的6個(gè)月迭代,還是每周的hotfix,能看出Angular團(tuán)隊(duì)想用快速升級的策略迅速占領(lǐng)市場。
React
反觀React的升級倒是非常謹(jǐn)慎的,這從最新的v15.5.0的發(fā)布新聞博客中就能看出
不過,從博客中能看到React即將迎來v16,不知道整個(gè)重寫的React會給我們帶來什么驚喜。不過,需要提一下的是Facebook已經(jīng)與去年底的時(shí)候發(fā)布了React VR,有興趣的同學(xué)可以圍觀以下。
契合度
無論是哪個(gè)框架,適合自己的才是“好“的,所以需要你從項(xiàng)目(產(chǎn)品)本身的角度去衡量,以下的問題列表可能并不全面,但至少可以作為一個(gè)開始
該項(xiàng)目(產(chǎn)品)有多大規(guī)模?要維護(hù)多久?所有的功能是提前清楚地定義還是靈活的改變?域模型和業(yè)務(wù)邏輯是否復(fù)雜?你定位什么平臺? Web,手機(jī),桌面?你需要服務(wù)器端渲染嗎? SEO重要嗎?你會處理很多實(shí)時(shí)事件流?你的團(tuán)隊(duì)有多大?你的開發(fā)人員有多豐富,他們的背景是什么?是否有任何您想要使用的現(xiàn)成的組件庫?
如果您正在開展一個(gè)大型項(xiàng)目,并希望盡可能減少錯(cuò)誤選擇的風(fēng)險(xiǎn),請考慮先創(chuàng)建一個(gè)demo用于驗(yàn)證產(chǎn)品概念。選擇項(xiàng)目的一些主要功能,并嘗試使用其中一個(gè)框架以簡單的方式實(shí)現(xiàn)它們。 Demo通常不會(也不應(yīng)該)花費(fèi)很多時(shí)間,但會提供一些寶貴的經(jīng)驗(yàn),可以幫助您驗(yàn)證關(guān)鍵的技術(shù)要求。如果對結(jié)果感到滿意,可以繼續(xù)全面構(gòu)建。如果沒有,會給你充分的時(shí)間重新選擇。在項(xiàng)目發(fā)開過程中,你還可以借助一些支持Angular和React的開發(fā)工具來提高開發(fā)效率,如Wijmo,這是一款為企業(yè)應(yīng)用程序開發(fā)而推出的一系列包含 HTML5 和 JavaScript 的開發(fā)控件集。無論你的應(yīng)用程序是移動端、PC端、還是必須要支持IE6,Wijmo Enterprise 均能滿足需求。
下面在給大家看一下一位資深程序員關(guān)于這2個(gè)框架的對比以及心得:
首先我現(xiàn)在的經(jīng)驗(yàn)是Angular和Ember都只玩過TODOMVC的tutorial,React的話自己正在寫一個(gè)Chrome的App和公司的一個(gè)小項(xiàng)目。
最近正好有個(gè)新項(xiàng)目在評估用Angular,Ember還是React(+Flux),我隨便談一點(diǎn)自己的淺見。
Angular.js
首先Angular的背后是Google(難道這就是官網(wǎng)被墻的原因?),所以社區(qū)基礎(chǔ)是不用擔(dān)心的,整個(gè)生態(tài)也已經(jīng)是非常的完整了,從最基本的Tutorial到StackOverflow的問題數(shù)到框架本身的剖析都有非常非常多,所以從這個(gè)角度看起來Angular應(yīng)該算是上手比較容易的。
不過Angular目前的問題看起來也很明顯
1. 性能
同樣是TODOMVC的Sample,Angular完全載入用了1.1s(WebPagetest - Visual Comparison)。目前我用到的基于Angular的就是Kibana,不得不說,確實(shí)挺慢的。。
2. Angular 2.0
Angular的2.0幾乎是一個(gè)推翻重做的框架,估計(jì)不會有1.X的upgrade方案。所以如果現(xiàn)在新開始的項(xiàng)目采用Angular的話,會是一個(gè)很尷尬的時(shí)機(jī)。同樣,如此大的改動似乎也反面印證了1.X并不是那么好。這篇文章推薦去看看Why you should not use
AngularJs
React.js
React很大的特點(diǎn)就是“輕”,再加上VDOM這個(gè)很好的idea讓React非常非??欤ㄔ谏厦婺莻€(gè)測試?yán)锩?.3s左右就載入完畢)。另外React和Angular一個(gè)很大的不同就是React采用的是one-way data flow。
React的缺點(diǎn)嘛,大概就是現(xiàn)在還太新了很難說將來有沒有大的API變化,目前在大的穩(wěn)定的項(xiàng)目上采用React的,我也就只知道有Yahoo的Email。所以現(xiàn)在很少有批評React的聲音也許不是他真的就沒有坑,而是那些坑還沒有被踩出來而已。
還有就是React本身只是一個(gè)V而已,所以如果是大型項(xiàng)目想要一套完整的框架的話,也許還需要引入Flux和routing相關(guān)的東西。React的routing我沒有研究過,但是Flux的話已經(jīng)有出現(xiàn)一些批評的聲音了。
總結(jié)
Angular是真正的大而全的framework,他有自己一套思路,基本你follow這個(gè)思路往里面填代碼就OK。
React是一個(gè)簡短有力的library,他只負(fù)責(zé)解決你某個(gè)單一的“痛點(diǎn)”。
相關(guān)文章
Angular7中創(chuàng)建組件/自定義指令/管道的方法實(shí)例詳解
這篇文章主要介紹了在angular7中創(chuàng)建組件/自定義指令/管道的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04Angular 根據(jù) service 的狀態(tài)更新 directive
Angular JS (Angular.JS) 是一組用來開發(fā)Web頁面的框架、模板以及數(shù)據(jù)綁定和豐富UI組件。本文給大家介紹Angular 根據(jù) service 的狀態(tài)更新 directive,需要的朋友一起學(xué)習(xí)吧2016-04-04ionic+AngularJs實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時(shí)按鈕
本篇文章主要介紹了ionic+AngularJs實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時(shí)按鈕,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04Angular.js中用ng-repeat-start實(shí)現(xiàn)自定義顯示
大家都知道Angular.js可以用ng-repeat來顯示列表數(shù)據(jù),可是如果想要自定義顯示數(shù)據(jù)列表的話ng-repeat就實(shí)現(xiàn)不了了,這個(gè)時(shí)候可以利用ng-repeat-start 和 ng-repeat-end來實(shí)現(xiàn),下面通過本文來詳細(xì)看看實(shí)現(xiàn)的方法吧。2016-10-10Angular 利用路由跳轉(zhuǎn)到指定頁面的指定位置方法
今天小編就為大家分享一篇Angular 利用路由跳轉(zhuǎn)到指定頁面的指定位置方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08