React 和 Vue 到底誰更牛?聽聽尤雨溪怎麼說

發表於2018-12-19

知乎上近日有人發起了一個 “react 是不是比 vue 牛皮,為什麼?” 的問題,再度引發一場關於前端框架誰更牛的口水戰,評論裡可以說是撕得不可開交。Vue.js 作者尤雨溪12月4日正面迴應了該問題,他表示希望大家能停止無謂的爭執,多想想使用這些技術的初衷,比起爭論這個,倒不如多想想怎麼讓自己變得更牛。

這個問題下面的很多回答太偏激了,其實我淡出知乎就是因為這類破事… 但是作為作者還是認真地說一說吧,希望能以後別再有這種問題了。

這裡我可以大方地承認,如果多年以後要論歷史地位,React 肯定是高於 Vue 的。事實上,我作為一個開發者,也是由衷地佩服 Jordan Walke, Sebastian Markbage 這樣的,能從開發模式層面上提出突破性的新方向的人。

React 從一開始的定位就是提出 UI 開發的新思路。當年 Pete Hunt 最開始推廣 React 的時候的一句口號就叫 “Rethinking Best Practices”,這樣的定位使得 React 開啟了一些全新的思路,吸引了一群喜歡折騰的早期核心使用者,並在這個基礎上通過社群迭代孵化出了許多今天被 React 開發者當作常識的 pattern。這是 React 偉大的地方,Vue 裡面也有很多地方是直接受到了 React 的啟發。React 敢做這樣的嘗試,是因為它是 Facebook。這樣的體量的公司,在 infrastructure 層面獲得質的提升,收益是巨大的,而且 Facebook 的工程師們足夠聰明又要靠工資吃飯,改變他/她們的習慣並不是什麼問題。而對外推廣,則是一種大公司才有的 “改變業界” 的底氣。

Vue 從一開始的定位就是儘可能的降低前端開發的門檻,讓更多的人能夠更快地上手開發。我以前也說過,開發 Vue 的初衷不是為了搞個大新聞,只是做了個我自己用得舒服的框架。我雖然也在 Google 這樣的大公司呆過,但骨子裡是一個喜歡自由的人,也一直覺得獨立開發者很酷(這也是為什麼最終自己也成了一個獨立開發者)。很多時候我更希望自己做的東西能幫到那些中小型企業和個人開發者。舉個例子來說,美國傳統行業裡有很多 small business,它們不像大公司那樣有專門的 IT 團隊來資訊化整個流程,很多隻能僱一個普通的 contractor 程式設計師,有些甚至是老闆自己兼職研究程式碼。我收到過好幾封這樣的感謝信,說因為 Vue 讓它們多快好省地做了個內部應用,解決了實際問題,這樣的故事是讓我覺得特別爽的。

做 React 這樣的不迎合使用者,而是試圖改變使用者的設計需要有足夠的本錢:你得有足夠的資源和背景去強行越過初始推廣的那個陡坡。事實上,如果沒有 Facebook 作為 React 的推廣者,React 很可能最終是一個有著忠實使用者群體的小眾框架(比如 Elm)。作為一個個人專案的 Vue 沒有這樣的宣傳資源,也並不是為了改變使用者。所以從設計的角度上來說,Vue 首先考慮的是假設使用者只掌握了 web 基礎知識 (HTML, CSS, JS) 的情況下,如何能夠最快理解和上手,實現一個看得見摸得著的應用。

一個 API 看得順不順眼,用得舒不舒服,很大程度上取決於你跟一個技術的核心使用者群體的重合程度。程式語言之間噴來噴去還少麼?大家都是圖靈完備,然而此之蜜糖,彼之砒霜。Vue 的 API 設計固然有可以商榷的地方,但 React 也不是完美無瑕,不然也不會從 mixins 到 HOC 到 render props 一次次地折騰,更沒有 hooks 什麼事了。直到 Suspense 出現前,也不存在什麼只有 React 才能做到的事情(順帶一提,有意思的是 hooks 基本上廢掉了過去大部分基於元件的邏輯抽象模式,抹掉了 JSX vs. 模版的一個優勢,也完全可以用在其他框架裡,連 Angular 都已經有對應的原型實現…)然而 “不完美” 並沒有妨礙在過去的幾年內大量的使用者用各自選擇的技術做出實際的產品 —— 從 State of JS 近兩年的資料來看,兩者的滿意率是差不多的,都在 90% 出頭,說明兩者在 “滿足目標使用者的需求” 這個衡量標準下,表現是差不多的。可維護性、可讀性、優雅程度、生態這些東西嘴上怎麼辯都可以,還是資料比較實在。

再說說具體技術層面:從載入速度、執行時效能來說,兩者目前綜合各種場景應該說是沒有什麼質的差別。硬要說的話,Vue 在 update 效能優化方面需要的心智負擔可能少那麼一點 —— React 如果不注意,容易導致過多的元件無用 diff,但是實際上真正會遇到效能瓶頸的應用也是少數… Vue 3 會比 Vue 2 快不少,加上模版編譯還有一些可進一步發掘的優化空間,所以效能上會比現在的 React 有一定優勢,但 React 那邊也在研究基於 prepack 的編譯時優化,這個也是挺值得期待的。Vue 3 對於 TS 的支援會有很大改善(包括 TSX),我們也在計劃對模版做更好的 IDE 支援(比如補全、型別檢查),現在沒有不代表以後不能有,有批評我們改進就是了。其實過去大半年 Vue 本身沒有什麼大更新是因為精力都放在工具鏈上了,接下來又要回到核心上了。React 那邊 time slicing / Concurrent mode 要明年 Q2 才穩定,那個時候應該 Vue 3 的 time slicing 應該也穩定了(原型已實現)。Suspense 在 data-fetching 穩定之前並沒什麼大用(要 2019 年中),這期間我們也會研究解決同類問題的方案。所以從純技術層面來說,React 現在比 Vue 牛逼麼?不好說。以後一定比 Vue 牛逼麼?也不好說。

使用數量方面,有很多文章拿各種資料來比較,有的是 GitHub stars,有的是 npm 下載量,有的是 Google trends,有的是 StackOverflow 的問題數量… 其實這些資料都有很明顯的問題,那就是它們跟實際使用者的數量並不一定是正比,會受到其它因素的影響,比如 GitHub stars 跟實際使用沒有直接關聯;使用者中使用 CI 的比例會影響 npm 的下載量;Google trends 很難完美過濾掉 React 這樣的常見詞彙的 false positive;文件和本身的上手難易程度會影響 StackOverflow 的問題數量,等等… 所以我自己一直是以 Chrome 開發者外掛的使用者數量作為一個比較可靠的資料,因為它的關聯度是最直接的,潛在的干擾因素也是最少的。目前 Vue 的開發者外掛使用者數量約為 70.4 萬,而 React 是 136.3 萬,大致可以作為參考。React 的使用量還是有明顯優勢,不過這個數字比起兩年前已經很不一樣了 —— 那時候大約是 1:7 的比例。從增速來看,Vue 是要快一些的。

說了這麼多,無非是希望大家能停下來想想所謂的 ”A 技術比 B 技術牛逼“ 背後到底是在爭些什麼,我們使用這些技術的初衷又是什麼。很多時候你說這方面,他說那方面,雞同鴨講,即使說到一起去,也往往缺乏對等的資訊量或者基礎共識,只是各自表達主觀看法,最後變成兩個陣營各自抱團取暖… 說到底,就算你證明了 A 比 B 牛逼,也不意味著你或者你的專案就牛逼了… 比起爭這個,不如多想想怎麼讓自己變得更牛逼吧。

相關文章