Webフロントエンド - フレームワーク・ライブラリ

Solid.js そりっどじぇいえす

リアクティビティシグナル仮想DOMJavaScriptコンポーネントフロントエンド
Solid.jsについて教えて

簡単に言うとこんな感じ!

Reactみたいな見た目で書けるのに、「仮想DOM」という重い仕組みを使わないから超高速なWebアプリが作れるJavaScriptフレームワークだよ!「シグナル」っていう仕組みで変化した部分だけをピンポイントで更新するから、ムダがなくてめちゃくちゃ速いんだ!


Solid.jsとは

Solid.js(ソリッドジェイエス)は、2021年にRyan Carniatoが公開したオープンソースのJavaScriptフロントエンドフレームワークです。Reactに似たJSX構文(JavaScriptの中にHTMLのような記述を混ぜる書き方)を採用しながら、Reactが内部で使っている仮想DOM(Virtual DOM) という仕組みを使わないのが最大の特徴です。

Solid.jsの核心にあるのは「シグナル(Signal)」 という概念で、「どの値が変わったら、どこを更新すればいいか」を最初から計算してDOMに直接書き込む方式をとっています。これにより、画面の全体を再計算・再描画するムダが一切なく、パフォーマンスベンチマークでは一貫してReactやVueを上回る結果を出しています。

情シス担当者やシステム発注者の視点では「ReactやVueとどう違うの?」という疑問が真っ先に来ると思いますが、一言で言えば「Reactと似た書き方でより速い画面が作れるフレームワーク」です。特に大量のデータをリアルタイムで更新する管理画面やダッシュボード系のシステムで採用が広がっています。


Solid.jsの核心:シグナルとリアクティビティの仕組み

Solid.jsを他のフレームワークと区別する一番重要な概念が「ファインゲインド・リアクティビティ(Fine-Grained Reactivity)」、つまり「変化した箇所だけを超ピンポイントで更新する」仕組みです。

概念説明使う場面
Signal(シグナル)状態(値)を保持する最小単位。値が変わると関連する場所だけ自動更新カウンター・フォーム入力・フラグ管理
Memo(メモ)Signalから派生した計算値。依存するSignalが変わったときだけ再計算合計金額・フィルタ済みリストなど
Effect(エフェクト)Signalの値が変わったときに実行される副作用処理APIコール・ログ出力・DOM直接操作
Store(ストア)ネストした複雑なオブジェクトをリアクティブに管理する仕組みユーザー情報・アプリ全体の状態管理

Reactとの書き方比較

// React の場合(フックを使う)
const [count, setCount] = useState(0);
<button onClick={() => setCount(count + 1)}>{count}</button>

// Solid.js の場合(シグナルを使う)
const [count, setCount] = createSignal(0);
<button onClick={() => setCount(count() + 1)}>{count()}</button>

見た目はほぼ同じですが、Solid.jsでは count() のように関数として呼び出すのがポイント。これによってどのコンポーネントがその値を「読んでいるか」を追跡できるため、変化したときにそこだけ更新できます。

仮想DOMを使わないとどう違うのか

【Reactの更新フロー】
 状態変化 → コンポーネント全体を再実行
          → 仮想DOMツリーを再生成
          → 前の仮想DOMと差分を比較(Diffing)
          → 本物のDOMに反映

【Solid.jsの更新フロー】
 Signalの値変化 → 関連する箇所だけ直接DOMを更新(終わり)

Reactは「全部作り直して比べる」方式、Solid.jsは「変わった場所だけ書き換える」方式です。データが多いほどSolid.jsの速度優位が際立ちます。


歴史と背景

  • 2016年頃 — 作者Ryan Carniatoがパフォーマンスへの強いこだわりから「仮想DOMなしでReact風に書けるフレームワーク」の実験を開始
  • 2019年 — GitHubにて最初のバージョンを公開。マニアックなパフォーマンスオタクの間で注目され始める
  • 2021年6月v1.0正式リリース。この時点でjs-frameworkベンチマークでバニラJS(フレームワークなし)に匹敵する速度を記録し、一気に注目度が上昇
  • 2022年 — SolidStartというメタフレームワーク(Next.jsのSolid版)の開発が本格化。サーバーサイドレンダリング(SSR)にも対応
  • 2023年Solid.js v1.7リリース。シグナルの概念がReact・Vue・Angularなど他フレームワークにも影響を与え、「シグナルの時代」と呼ばれるようになる
  • 2024年〜Solid.js v2.0の開発が進行中。非同期処理とサーバーコンポーネントのサポートが大幅強化される見込み

主要フレームワークとの比較

Solid.jsを選ぶべきか判断するために、代表的なフレームワークと比較します。

項目Solid.jsReactVue 3Svelte
仮想DOMなしありありなし
リアクティビティシグナル(ファインゲインド)状態フック(コンポーネント単位)リアクティブシステムコンパイル時
学習コスト中(React経験者は低め)低〜中
パフォーマンス★★★★★★★★★★★★★★★★
エコシステム小〜中非常に大
企業採用実績少〜中非常に多
SSR対応○(SolidStart)○(Next.js)○(Nuxt)○(SvelteKit
TypeScript対応
フレームワーク比較:仮想DOM vs シグナル方式 仮想DOM方式 React コンポーネント単位で再レンダリング Vue 3 リアクティブシステム+仮想DOM差分 Angular 変更検知サイクル+仮想DOM シグナル/コンパイル方式 Solid.js ⭐ ランタイム・シグナルで 変更箇所のみDOM直接更新 Svelte コンパイル時にリアクティブコードを 生成、仮想DOM不要 vs 差分計算のオーバーヘッドあり 差分計算ゼロ → 高速

Solid.jsが特に向いているケース

  • 大量データのリアルタイム更新(株価・センサー・チャットなど)
  • パフォーマンスが要件に明記されているシステム
  • React経験者がいてコスト削減しつつ速度を上げたいケース

Solid.jsが向いていないケース

  • エコシステムの豊富さが最優先(Reactには膨大なサードパーティ製ライブラリがある)
  • 採用・開発チームの確保が難しい(まだ求人・人材市場は小さい)
  • 既存Reactプロジェクトからの移行(APIが似ているが互換性はない)

関連用語

  • React — MetaがオープンソースとしてリリースしたUIライブラリ。Solid.jsの設計に最も影響を与えたフレームワーク
  • Vue.js — Evan Youが開発したプログレッシブJavaScriptフレームワーク。日本でも採用実績が多い
  • Svelte — コンパイル時にリアクティブコードを生成する仮想DOMなしフレームワーク。Solid.jsと思想が近い
  • 仮想DOM — ReactやVueが採用するUIの差分計算手法。Solid.jsがあえて採用しない仕組み
  • JSX — JavaScriptの中にHTMLライクな記述を混ぜられるシンタックス拡張。Solid.jsでも採用
  • TypeScript — JavaScriptに型定義を追加した言語。Solid.jsは完全なTypeScriptサポートを提供
  • Next.js — ReactベースのメタフレームワークSSR対応。Solid.jsにおけるSolidStartに相当
  • フロントエンドフレームワーク — WebのUI構築を効率化するJavaScriptライブラリ・フレームワークの総称