React 老矣,我建議大家用用別的框架

語言: CN / TW / HK

作者 | Josh collinsworth

譯者 | 核子可樂

轉載 | 前端之巔

如今,縱觀各類招聘網站上的前端職位,大家往往都會看到一個熟悉的字眼:React。雖然企業僱主也經常會列出其他一些類似的前端框架選項,但 React 的地位幾乎是雷打不動。

但面對這樣的現實,請原諒我始終無法理解。除了流行,React 到底還有什麼優勢?

首先我想澄清一點,我對 React 沒有任何敵意。我知道它挺好,而且如果需要開發龐大複雜的前端專案,我其實也並不抗拒使用 React。

React 的出現,為其他框架當前及未來的功能規劃奠定了基礎。Vue 3 及其組合 API 明顯是受到 React hooks 的啟發。Svelte 中的很多約定就來自 React。至於我最喜愛的 Vue 框架 Nuxt,它的大部分設計思路都來自 React 的元框架 Next。總而言之,整個基於元件的前端設計和開發模型,特別是目前的整個生態系統,都離不開 React 的鼎力支援。

但就個人觀點,我還是覺得 React 像是那種開創了流派的祖師級老電影、音樂專輯或者電子遊戲。它的偉大體現在那個時間點上的開創性,但時至今日自身的絕對價值其實已經很有限了。

好吧,這話可能說得有點狠。畢竟一提到開創性的老電影,大家首先想到的就是《公民凱恩》,React 跟其他框架間的差距肯定不像《公民凱恩》相較於後來的經典佳作那麼大。我的觀點很簡單:

React 已經老了,只是經常用它的朋友們還沒有意識到它老到了什麼程度、引發了哪些問題。如果只用 React,那可能會覺得這框架不錯啊,而且一直在努力改進。確實,React 在很多方面都是越來越好,但這並不能改變它的發展速度和功能上限已經長期跟不上同類方案的事實。總之一句話,React 表現得不錯,只是不像其他框架那麼好。

工作中的最佳選項

假設大家身為某家科技初創公司的 CTO,或者是打算開發某網路軟體新產品的個人創業者。

我們面前擺著新專案的藍圖,可以隨意選擇自己喜愛的技術進行構建。沒有約束,也不設產品生命週期限制,那麼你會選擇哪一種前端框架?

(有些朋友可能會抬槓說,不用前端框架也行。但對於任何成規模、比較複雜的專案來說,不用前端框架肯定不是什麼好主意。)

要做出選擇,先要考慮以下幾項條件:

  • 效能

  • 學習曲線

  • 繫結包大小

  • 可擴充套件性

  • 社群與支援

  • 資金支援

  • 開發者體驗

  • 人才供應

而有沒有一種可能,從這麼多角度來論證,其實 React 並不是什麼好選擇。

下面咱們逐一探討。

效能

大家可以通過多種不同指標來衡量效能。但無論關注哪個具體方面,React 都稱不上頂級水準。Vue、Svelte、Solid、Inferno 等工具的效能總體上都要好於 React。根據實際需求,大家甚至可以通過 Alpine 或者 Petite Vue 等讓效能更上一層樓(雖然我覺得這兩種跟其他框架並不算同一類方案)。

React 的效能不佳應該已經是個共識,所以這裡無需繼續贅述。所以我認為,如果大家希望讓新專案擁有強大的效能表現,那 React 就可以直接被排除在外。

學習曲線

假設你對前端框架一無所知,那 React 也絕對不是最好學、最容易上手的選項。

JSX 的實質,就是笨拙地把 HTML 硬塞進 JavaScript 函式返回。你以為這就夠糟了?不,更糟的是你在 React 裡不用 JSX。

除了 JSX,React 本身也有不少獨特的約束和毛病(比如提供兩種完全不同的語法,但二者完全無法互操作)。

在 React 中,其他前端框架能夠幫我們輕鬆打理的小事,往往還是需要手動干預或者藉助大量樣板檔案(甚至二者兼有)。

幾乎每種前端框架都把使用者設想成普通人,但 React 不同,它最早是專為 Facebook 的工程師們打造的。雖然經過多年發展,它已經成為一種比較通行的市場化產品,但即使到現在,這樣的出身仍然給 React 留下了深深的烙印。我們還是可以看到其中留下的早期決策與優化痕跡。

至於其他問題,那可太多了。萬惡之源 useEffect,不能在 JSX 中使用某些標準 HTML 屬性(因為 JSX 無法區分 React prop 和 HTML 屬性),記憶化,只能靠短路運算子模仿出來的虛假條件,以及要求開發者自己防止無限迴圈等等……其實連這裡的迴圈都是假的,必須靠陣列方法才能實現。不說了,說不完。

繫結包大小

這一點跟速度類似,但我覺得還是有必要區分開來。哪怕下載包大一點,但實際使用時效能更好,那也沒啥問題。但 React 可不是這樣。

