React 還是 Vue:你該如何選擇?
本文譯自React or Vue: Which Javascript UI Library Should You Be Using?,原文需翻牆。
2016年React鞏固了它作為前端框架之王的地位,這一年中可以看到它在Web端和移動端的快速成長,同時穩穩領先於它的主要競爭對手Angular。
但是2016對Vue來說也是同樣令人印象深刻的一年,它釋出了Vue 2.0版本並且在JavaScript社群引起了巨大反響,GitHub上多出的25000顆star就是最好的證明。
React和Vue的適用範圍無疑是很相似的:同樣是基於元件的輕量級框架,同樣專注於使用者介面的檢視層。同樣可以用在簡單的專案中,也同樣可以使用全家桶擴充套件為複雜的應用程式。
因為,很多Web開發者想知道他們應該使用哪個框架。是其中一個明顯優於另一個?還是他們有各自的優點和坑?或者他們基本就是一個樣?
兩個框架 兩個擁護者
在本文中,我想用一次公平,徹底的對比來回答上面的疑問。但是唯一的問題是我是一個Vue粉絲,完全不夠客觀。今年我在專案中重度使用Vue,在Medium上大加讚賞,甚至還發布了Udemy課程
為了平衡我的偏見,我叫上了我的朋友Alexis Mangin,他是一個很牛的JavaScript開發者,同時也是一個React鐵粉。他同樣沉浸於React中,經常在Web端和移動端的專案中使用。
有一天Alexis問我:“為什麼你這麼中意Vue,而不是React呢?”那時候我不太瞭解React, 沒辦法給出一個好的答案。所以我出了一個主意,找一天時間,帶上膝上型電腦,互相介紹一下彼此做出選擇的原因。
經過大量的討論和和互相學習後,我們找到了6個關鍵點。
如果你喜歡用模板搭建應用(或者有這個想法),請選擇Vue
Vue應用的預設選項是把markup放在HTML檔案中。資料繫結表示式採用的是和Angular相似的mustache語法,而指令(特殊的HTML屬性)用來向模板新增功能。
下面的示例是一個簡單的Vue應用。它會展示message和一個用來reverse message的按鈕:
// HTML <div id="app"> <p>{{ message }}</p> <button v-on:click="reverseMessage">Reverse Message</button> </div> // JS new Vue({ el: '#app', data: { message: 'Hello Vue.js!' }, methods: { reverseMessage: function () { this.message = this.message.split('').reverse().join(''); } } });
相比之下,React應用不使用模板,它要求開發者藉助JSX在JavaScript中建立DOM。下面是用React實現的同樣的應用:
// HTML <div id="app"></div> // JS (pre-transpilation) class App extends React.Component { constructor(props) { super(props); this.state = { message: 'Hello React.js!' }; } reverseMessage() { this.setState({ message: this.state.message.split('').reverse().join('') }); } render() { return ( <div> <p>{this.state.message}</p> <button onClick={() => this.reverseMessage()}> Reverse Message </button> </div> ) } } ReactDOM.render(App, document.getElementById('app'));
對於來自標準Web開發方式的新開發者,模板更容易理解。但是一些資深開發者也喜歡模板,因為模板可以更好的把佈局和功能分割開來,還可以使用Pug之類的模板引擎。
但是使用模板的代價是不得不學習所有的HTML擴充套件語法,而渲染函式只需要會標準的HTML和JavaScript。而且比起模板,渲染函式更加容易除錯和測試。當然你不應該因為這方面的原因錯過Vue,因為在Vue2.0中提供了使用模板或者渲染函式的選項。
如果你喜歡簡單和“能用就行”的東西,請選擇Vue
一個簡單的Vue專案可以不需要轉譯直接執行在瀏覽器中,所以使用Vue可以像使用jQuery一樣簡單。當然這對於React來說在技術上也是可行的,但是典型的React程式碼是重度依賴於JSX和諸如class之類的ES6特性的。
Vue的簡單在程式設計的時候體現更深,讓我們來比較一下兩個框架是怎樣處理應用資料的(也就是state)。
React中的state是不可變(immutable)的,所以不能直接改變,需要使用API中的setState方法:
this.setState({ message: this.state.message.split('').reverse().join('') });
React中是通過比較當前state和前一個state來決定何時在DOM中進行重渲染以及渲染的內容,因此需要不可變(immutable)的state。
Vue中的資料是可變(mutated)的,所以同樣的操作看起來更加簡潔。
// Note that data properties are available as properties of // the Vue instance this.message = this.message.split('').reverse().join('');
讓我們來看看Vue中是如何進行狀態管理的。當向state新增一個新物件的時候,Vue將遍歷其中的所有屬性並且轉換為getter,setter方法,現在Vue的響應系統開始保持對state的跟蹤了,當state中的內容發生變化的時候就會自動重新渲染DOM。令人稱道的是,Vue中改變state的狀態的操作不僅更加簡潔,而且它的重新渲染系統也比React 的更快更有效率。Vue的響應系統還有有些坑的,例如:它不能檢測屬性的新增和刪除和某些陣列更改。這時候就要用到Vue API中的類似於React的set方法來解決。
如果你想要你的應用盡可能的小和快,請選擇Vue
當應用程式的狀態改變時,React和Vue都將構建一個虛擬DOM並同步到真實DOM中。 兩者都有各自的方法優化這個過程。
Vue核心開發者提供了一個benchmark測試,可以看出Vue的渲染系統比React的更快。測試方法是10000個專案的列表渲染100次,結果如下圖。
從實用的觀點來看,這種benchmark只和邊緣情況有關,大部分應用程式中不會經常進行這種操作,所以這不應該被視為一個重要的比較點。但是,頁面大小是與所有專案有關的,這方面Vue再次領先,它目前的版本壓縮後只有25.6KB。React要實現同樣的功能,你需要React DOM(37.4KB)和React with Addon庫(11.4KB),共計44.8KB,幾乎是Vue的兩倍大。雙倍的體積並不能帶來雙倍的功能。
如果你打算構建一個大型應用程式,請選擇React
像文章開頭那種同時用Vue和React實現的簡單應用程式,可能會讓一個開發者潛意識中更加傾向於Vue。這是因為基於模板的應用程式第一眼看上去更加好理解,而且能很快跑起來。但是這些好處引入的技術債會阻礙應用擴充套件到更大的規模。模板容易出現很難注意到的執行時錯誤,同時也很難去測試,重構和分解。
相比之下,Javascript模板可以組織成具有很好的分解性和幹(DRY)程式碼的元件,幹程式碼的可重用性和可測試性更好。Vue也有元件系統和渲染函式,但是React的渲染系統可配置性更強,還有諸如淺(shallow)渲染的特性,和React的測試工具結合起來使用,使程式碼的可測試性和可維護性更好。
與此同時,React的immutable應用狀態可能寫起來不夠簡潔,但它在大型應用中意義非凡,因為透明度和可測試性在大型專案中變得至關重要。
如果你想要一個同時適用於Web端和原生APP的框架,請選擇React
React Native是一個使用Javascript構建移動端原生應用程式(iOS,Android)的庫。 它與React.js相同,只是不使用Web元件,而是使用原生元件。 如果你學過React.js,很快就能上手React Native,反之亦然。
// JS import React, { Component } from 'react'; import { AppRegistry, Text, View } from 'react-native'; class HelloWorld extends Component { render() { return ( <View> <Text>Hello, React Native!</Text> </View> ); } } AppRegistry.registerComponent('HelloWorld', () => HelloWorld);
它的意義在於,開發者只需要一套知識和工具就能開發Web應用和移動端原生應用。如果你想同時做Web端開發和移動端開發,React為你準備了一份大禮。阿里的Weex也是一個跨平臺UI專案,目前它以Vue為靈感,使用了許多相同的語法,同時計劃在未來完全整合Vue,然而整合的時間和細節還不清楚。因為Vue將HTML模板作為它設計的核心部分,並且現有特性不支援自定義渲染,因此很難看出目前的Vue.js的跨平臺能力能像React和React Native一樣強大。
如果你想要最大的生態系統,請選擇React
毫無疑問,React是目前最受歡迎的前端框架。它在NPM上每個月的下載量超過了250萬次,相比之下,Vue是22.5萬次。
人氣不僅僅是一個膚淺的數字,這意味著更多的文章,教程和更多Stack Overflow的解答,還意味有著更多的工具和外掛可以在專案中使用,讓開發者不再孤立無援。
這兩個框架都是開源的,但是React誕生於Facebook,有Facebook背書,它的開發者和Facebook都承諾會持續維護React。相比之下,Vue是獨立開發者尤雨溪的作品。尤雨溪目前在全職維護Vue,也有一些公司資助Vue,但是規模和Facebook和Google沒得比。不過請對Vue的團隊放心,它的小規模和獨立性並沒有成為劣勢,Vue有著固定的釋出週期,甚至更令人稱道的是,Github上Vue只有54個open issue,3456個closed issue,作為對比,React有多達530個open issue,3447個closed issue。
如果你已經用其中一個用的很爽,就別變了
總結一下,我們發現的,Vue的優勢是:
- 模板和渲染函式的彈性選擇
- 簡單的語法和專案配置
- 更快的渲染速度和更小的體積
React的優勢是:
- 更適合大型應用和更好的可測試性
- Web端和移動端原生APP通吃
- 更大的生態系統,更多的支援和好用的工具
然而,React和Vue都是很優秀的框架,它們之間的相似之處多過不同之處,並且大部分的優秀功能是相通的:
- 用虛擬DOM實現快速渲染
- 輕量級
- 響應式元件
- 服務端渲染
- 整合路由工具,打包工具,狀態管理工具的難度低
- 優秀的支援和社群
如果你覺得我們有所遺漏的話歡迎在評論中指出。
相關文章
- 都 9012了,該選擇 Angular、React,還是Vue?AngularReactVue
- 你應該選擇 Ubuntu 還是 Fedora?Ubuntu
- [譯] Vue.js 還是 React?你會選擇哪一個?為什麼?Vue.jsReact
- 小程式還是APP,企業該如何選擇?APP
- 開發該選擇Blocks還是DelegatesBloC
- web伺服器該選擇apache還是nginxWeb伺服器ApacheNginx
- 測試開發應該選擇 Java 還是 Go 呢?JavaGo
- 怎樣選擇TCP還是選擇UDPTCPUDP
- 如何選擇谷歌seo還是adwords廣告?谷歌
- 萬兆網路卡該如何選擇?我來告訴你!
- 創業,你選擇靜態還是動態語言?創業
- 專科生該選擇學習雲端計算還是web前端Web前端
- 資料上雲,應該選擇全量抽取還是增量抽取?
- 移動端框架如雨後春筍,你該如何選擇?框架
- 程式設計師:選擇效率,還是選擇質量?程式設計師
- 資料科學領域,你該選 Python 還是 R ?資料科學Python
- Java選擇自學還是培訓?Java
- Java之外選擇Scala還是Groovy?Java
- 學Python應該選擇Linux系統還是Windows系統?PythonLinuxWindows
- 當iPad用上macOS,你會選擇iPad還是MacBook?iPadMac
- 如何選擇正確的Node框架:Express,Koa還是Hapi?框架ExpressAPI
- python和java該如何選擇?PythonJava
- 應該如何選擇CDP平臺?
- 資料跟蹤應該是選擇加入而不是選擇退出
- 用Vue.js開發原生應用選擇Weex還是NativeScript?Vue.js
- 選擇python還是web前端好PythonWeb前端
- 選擇HTTPS代理還是SOCKS代理?HTTP
- iOS 開發選擇OC還是Swift?iOSSwift
- 管理 node 版本,選擇 nvm 還是 n?
- 如何走出選擇PHP還是ASP.NET的兩難境地?PHPASP.NET
- 老闆:你為什麼要選擇 Vue?Vue
- 一文搞定:前端如何選擇Angular、React和Vue三大主流框架前端AngularReactVue框架
- 是否應該在未選中行時禁用刪除按鈕,還是應該在點選按鈕時提示選擇資料?
- 老菜鳥致青春,程式設計師應該選擇 Java 還是 C#程式設計師JavaC#
- 小程式容器技術,該如何選擇?
- ajax中該選json還是normal formJSONORM
- 分析選擇Salesforce CRM還是Zoho CRM(上)Salesforce
- 微服務選擇Spring Cloud還是Dubbo?微服務SpringCloud