前端框架天下三分:Angular React 和 Vue的比較

前端這幾年的技術(shù)發(fā)展很快,細(xì)分下來,主要可以分成四個(gè)方面:

  1. 開發(fā)語言技術(shù),主要是ES6&7,coffeescript,typescript等;
  2. 開發(fā)框架,如Angular,React,Vue.js,Angular2等;
  3. 開發(fā)工具的豐富和前端工程化,像Grunt,Gulp,Webpack,npm,eslint,mocha這些技術(shù);
    就開發(fā)框架這塊,Angular(1&2),React,Vue目前占據(jù)著主流地位而且會相持比較長的一段時(shí)間,所以這里對比一下這三門技術(shù),以便之后的技術(shù)選型。

一. 趨勢

Vue.js


Reactjs

Angularjs

2.對比
雖然放在一起Angular還是最火的,但從單個(gè)趨勢圖可以看出來reactjs和vuejs明顯是火箭一般上升。很明顯可以看到Angular在16時(shí)候有個(gè)大跌幅,那時(shí)候正是React坐火箭上升最快的。就是那時(shí)候很多Angular的項(xiàng)目轉(zhuǎn)成了React。如果Angular沒有出2,那估計(jì)Angular就真的離滅亡不遠(yuǎn)了。

3.GitHub受歡迎程度

4.定位
雖然Vue.js被定義為MVC framework,但其實(shí)Vue本身還是一個(gè)library,加了一些其他的工具,可以被當(dāng)成一個(gè)framework。ReactJS也是library,同樣道理,配合工具也可以成為一個(gè)framework。AngularJS(本文AngularJS特指Angular 1, Angular 2特指第二版Angular)是一個(gè)framework,而Angular 2雖然還是一個(gè)framework,但其實(shí)在設(shè)計(jì)之初,Angular 2的團(tuán)隊(duì)站在了更高的角度,希望做一個(gè)platform。
5.上手容易度
Vue.js hello world

ReactJS hello world

** 6.文檔清晰度**
現(xiàn)在的前端framework,用起來就像按照說明書使用家用電器一樣。按照文檔一步步寫就好了,所以文檔的清晰度非常重要。同時(shí)小伙伴也很重要,越多的人使用,那遇到一樣問題的人就越多,stackoverflow上面可能早就有幫你解決問題的小伙伴了。就這幾個(gè)來說,我個(gè)人認(rèn)為Vue.js的文檔最懇切。我認(rèn)為結(jié)合文檔和遇到問題Google答案的匹配度來講:

Vue.js > ReactJS > AngularJS > Angular 2

二. 數(shù)據(jù)流

1.Angular 使用雙向綁定即:界面的操作能實(shí)時(shí)反映到數(shù)據(jù),數(shù)據(jù)的變更能實(shí)時(shí)展現(xiàn)到界面。
實(shí)現(xiàn)原理:
$scope
變量中使用臟值檢查來實(shí)現(xiàn)。像ember.js是基于setter,getter的觀測機(jī)制,
$scope.$watch
函數(shù),監(jiān)視一個(gè)變量的變化。函數(shù)有三參數(shù),”要觀察什么”,”在變化時(shí)要發(fā)生什么”,以及你要監(jiān)視的是一個(gè)變量還是一個(gè)對象。
使用ng-model時(shí),你可以使用雙向數(shù)據(jù)綁定。 使用$scope.$watch
(視圖到模型)以及$scope.$apply
(模型到視圖),還有$scope.$digest
雙向綁定的三個(gè)重要方法:
$scope.$apply()$scope.$digest()$scope.$watch()
在AngularJS雙向綁定中,有2個(gè)很重要的概念叫做dirty check,digest loop,dirty check(臟檢測)是用來檢查綁定的scope中的對象的狀態(tài)的,例如,在js里創(chuàng)建了一個(gè)對象,并且把這個(gè)對象綁定在scope下,這樣這個(gè)對象就處于digest loop中,loop通過遍歷這些對象來發(fā)現(xiàn)他們是否改變,如果改變就會**調(diào)用相應(yīng)的處理方法來實(shí)現(xiàn)雙向綁定。

  1. Vue 也支持雙向綁定,默認(rèn)為單向綁定數(shù)據(jù)從父組件單向傳給子組件。在大型應(yīng)用中使用單向綁定讓數(shù)據(jù)流易于理解。
    Vue相比():
    Vue.js 有更好的性能,并且非常非常容易優(yōu)化,因?yàn)樗皇褂门K檢查。Angular,當(dāng) watcher 越來越多時(shí)會變得越來越慢,因?yàn)樽饔糜騼?nèi)的每一次變化,所有 watcher 都要重新計(jì)算。
    并且,如果一些 watcher 觸發(fā)另一個(gè)更新,臟檢查循環(huán)(digest cycle)可能要運(yùn)行多次。 Angular 用戶常常要使用深?yuàn)W的技術(shù),以解決臟檢查循環(huán)的問題。有時(shí)沒有簡單的辦法來優(yōu)化有大量 watcher 的作用域。
    Vue.js 則根本沒有這個(gè)問題,因?yàn)樗褂没谝蕾囎粉櫟挠^察系統(tǒng)并且異步列隊(duì)更新,所有的數(shù)據(jù)變化都是獨(dú)立地觸發(fā),除非它們之間有明確的依賴關(guān)系。唯一需要做的優(yōu)化是在 v-for 上使用 track-by。

  2. React-單向數(shù)據(jù)流
    MVVM流的Angular和Vue,都是通過類似模板的語法,描述界面狀態(tài)與數(shù)據(jù)的綁定關(guān)系,然后通過內(nèi)部轉(zhuǎn)換,把這個(gè)結(jié)構(gòu)建立起來,當(dāng)界面發(fā)生變化的時(shí)候,按照配置規(guī)則去更新相應(yīng)的數(shù)據(jù),然后,再根據(jù)配置好的規(guī)則去,從數(shù)據(jù)更新界面狀態(tài)。
    React推崇的是函數(shù)式編程和單向數(shù)據(jù)流:給定原始界面(或數(shù)據(jù)),施加一個(gè)變化,就能推導(dǎo)出另外一個(gè)狀態(tài)(界面或者數(shù)據(jù)的更新)。
    React和Vue都可以配合Redux來管理狀態(tài)數(shù)據(jù)。

