2026-04-12 · engineering / dpw
なぜ React を代数に置き換えたか
なぜ React を代数に置き換えたか
Code Daimyo — 2026 年 4 月
React は実在の問いに対する正しい答えでした — 命令的な DOM コードを書かずに対話的な UI をどう作るか。そのモデル — UI は状態の関数である — は本当に良いものです。私たちはそれと論じるためにここにいるのではありません。
私たちはここで、そのモデルの周りに育ったランタイム — フック、依存配列、エフェクト、rules-of-hooks の linter、サスペンス境界、サーバーコンポーネント、コンカレント・モードのための二つ目のレンダラー — が、当初のアイデアの価値に見合わぬほど偶発的複雑性を蓄積したと論じます。今日、本番の React コードのほとんどは UI の記述ではなく、ランタイムの管理に費やされています。
ですから DPW を作るとき、私たちは React を代数で置き換えました。すべてのコンポーネントが State × Event → State です。それだけ。フックなし。エフェクトなし。ライフサイクルなし。依存配列なし。気にすべき再レンダリングなし。コンパイラが代数を読み、ステップ関係に従う最小の更新計画を生成します。
得たものは大きい:
- タイムトラベルが無償で。 すべてのイベントは値、すべての状態は値、タイムライン全体は単なるリスト。Undo は
drop(-1)、Redo はtake(+1)。特別なインフラはいりません。 - 決定性。 同じイベントには同じ状態。常に。実行をまたいでも、マシンをまたいでも、年をまたいでも。
- コンパイルが通る AI 提案。 AI コパイロットは二度発火する
useEffectを提案できません —useEffectが存在しないからです。レンダリングをまたいで状態を漏らすこともできません — レンダリングが存在しないからです。 - 書き換えとしてのリファクタ。 コンポーネントの移動、状態の分割、二つのイベントの結合 — これらはすべて IDE が適用する代数的書き換えであり、意味が保たれていることの証明を伴います。
諦めたものも本物です。React のエコシステムは巨大で、その大半を直接再利用することはできません。学習曲線は無視できない。フックでは些細なパターン(コンポーネントをまたぐ命令的エフェクト、外部の可変状態への即席の購読)には、より多くの思考が要ります。
その取引は良いものだと考えます。今日存在する形の React ランタイムの内側で、7 万行の IDE を出荷することは私たちにはできなかったでしょう。
— Code Daimyo