Allen Wang

Allen Wang • 2025-05-07

solidJS 系列(1) - 介紹與 React 之間

solidJS

前言

對 React 開發者來說,SolidJS 的切入門檻低,但它在設計上與 React 有顯著差異。本系列文章將由我看到哪寫到哪邊學邊寫邊看看 SolidJS 的架構、API、使用情境,並穿插與 React 的對照,讓自己能清楚理解這個框架並記錄。


SolidJS 是什麼?

SolidJS 是一個聲明式、響應式、無虛擬 DOM 的 JavaScript UI 框架。由 Ryan Carniato 開發,目標是結合 React 的開發體驗與原生 JavaScript 的效能極限。

核心特點:

  • 無虛擬 DOM,直接操作 DOM。
  • 精細響應性(fine-grained reactivity)。
  • JSX 為第一公民,編譯階段優化。
  • 極致效能:更新快速,資源佔用低。

SolidJS vs React 比較

面向ReactSolidJS
渲染機制虛擬 DOM,每次更新整個元件重執行無虛擬 DOM,每個 signal 控制 DOM,精確更新
狀態管理useStateuseReducer,依賴 hookcreateSignal 為主,響應式狀態是語言層級核心
副作用管理useEffect,需手動列出依賴createEffect 自動追蹤依賴
元件更新邏輯元件 function 每次 render 都會重新執行元件只執行一次,變動由響應式系統處理
JSX 編譯Babel 轉成 React.createElement()自行編譯為原生 DOM 操作碼
條件/列表渲染使用 JS 表達式,如 array.map()、三元運算符使用 <For><Show><Switch> 控制元件
Context API使用 createContext / useContext類似 API,但更新範圍更小,效率更高
生態與工具鏈巨大且成熟(Next.js、Redux、Tailwind 插件)新興,但 SolidStart 支援 SSR、routing、meta tags 等
學習曲線大多數開發者熟悉 React 概念語法簡潔但響應式模型需適應
效能表現中等偏上,需手動優化預設極速,幾乎可比原生操作

核心差異補充說明

1. 重渲染模型的不同

React 中每次 state 改變,整個 function component 都會重新執行一次,可能導致非必要的效能損耗。SolidJS 則是依靠 signal 控制精確的 DOM 區塊更新,不會重新執行整個 component function。

2. 副作用處理更直覺

React 的 useEffect 需要手動維護 dependency array,容易漏或錯。Solid 的 createEffect 自動追蹤變數依賴,只要你用到某個 signal,它就會自動註冊。

3. JSX 的優化差異

React 的 JSX 是透過 Babel 編譯為虛擬 DOM 結構再運行;SolidJS 則在編譯階段就轉換為「直接 DOM 操作」,免去 runtime 比對,大幅加快效能。


範例對比:計數器

React 寫法

這我相當熟悉

const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;

Solid 寫法

注意解構出來的第一個值是 getter function ,從 React 轉來容易漏了呼叫

const [count, setCount] = createSignal(0);
return <button onClick={() => setCount(count() + 1)}>{count()}</button>;

小結

SolidJS 不是為了取代 React,而是針對極致效能與簡潔邏輯設計的選擇。