三. 視圖渲染

  1. AngularJS的工作原理是:HTML模板將會被瀏覽器解析到DOM中, DOM結(jié)構(gòu)成為AngularJS編譯器的輸入。AngularJS將會遍歷DOM模板, 來生成相應(yīng)的NG指令,所有的指令都負(fù)責(zé)針對view(即HTML中的ng-model)來設(shè)置數(shù)據(jù)綁定。因此, NG框架是在DOM加載完成之后, 才開始起作用的。
    React
  2. React 的渲染建立在 Virtual DOM 上——一種在內(nèi)存中描述 DOM 樹狀態(tài)的數(shù)據(jù)結(jié)構(gòu)當(dāng)狀態(tài)發(fā)生變化時(shí),React 重新渲染 Virtual DOM,比較計(jì)算之后給真實(shí) DOM 打補(bǔ)丁。
    Virtual DOM 提供了函數(shù)式的方法描述視圖,它不使用數(shù)據(jù)觀察機(jī)制,每次更新都會重新渲染整個(gè)應(yīng)用,因此從定義上保證了視圖與數(shù)據(jù)的同步。它也開辟了 JavaScript 同構(gòu)應(yīng)用的可能性。
    超大量數(shù)據(jù)的首屏渲染速度上,React 有一定優(yōu)勢,因?yàn)?Vue 的渲染機(jī)制啟動時(shí)候要做的工作比較多,而且 React 支持服務(wù)端渲染。
    React 的 Virtual DOM 也需要優(yōu)化。復(fù)雜的應(yīng)用里可以選擇 1. 手動添加 shouldComponentUpdate 來避免不需要的 vdom re-render;2. Components 盡可能都用 pureRenderMixin,然后采用 Flux 結(jié)構(gòu) + Immutable.js。其實(shí)也不是那么簡單的。相比之下,Vue 由于采用依賴追蹤,默認(rèn)就是優(yōu)化狀態(tài):動了多少數(shù)據(jù),就觸發(fā)多少更新,不多也不少。
    React 和 Angular 2 都有服務(wù)端渲染和原生渲染的功能。
  3. Vue.js 不使用 Virtual DOM 而是使用真實(shí) DOM 作為模板,數(shù)據(jù)綁定到真實(shí)節(jié)點(diǎn)。Vue.js 的應(yīng)用環(huán)境必須提供 DOM。Vue.js 有時(shí)性能會比 React 好,而且?guī)缀醪挥檬止?yōu)化。

四. 性能與優(yōu)化

性能方面,這幾個(gè)主流框架都應(yīng)該可以輕松應(yīng)付大部分常見場景的性能需求,區(qū)別在于可優(yōu)化性和優(yōu)化對于開發(fā)體驗(yàn)的影響。Vue 的話需要加好 track-by 。React 需要 shouldComponentUpdate 或者全面 Immutable,Angular 2 需要手動指定 change detection strategy。從整體趨勢上來說,瀏覽器和手機(jī)還會越變越快,框架本身的渲染性能在整個(gè)前端性能優(yōu)化體系中,會漸漸淡化,更多的優(yōu)化點(diǎn)還是在構(gòu)建方式、緩存、圖片加載、網(wǎng)絡(luò)鏈路、HTTP/2 等方面。

