
前端圈的鄙視鏈裡,一直流傳著一個極其傲慢的錯覺:寫 React 的看不起寫 Vue 的,認為前者更貼近底層,是真正的程式設計;而後者只是包了一層厚厚語法糖的玩具🫡。
每年的框架之爭,大家都在喋喋不休地爭論 JSX 是否比 Template 更靈活,或者 Hooks 是否比 Composition API 更純粹。
但在真正帶過幾十人團隊、給無數線上故障擦過屁股的前端架構師眼裡,這些語法層面的爭論,簡直膚淺得不值一提🤷♂️。
在真實的業務交付戰場上,評判一個框架的核心標準從來不是 它能讓你飛得多高,而是 它能在別人犯蠢時,提供多厚的安全氣墊。Vue 和 React 之間那條真正不可逾越的鴻溝,其實是團隊的犯錯成本。
React 的核心設計哲學非常迷人:一切皆為函式,一切皆為 JavaScript。
這種無與倫比的自由度,你可以隨心所欲地組裝高階元件,在渲染流裡玩出各種花樣。
但現實情況是,你手下的團隊不是由十個頂級開發組成的。國內大多數業務線的現狀是:開發的每一個環節都是流水線,團隊裡充斥著剛剛轉正的新人、甚至外包同學。
把 React 交給這樣一支水平參差不齊的團隊,這種自由瞬間就會變成災難。
在 React 裡,想要寫出一個能跑的頁面很容易,但想要寫出一個不亂重渲染、沒有記憶體洩漏的頁面,門檻極高。開發者必須時刻在大腦裡與底層的渲染機制做鬥爭。你需要手動去判斷什麼時候該用 useMemo,什麼時候該套 useCallback,甚至要時刻警惕那個反人類的 useEffect 相依陣列😖。
任何一個新手,只要少寫了一個相依,或者多傳了一個匿名函式,你的頁面就會陷入無限迴圈,或者徹底僵死在陳舊的閉包裡。在 React 裡,犯錯的門檻實在太低了,但排查錯誤的成本卻極其高昂。
我們來看一個在業務中每天都會上演的經典場景:根據傳入的 userId 去抓取資料。
在 React 的世界裡,新手極其容易寫出下面這種程式碼:
tsx 代碼解讀複製代碼// 表面看毫無問題的 React 程式碼,實則埋下了閉包陷阱
function UserDashboard({ userId }) {
const [data, setData] = useState(null);
// 容易漏寫相依,或者寫錯相依導致無限迴圈
useEffect(() => {
fetchData(userId).then(setData);
}, []); // 漏掉了 userId,導致父元件切換使用者時,這裡的資料永遠不更新
return (
<div>
<Header /> {/* 父元件狀態一變,這個毫無關係的 Header 跟著白白重渲染 */}
<UserProfile data={data} />
</div>
);
}
為了修補這些漏洞,你不得不強制團隊去配置 ESLint 外掛,甚至在 Code Review 時拿著放大鏡去查相依陣列。這就是極其高昂的心智負擔😒。
相比之下,Vue 在底層直接做了一次降維打擊。它剝奪了你手動管理的自由,用底層的 Proxy 代理機制接管了一切。
html 代碼解讀複製代碼<!-- Vue 用底層的相依追蹤,幫你兜底了絕大多數的心智負擔 -->
<template>
<div>
<Header /> <!-- Vue 的細粒度更新,保證了 data 變化絕對不會波及 Header -->
<UserProfile :data="data" />
</div>
</template>
<script setup lang="ts">
import { ref, watchEffect } from 'vue';
const props = defineProps<{ userId: string }>();
const data = ref(null);
// 框架自動收集底層的相依,根本不需要你手動去維護那個反人類的相依陣列
watchEffect(async () => {
data.value = await fetchData(props.userId);
});
</script>
在這個場景下,Vue 的開發者甚至不知道什麼是閉包。框架底層的響應式系統充當了最嚴厲的品質檢測,無論新手的水準多差,這套機制都能保證程式碼在及格線以上穩穩運行。
React 考驗的是開發者的內功,而 Vue 考驗的是框架底層的工藝。
如果說閉包只是前端的局部陣痛,那麼全域重複渲染就是大型業務線的災難。
React 的預設渲染邏輯極其粗暴:只要父元件的狀態發生改變,所有子元件必須無條件跟著重新執行一遍。如果你不手動用 React.memo 把元件一層層包裹起來,一個頂層的資料狀態更新,能讓成百上千個毫無關聯的底層元件跟著陪跑。
在真實的深水區業務中,當一個毫無經驗的初級開發把一個高頻更新的狀態(比如頁面的捲動位置)掛載到了頂層的 Context 時,整個應用的效能就會瞬間被榨乾,哪怕你用著頂級配置的電腦,頁面也會卡成 PPT。
而在 Vue 的世界裡,這種頁面崩潰是不存在的。
Vue 採用了細粒度更新的架構。透過編譯時的靜態分析和執行時的相依收集,當一個狀態發生改變時,Vue 精確地知道這個資料只綁定在了某幾個具體的 DOM 節點上,只需要更新需要更新的地方即可。
這就意味著,即使你的團隊裡有人亂寫邏輯,把狀態滿天亂飛,Vue 底層的防線依然能保證專案不至於徹底癱瘓。這就是架構層面的工程兜底。
技術圈往往有一種慕強心理,大家都覺得越難駕馭的工具越高級。
但真正的業務閉環是不認這些的。作為前端負責人,你的首要目標是保證業務按時上線,保證程式碼穩定運行,而不是證明你的團隊個個都是 JavaScript 大師😒。
React 是一個非常靈活的前端框架,但稍微不慎會引起線上事故。它極度依賴嚴苛的團隊規範和極高水準的 Code Review。
Vue 則是自帶防誤系統的。它雖然限制了你的語法寫法,甚至有些語法看起來像是在寫設定,但它把團隊的下限拉到了一個極高的位置🙌。
如果你帶領的是一支精英小隊,去挑戰極限的互動體驗,React 絕對是不二之選。但如果你的團隊成員水平參差不齊,且面臨著高壓的業務迭代,擁抱 Vue 是你的首選🫵。
框架從來沒有好壞,適合你團隊的才是最好的。
你們怎麼看?