React 軟體包相當臃腫,這個大家都知道了,我也不多廢話。

我想強調的是,有些人覺得 React 大多數情況下會從快取中載入,所以繫結包大小無所謂。這種認知最早是假的,後來現代瀏覽器讓它成了真,可最近的安全升級開始阻止域之間的快取共享,所以又成了假的。

另外,Preact 雖然表現不錯,但還沒辦法跟 React 無縫對接。而且 Preact 的包大小跟其他前端框架比也沒有太大的優勢。

可擴充套件性

雖然 React 對應的企業應用規模肯定是最大的,但我覺得吧,數量跟質量並不是一回事。

從 Vue 到 Svelte,再到 Angular 和 Ember,每一款主流前端框架都擁有類似的大規模執行能力。他們的網站主頁上,也不乏一個個聲名顯赫的重量級客戶徽標。

所以 React 沒什麼特別的,只是案例最多罷了。

如果大家有很強的從眾心理,那我也無話可說。但客戶多真的不代表 React 就一定更優秀,它只是出現在了充滿機會的時代。

社群與支援

沒錯,React 背後的社群規模最大,但這還是不足以支撐 React 就最好的結論。

大社群也有負面影響,特別是對 React 這類“無傾向性”框架而言。社群過大可能對應著太多可供選擇的套餐,太多相互衝突、彼此對抗的觀點,逼著使用者在其中站隊,然後承受隨之而來的一切。

不僅如此,社群太大,甚至不一定能讓產品越變越好。

最初,更多的參與者確實能不斷帶來好的功能特性。但這裡存在一個收益遞減點(即不斷上升的溝通成本,逐漸開始減慢、而非加快專案發展速度)。除此之外,社群的參與人數和社群質量間也沒有必然關聯。

當然,我理解想要去爆滿的餐廳吃飯那種心情,這似乎能給人一種安全感。畢竟哪怕不好吃,還有那麼多人跟我一起上當呢,這波不虧。但哪怕人再多,都無法改變“不好吃”這個基本事實。這跟願意來吃的人是多是少,真的沒什麼關係。所以我們用不著非往最火爆的餐廳去擠,挑一家適合自己的、安靜享受一頓美食,不就足夠了?

資金支援

有些人總擔心自己使用的框架,會在某一天突然消失,由此失去支援和維護。對他們來說,出自 Facebook 系的 React 天然值得信任。但問題是,其他前端專案的資金支援有那麼不堪嗎?

Angular 的背後可是谷歌,Vue 則是歷史上最成功、資金也最充裕的開源專案之一。Vercel 目前至少僱用了兩位 Svelte 維護者(其中包括 Svelte 的締造者)全職負責專案管理。至於 Solid,已經擁有超過 100 名貢獻者和至少六家主要企業贊助商。

所以,資金支援對各大主流前端框架來說都不是問題,React 在這方面同樣不算佔優。

開發者體驗

React 確實是應用範圍最廣的前端框架,知名度也是一時無兩。但在今年的 JS 現狀調查報告中,React 的開發者滿意度已經不及 Solid 和 Svelte。至於受關注度,React 落後於 Svelte、Solid 和 Vue,甚至已經跌破 50%。

多年以來,React 的使用者滿意度和關注度一直在穩步下降,採用率也停滯不前。

當然,這類調查問卷只能作為參考,在問題的表述方式上稍做手腳就能得出不同的答案。但其他同類調查也發現了類似的趨勢。在 Stack Overflow 的調查中,React 的受歡迎度遠低於 Svelte,僅略微高於 Vue。

有趣的是,Scott Tolinski 最近提到,他的一位開發者放棄了薪酬豐厚的 React 職位,寧願拿一半的工資也要加入 Tolinski 領導的 SvelteKit 專案。

當然了,並不能用這個例子證明開發者連錢都願意放棄,就為了離 React 遠一點。但至少能夠看出,React 帶給開發者的使用感受實在稱不上好。

人才供應

這方面,React 確實堪稱一騎絕塵。如果想讓新人快速理解之前的開發資產,那 React 的優勢可太明顯了。

但是吧,我覺得單這一點不足以讓 React 脫穎而出。

鑑於選擇 React 之後,應用程式的繫結包本身就更大、速度更慢而且複雜性更高,用這麼多弊端來換取所謂專案接管期間的一點點便利,無疑是在犧牲長遠收益尋求眼下省事。翻譯翻譯,這不就是典型的技術債務嗎?

現在省下的幾個禮拜,未來可能需要幾個月甚至幾年來償還。所以雖然 React 在這方面佔優,但大家最好還是認真核算一下,沒辦法無腦選它。