五. 模塊化與組件化

Angular1 -> Angular2
Angular1使用依賴注入來解決模塊之間的依賴問題,模塊幾乎都依賴于注入容器以及其他相關(guān)功能。不是異步加載的,根據(jù)依賴列出第一次加載所需的所有依賴。
可以配合類似于Require.js來實(shí)現(xiàn)異步加載,懶加載(按需加載)則是借助于 ocLazyLoad 方式的解決方案,但是理想情況下應(yīng)該是本地框架會更易懂。
Angular2使用ES6的module來定義模塊,也考慮了動態(tài)加載的需求。
Vue
Vue中指令和組件分得更清晰。指令只封裝 DOM 操作,而組件代表一個(gè)自給自足的獨(dú)立單元 —— 有自己的視圖和數(shù)據(jù)邏輯**。在 Angular1 中兩者有不少相混的地方。

React
一個(gè) React 應(yīng)用就是構(gòu)建在 React 組件之上的。 組件有兩個(gè)核心概念:props,state。 一個(gè)組件就是通過這兩個(gè)屬性的值在 render 方法里面生成這個(gè)組件對應(yīng)的 HTML 結(jié)構(gòu)。
傳統(tǒng)的 MVC 是將模板放在其他地方,比如 script 標(biāo)簽或者模板文件,再在 JS 中通過某種手段引用模板。按這種思路,想想多少次我們面對四處分散的模板片段不知所措?糾結(jié)模板引擎,糾結(jié)模板存放位置,糾結(jié)如何引用模板。
React 認(rèn)為組件才是王道,而組件是和模板緊密關(guān)聯(lián)的,組件模板和組件邏輯分離讓問題復(fù)雜化了。所以就有了 JSX 這種語法,就是為了把 HTML 模板直接嵌入到 JS 代碼里面,這樣就做到了模板和組件關(guān)聯(lián),但是 JS 不支持這種包含 HTML 的語法,所以需要通過工具將 JSX 編譯輸出成 JS 代碼才能使用(可以進(jìn)行跨平臺開發(fā)的依據(jù),通過不同的解釋器解釋成不同平臺上運(yùn)行的代碼,由此可以有RN和React開發(fā)桌面客戶端)

六. 語法與代碼風(fēng)格

React,Vue,Angular2都支持ES6,Angular2官方擁抱了TypeScript這種 JavaScript 風(fēng)格。
React 以 JavaScript 為中心,Angular 2 依然保留以 HTML 為中心。Angular 2 將 “JS” 嵌入 HTML。React 將 “HTML” 嵌入 JS。Angular 2 沿用了 Angular 1 試圖讓 HTML 更強(qiáng)大的方式。
React 推薦的做法是 JSX + inline style,也就是把 HTML 和 CSS 全都整進(jìn) JavaScript 了。Vue 的默認(rèn) API 是以簡單易上手為目標(biāo),但是進(jìn)階之后推薦的是使用 webpack + vue-loader 的單文件組件格式(template,script,style寫在一個(gè)vue文件里作為一個(gè)組件)

七. 一些大公司使用例子

1. Vue

滴滴出行, 還出了一本書 Vue.js 權(quán)威指南餓了么,開源了一個(gè)基于Vue的UI庫 GitHub - ElemeFE/element: Desktop UI elements for Vue.js 2.0**
阿里的 weex GitHub - alibaba/weex: A framework for building Mobile cross-platform UI**
GitLab選擇了Vue https://about.gitlab.com/2016/10/20/why-we-chose-vue/**
小米移動商城
餓了么
蘇寧易購觸屏版、

2. React

阿里,React 和React-native (杭州)
知乎的評論功能

3. angular2

新出的例子少

八. 總結(jié)

1. 上手難度

Vue < react < angular

2. 使用場景

Vue React 覆蓋中小型,大型項(xiàng)目。
angular 一般用于大型(因?yàn)楸容^厚重)。
優(yōu)缺點(diǎn)

3. 渲染性能

Vue> react >angular

渲染性能
4. 前端庫實(shí)力參數(shù)對比
image.png

以上3大框架均不支持IE8以下;
IE9以下解決方法:Bootstrap (在IE8也會不支持一些樣式和屬性)+jQuery;
其他框架穩(wěn)定性欠缺

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容