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