【ソリッドジェイエス】

SolidJS(ソリッドジェイエス) とは?

最終更新:
💡 JSXと細かな反応性で、必要なUIを更新する

JSXでUIを記述し、状態の変化をきめ細かく追跡して必要な箇所を更新するJavaScriptフレームワーク。仮想DOMの差分計算を介さず、依存する計算やDOMの更新へ変更を伝える。

📌 このページのポイント
同じ表示更新でも、伝え方が違う React state 更新:0 → 1 部品を再実行 差分を計算 カウンター 表示 0 → 1 SolidJS Signal 更新:0 → 1 依存する計算へ 変更を伝える カウンター 表示 0 → 1 どちらも必要なDOMの変更を反映
カウンターの状態を0から1へ変える例。緑が変更した表示部分。Reactの再実行と、すべてのDOMの書き換えは別である。Solidの図は初期表示で依存関係を準備した後の更新を示す。速度の比較結果を示した図ではない。
ひよこ ひよこ
SolidJSってReactとそっくりに見えるけど何が違うの?
ペンギン先生 ペンギン先生
どちらもJSXでUIを書けるけど、更新の仕組みが違うよ。Reactは状態更新でコンポーネントを再実行し、表示の差分をDOMへ反映する。Solidは値を読む場所への依存を追跡して更新するんだ。Reactも、毎回すべてのDOMを書き換えるわけではないよ。
ひよこ ひよこ
その「値」って、どうやって持つの?
ペンギン先生 ペンギン先生
基本の一つがSignalだよ。createSignalは、値を読むgetterと値を変えるsetterを返す。たとえばcount()で読み、setCount(1)で変える。JSXやeffectなどの追跡される場所で読んだ値が変わると、その値に依存する表示や処理へ更新が伝わるんだ。
ひよこ ひよこ
「コンポーネントが再実行されない」ってどういうこと?
ペンギン先生 ペンギン先生
各コンポーネントが初めて表示されるとき、関数を実行して反応性の仕組みを準備するよ。その後の状態更新では、関数全体を再実行せず、依存する部分を更新する。ただし、取り除いた部品を新しく作るときは、また最初の準備を行う。アプリ全体で一度しか実行しない、という意味ではないよ。
ひよこ ひよこ
JSXを使うなら、変換せずそのまま動くの?
ペンギン先生 ペンギン先生
SolidにもJSXを変換するビルド処理があるよ。公式のBabelプリセットは、JSXをSolidの実行処理の呼び出しへ変換する。見た目がReactに似ていても、同じコードが同じ更新方法で動くと考えず、Signalやコンポーネントの仕組みを理解することが大切なんだ。
ひよこ ひよこ
本番プロジェクトで使うときは、何を確認したらいい?
ペンギン先生 ペンギン先生
必要な機能や対応するライブラリ、運用環境を確認し、実際のアプリで速度を測ろう。SolidStartはSolidを使ってクライアントとサーバーを含むアプリを組み立てる枠組みだよ。細かな更新は計算を減らす助けになるけど、どんなアプリでも最速だと保証するものではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「SolidJS」って出てきたら「JSXで書き、状態への依存を追跡して必要なUIを更新するフレームワーク」と思えばだいたいOK!
📖 おまけ:英語の意味
「SolidJS」 = Solidという名前にJavaScriptの略称JSを組み合わせた呼び名
💬 Solidは英語で「堅い・堅固な」という意味の語、JSはJavaScriptの略称だよ

参考資料

← 用語集にもどる