JSX 是否在拖慢 React?無模板框架的崛起
十多年里,JSX 一直是 React 的標(biāo)志性特性——把 JavaScript 邏輯與 UI 標(biāo)記優(yōu)雅地聯(lián)通在一起。
它剛出現(xiàn)時確實是革命性的:不再在 HTML 與 JS 兩套思維間來回切換,用一種語法寫完界面。
JSX 模糊了代碼與 UI 的邊界,也幫助 React 成為 2010 年代最主流的前端框架之一。 但到了 2025 年,JSX 開始讓人覺得——不那么順手了。
并不是它“壞了”,而是前端世界正加速轉(zhuǎn)向新一代“無模板”(template-less)框架:更快、更表達(dá)、且往往更友好。
那么,JSX 真的在拖累 React 嗎?
為什么 JSX 曾經(jīng)偉大(很多場景里現(xiàn)在也依然好用)
- 聲明式 UI:描述“要什么”,而非“怎么做”。
- 組件化:標(biāo)記、狀態(tài)、邏輯合在一起,不再分散多文件。
- 生態(tài)整合:語法與 React 工具鏈、TypeScript、調(diào)試工具深度協(xié)同。
多年里,這套組合拳讓 React 在與 Angular 模板、Vue SFC 的對比中占盡先機。
只是時代變了。
JSX 的痛點,開始顯形
- 冗長與樣板化花括號、
.map()鏈、屬性表達(dá)式層層套,寫起來顯笨重。示例(列表渲染):
<ul>
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>而不少新框架把列表當(dāng)“一等公民”,語義更直接。
- 心智切換成本把標(biāo)記和 JS 緊耦合,對不熟 JS 的設(shè)計師/內(nèi)容團(tuán)隊并不友好。
- 性能模型的歷史包袱JSX 并非為細(xì)粒度響應(yīng)式而生。React 依賴 VDOM diff,雖強大,但相對有額外開銷;新框架多為按依賴點直達(dá)更新 DOM。
- 工具鏈復(fù)雜度JSX 需要 Babel/SWC/TS 編譯。相比之下,許多“無模板”方案試圖減少或取消編譯負(fù)擔(dān)。
“無模板”正在上位
新玩家主打一個理念:用 JS/TS 本身當(dāng)模板語言,不用 JSX/字符串模板。
- SolidJS:細(xì)粒度響應(yīng)式,無 VDOM,基本就是“純 JS + DOM”。
- Qwik:以可恢復(fù)(Resumability)為先,跳過大段 hydration 成本,純 TS/JS。
- Svelte:編譯時把框架“編沒”,輸出高度優(yōu)化的原生 JS。
- Signals(Angular/Preact/Solid):以響應(yīng)式原語為核心,很多時候無需 JSX。
這些生態(tài)中的渲染通?!?/span>
- 更直接:沒有 VDOM 協(xié)調(diào)/比對的漫長鏈路;
- 更表達(dá):控制流(for/if/switch)直接用原生語法,不必在 JSX 里“硬塞”;
- 更高效:更新只作用到依賴的那一小撮節(jié)點,而非全體組件重算。
示例對照
JSX 版:
圖片
Solid(無模板,細(xì)粒度):
圖片
Svelte(更簡潔):
圖片
你會發(fā)現(xiàn):JSX 逼你進(jìn)入特定心智模型;而“無模板”往往更接近原生 JS/HTML 的直覺。
真正的問題,是 JSX,還是 React 架構(gòu)本身?
嚴(yán)謹(jǐn)?shù)卣f:不止是 JSX。React 的整體架構(gòu)——VDOM、diff、Hooks 心智模型——在“響應(yīng)式優(yōu)先”的新框架面前,確實顯得更重。 JSX 只是最顯眼的“癥狀”。
那問題來了:React 能不能“進(jìn)化到超越 JSX”?還是開發(fā)者會緩慢遷移到根本不需要 JSX的框架?
接下來會怎樣?
- Signals 與響應(yīng)式是大勢所趨:無論官方還是社區(qū)分支,React 陣營很可能引入/強化 signal-like 原語。
- JSX 也許會變“可選”:提供純 JS 寫法與 JSX并存的可能性在上升。
- “無模板”思維正在取勝:下一波框架讓 UI 組合回到代碼的自然延伸,而不是“披著 JS 外衣的 XML”。
結(jié)語
JSX 在它的時代很偉大——它塑造了 React 的身份,也推動了現(xiàn)代 Web 的一大步。 但在 2025,我們對前端的期待是:更輕、更快、更簡單——且不一定需要 JSX。
所以,JSX 是否在拖慢 React?大概率是。不過故事比“語法選擇”更大:前端的未來屬于把 UI 當(dāng)作代碼自然延展的框架,而不是把標(biāo)記“偽裝”成 JavaScript。






















