コンテンツにスキップ

synstate-dom

SynState のための UI ライブラリ。SynState の Observable を JSX にそのまま渡すだけ。コンポーネントは 1 回しか呼ばれず、その後は Observable に束縛した属性・プロパティ・テキストだけが書き換わります。コンパイラも仮想 DOM も使いません。

SynState のために

synstate-dom は SynState のランタイムに最も直接つながる UI ライブラリです。グラフは途中で何も変換されずに DOM で終わります。SynState のベンチマークの概要では、SynState はどのシナリオでも最速のライブラリの 2.7 倍以内に収まります。すべてのシナリオで計測したライブラリのうち、最悪のケースでも1桁倍に収まるのは SynState だけです。

シンプルで、遅くなりにくい

1 つのことに 1 つの書き方を保ち、ベンチマークの 1 行だけで勝つための書き方は増やしません。js-framework-benchmark の操作では、最も遅い操作でも最速のライブラリの 1.56 倍で、Solid・Preact・Preact + Signals には及びませんが、React の 3.79 倍を大きく下回ります。

細粒度、呼ぶのは 1 回だけ

コンポーネント関数が呼ばれるのはマウント時の 1 回だけです。更新は synstate のグラフを伝わって、束縛された DOM の葉(属性・プロパティ・テキストノード)に直接書き込まれます。

コンパイラ不要

TypeScript 標準の "jsx": "react-jsx" と jsxImportSource だけで動きます。Babel や Vite のプラグインを設定する必要はありません。

リアクティブかどうかが型でわかる

データを受け取るスロットに渡せるのは Observable か constant(...) だけで、素の値は渡せません。うっかりスナップショットを読んで渡しても、更新されないビューができあがるのではなく、型エラーになります。props も値を読み出したものではなく Bindable そのものなので、分割代入しても、デフォルト値を付けても壊れません。

そもそもリークしない作り

If・Match・For は、表示するものをそれぞれのスコープでマウントします。分岐を閉じたり行を消したりすると、その中で作った派生と購読はすべて破棄されます。