React 和 Vue 到底誰更牛?聽聽尤雨溪怎么說
知乎上近日有人發(fā)起了一個 “react 是不是比 vue 牛皮,為什么?” 的問題,再度引發(fā)一場關(guān)于前端框架誰更牛的口水戰(zhàn),評論里可以說是撕得不可開交。Vue.js 作者尤雨溪12月4日正面回應(yīng)了該問題,他表示希望大家能停止無謂的爭執(zhí),多想想使用這些技術(shù)的初衷,比起爭論這個,倒不如多想想怎么讓自己變得更牛。
這個問題下面的很多回答太偏激了,其實我淡出知乎就是因為這類破事... 但是作為作者還是認(rèn)真地說一說吧,希望能以后別再有這種問題了。
這里我可以大方地承認(rèn),如果多年以后要論歷史地位,React 肯定是高于 Vue 的。事實上,我作為一個開發(fā)者,也是由衷地佩服 Jordan Walke, Sebastian Markbage 這樣的,能從開發(fā)模式層面上提出突破性的新方向的人。
React 從一開始的定位就是提出 UI 開發(fā)的新思路。當(dāng)年 Pete Hunt 最開始推廣 React 的時候的一句口號就叫 "Rethinking Best Practices",這樣的定位使得 React 打開了一些全新的思路,吸引了一群喜歡折騰的早期核心用戶,并在這個基礎(chǔ)上通過社區(qū)迭代孵化出了許多今天被 React 開發(fā)者當(dāng)作常識的 pattern。這是 React 偉大的地方,Vue 里面也有很多地方是直接受到了 React 的啟發(fā)。React 敢做這樣的嘗試,是因為它是 Facebook。這樣的體量的公司,在 infrastructure 層面獲得質(zhì)的提升,收益是巨大的,而且 Facebook 的工程師們足夠聰明又要靠工資吃飯,改變他/她們的習(xí)慣并不是什么問題。而對外推廣,則是一種大公司才有的 “改變業(yè)界” 的底氣。
Vue 從一開始的定位就是盡可能的降低前端開發(fā)的門檻,讓更多的人能夠更快地上手開發(fā)。我以前也說過,開發(fā) Vue 的初衷不是為了搞個大新聞,只是做了個我自己用得舒服的框架。我雖然也在 Google 這樣的大公司呆過,但骨子里是一個喜歡自由的人,也一直覺得獨(dú)立開發(fā)者很酷(這也是為什么最終自己也成了一個獨(dú)立開發(fā)者)。很多時候我更希望自己做的東西能幫到那些中小型企業(yè)和個人開發(fā)者。舉個例子來說,美國傳統(tǒng)行業(yè)里有很多 small business,它們不像大公司那樣有專門的 IT 團(tuán)隊來信息化整個流程,很多只能雇一個普通的 contractor 程序員,有些甚至是老板自己兼職研究代碼。我收到過好幾封這樣的感謝信,說因為 Vue 讓它們多快好省地做了個內(nèi)部應(yīng)用,解決了實際問題,這樣的故事是讓我覺得特別爽的。
做 React 這樣的不迎合用戶,而是試圖改變用戶的設(shè)計需要有足夠的本錢:你得有足夠的資源和背景去強(qiáng)行越過初始推廣的那個陡坡。事實上,如果沒有 Facebook 作為 React 的推廣者,React 很可能最終是一個有著忠實用戶群體的小眾框架(比如 Elm)。作為一個個人項目的 Vue 沒有這樣的宣傳資源,也并不是為了改變用戶。所以從設(shè)計的角度上來說,Vue 首先考慮的是假設(shè)用戶只掌握了 web 基礎(chǔ)知識 (HTML, CSS, JS) 的情況下,如何能夠最快理解和上手,實現(xiàn)一個看得見摸得著的應(yīng)用。
一個 API 看得順不順眼,用得舒不舒服,很大程度上取決于你跟一個技術(shù)的核心用戶群體的重合程度。編程語言之間噴來噴去還少么?大家都是圖靈完備,然而此之蜜糖,彼之砒霜。Vue 的 API 設(shè)計固然有可以商榷的地方,但 React 也不是完美無瑕,不然也不會從 mixins 到 HOC 到 render props 一次次地折騰,更沒有 hooks 什么事了。直到 Suspense 出現(xiàn)前,也不存在什么只有 React 才能做到的事情(順帶一提,有意思的是 hooks 基本上廢掉了過去大部分基于組件的邏輯抽象模式,抹掉了 JSX vs. 模版的一個優(yōu)勢,也完全可以用在其他框架里,連 Angular 都已經(jīng)有對應(yīng)的原型實現(xiàn)...)然而 “不完美” 并沒有妨礙在過去的幾年內(nèi)大量的用戶用各自選擇的技術(shù)做出實際的產(chǎn)品 —— 從 State of JS 近兩年的數(shù)據(jù)來看,兩者的滿意率是差不多的,都在 90% 出頭,說明兩者在 “滿足目標(biāo)用戶的需求” 這個衡量標(biāo)準(zhǔn)下,表現(xiàn)是差不多的??删S護(hù)性、可讀性、優(yōu)雅程度、生態(tài)這些東西嘴上怎么辯都可以,還是數(shù)據(jù)比較實在。
再說說具體技術(shù)層面:從加載速度、運(yùn)行時性能來說,兩者目前綜合各種場景應(yīng)該說是沒有什么質(zhì)的差別。硬要說的話,Vue 在 update 性能優(yōu)化方面需要的心智負(fù)擔(dān)可能少那么一點 —— React 如果不注意,容易導(dǎo)致過多的組件無用 diff,但是實際上真正會遇到性能瓶頸的應(yīng)用也是少數(shù)... Vue 3 會比 Vue 2 快不少,加上模版編譯還有一些可進(jìn)一步發(fā)掘的優(yōu)化空間,所以性能上會比現(xiàn)在的 React 有一定優(yōu)勢,但 React 那邊也在研究基于 prepack 的編譯時優(yōu)化,這個也是挺值得期待的。Vue 3 對于 TS 的支持會有很大改善(包括 TSX),我們也在計劃對模版做更好的 IDE 支持(比如補(bǔ)全、類型檢查),現(xiàn)在沒有不代表以后不能有,有批評我們改進(jìn)就是了。其實過去大半年 Vue 本身沒有什么大更新是因為精力都放在工具鏈上了,接下來又要回到核心上了。React 那邊 time slicing / Concurrent mode 要明年 Q2 才穩(wěn)定,那個時候應(yīng)該 Vue 3 的 time slicing 應(yīng)該也穩(wěn)定了(原型已實現(xiàn))。Suspense 在 data-fetching 穩(wěn)定之前并沒什么大用(要 2019 年中),這期間我們也會研究解決同類問題的方案。所以從純技術(shù)層面來說,React 現(xiàn)在比 Vue 牛逼么?不好說。以后一定比 Vue 牛逼么?也不好說。
使用數(shù)量方面,有很多文章拿各種數(shù)據(jù)來比較,有的是 GitHub stars,有的是 npm 下載量,有的是 Google trends,有的是 StackOverflow 的問題數(shù)量... 其實這些數(shù)據(jù)都有很明顯的問題,那就是它們跟實際使用者的數(shù)量并不一定是正比,會受到其它因素的影響,比如 GitHub stars 跟實際使用沒有直接關(guān)聯(lián);使用者中使用 CI 的比例會影響 npm 的下載量;Google trends 很難完美過濾掉 React 這樣的常見詞匯的 false positive;文檔和本身的上手難易程度會影響 StackOverflow 的問題數(shù)量,等等... 所以我自己一直是以 Chrome 開發(fā)者插件的使用者數(shù)量作為一個比較可靠的數(shù)據(jù),因為它的關(guān)聯(lián)度是最直接的,潛在的干擾因素也是最少的。目前 Vue 的開發(fā)者插件用戶數(shù)量約為 70.4 萬,而 React 是 136.3 萬,大致可以作為參考。React 的使用量還是有明顯優(yōu)勢,不過這個數(shù)字比起兩年前已經(jīng)很不一樣了 —— 那時候大約是 1:7 的比例。從增速來看,Vue 是要快一些的。
說了這么多,無非是希望大家能停下來想想所謂的 ”A 技術(shù)比 B 技術(shù)牛逼“ 背后到底是在爭些什么,我們使用這些技術(shù)的初衷又是什么。很多時候你說這方面,他說那方面,雞同鴨講,即使說到一起去,也往往缺乏對等的信息量或者基礎(chǔ)共識,只是各自表達(dá)主觀看法,最后變成兩個陣營各自抱團(tuán)取暖... 說到底,就算你證明了 A 比 B 牛逼,也不意味著你或者你的項目就牛逼了... 比起爭這個,不如多想想怎么讓自己變得更牛逼吧。