另外,瞭解 React 的朋友想上手其他前端框架,應該不是什麼難事。沒錯,不同框架間總有一些細微差別和小怪癖,但其中遵循的設計理念還是大體相同的。任何熟悉 React 的優秀開發者,也都能在其他框架上獲得同樣的工作成效。

我承認,商業世界從來沒有好壞,只有權衡取捨。開發速度很重要,前面提到的每一點也都很重要。所以,您的實際情況可能證明,哪怕是 React 速度更慢、繫結包更大、複雜度更高,它也仍然值得選擇。是的,我都理解。

但大家做出的選擇,最終也將成為與競爭對手在市場上搏殺時的一張牌。選得好就是好牌,反之亦然。如果大多數對手也選擇 React,那大家就是爛牌對局、菜雞互啄。

而如果能選得更好,也許就能壓制對方的牌形。

批評了半天,React 為什麼還是傲視同儕?

因為很多人在做選擇時,往往是比較草率的。React 之所以現在受歡迎,就是因為 React 之前受歡迎。

在真正佔領市場之前,人們其實是出於其他理由去選擇 React 的。也許因為它能解決開發者面對的實際問題,也許因為它比較新奇有趣,或者是其他什麼原因。但可以肯定的是,當時人們選 React 絕不是看中它更好就業,或者是市場普及率最高的框架。而時過境遷,現在大家再選擇它,唯一的理由就是它夠老、夠踏實。

企業選它,因為人才市場上懂 React 的群體很大;求職者學它,是因為人才市場上企業想要招聘 React 開發者。這是個自我強化的迴圈,一個自我實現的預言。

於是 React 成了預設選項,只要沒有充分的理由,更多人只會以無所謂的態度接著用。

while (reactIsPopular) {
reactIsPopular = true
}

“畢竟沒人會因為用了 React 而被解僱”,這話倒也沒錯。React 是個安全的選擇,可能不是每個人的最愛,但至少不會惹出大麻煩。它,還是能幹活的。

所以只要沒有強烈的業務需求,求職者和招聘方都可以接受圍繞 React 建立起來的行業現狀。只要能把雙方對接起來,React 的作用就已經達到了。

這一切會改變嗎?如何改變?

我其實一直在關注事態的變化。

但要說答案,我也沒有。根據之前提到的幾份調查報告,React 的採用率確實出現了停滯。也不能說不再增長,只能說 React 的增長跟不斷擴大的市場本體之間保持了同步,三年來份額一直維持在 80% 左右。

但終有一天,我相信這種迴圈會中斷。但我不知道具體的導火索會是什麼。

也許是個量變引發質變的過程。回想起來,很多趨勢來得看似突然,但實際上一直在隨時間推移而積蓄力量。也許其他前端框架更好地證明了自己,並逐漸削平了 React 在人才儲備方面的優勢,於是企業開始向其他方案敞開懷抱。

也可能會有部分企業觸及 React 的效能上限,並結合業務需求轉向效能更強的選項。比方說,如果公司的業務對移動端效能有著極高要求,而且必須能夠在裝置配置差、網路不穩定的區域內提供良好體驗,那 React 差出的這部分效能就足以促成改變。

但對大多數企業來說,情況還沒那麼極端。大部分舊專案實在沒必要做遷移,效能困擾雖然偶然出現,也絕不至於要因此推動大規模重構。所以繼續用 React 完全沒有問題,它在很多場景下已經完全夠用了。

所以沒準市場就固化在了這一刻,再沒有誰能真正挑戰 React 的統治地位。等到它真正宣佈退位的時候,也許我們已經徹底拋棄了前端框架,那時候主流瀏覽器、特別是 JS 已經擴充套件到了不需要它們的地步。這就是所謂後框架時代。

還有一種可能,React 在事實上已經過時了,只是在巨集觀統計上還體現不出來。目前人才市場上的招聘需求,反映的是企業在很久之前做出的框架選擇。正如核酸測試體現的是幾天、甚至幾周之前的區域內疫情狀況一樣,目前的招聘態勢也許也存在滯後。

我不知道未來的前端會是什麼樣子,應該沒人能做出準確的預言。但可以肯定的是,React 還能風光上好一陣子。

如果大家正在學習前端開發,想用這個為自己找份工作或提升職業水平,那 React 是個不錯的選項、也是非常安全的方向。

但我也希望能有越來越多的開發者積極探索其他選項,也希望企業能給他們更多嘗試的機會。近年來,前端開發領域的驚喜都來自 Vue 和 Svelte。以我個人的感受和經驗,React 只是能幹活,並沒讓工作變得更有趣。

而且越來越多的開發者也意識到了這個問題,開始嘗試接觸其他框架、體驗它們的不同特性,也反過來意識到 React 是有多麼老邁和遲鈍。即使單純從推動未來前端開發者多樣性的角度出發,我也真心建議大家用用別的框架方案。

原文連結:

https://joshcollinsworth.com/blog/self-fulfilling-prophecy-of-react