世界を動かす技術を、日本語で。

盆栽:JanestreetのUIライブラリ

2026年8月3日原文(github.com)

概要

Bonsai は、 OCaml で構築された高性能なリアクティブWebアプリ用UIライブラリ。 Jane Street 社内で幅広く利用されている。 状態管理とインクリメンタルな計算を分離して柔軟に構成可能。 テストやスタイリング、テンプレートなど周辺ツールも充実。 バックエンド・フロントエンドで OCaml 型を統一可能。

Bonsaiとは

  • Bonsai は、 Elm に着想を得た OCaml 向けUIライブラリ
  • Jane Street 社内のほぼ全Webアプリで利用
    • 企業ディレクトリ、トレーディング監視ツールなど多用途
  • 純粋関数型ステートマシンとしてコンポーネントを実装
  • 状態変化時のみインクリメンタルに再描画
  • 小規模なインタラクティブコンポーネントも容易に記述可能

Bonsaiの特徴

  • 状態・インクリメンタリティ・描画 を分離して構成
    • 必要な粒度で再計算や再描画を制御
    • ビジネスロジックの高コストな計算にも応用可能
  • 状態管理がコンポーネント階層に紐付かない
    • タブUIなど複数状態を持つコンポーネントの組み込みが容易
    • アプリ全体の状態管理がシンプル
  • OCaml の型システムを活用
    • バックエンド・フロントエンド双方で型・ロジックを共有
    • 大規模コードベースの保守性・可読性向上
  • 強力なテンプレート言語・スタイルシート・自動テスト対応

テスト機能

  • プログラム的UI操作 とDOM変化の検証が容易
  • テキスト入力やイベント発火なども自動化してテスト可能
  • 差分表示や属性変化の確認も可能
  • モックサーバー呼び出しや状態変化もテストに組み込める
  • ブラウザを開かずにコンポーネント開発・検証が可能

ドキュメント・学習リソース

  • Bonsai Quick StartThinking in Bonsai で実践的な入門が可能
  • How-to記事やBonsaiの歴史、ポッドキャストエピソードも提供
  • 公式サンプル集やAPIドキュメント(cont.mliファイル)あり

Bonsaiライブラリ群

  • Bonsai :汎用的なインクリメンタル・コンポーザブル状態マシン
  • Bonsai_web :Webブラウザ用UI構築向け
    • サンプル、コンポーネント、テスト、ベンチマーク
  • Bonsai_term :ターミナルUI構築向け
    • サンプル、コンポーネント、テスト
  • Bonsai_vr :バーチャルリアリティUI向け(エイプリルフールプロトタイプ)
  • ppx_html :JSXライクなHTML記述用プリプロセッサ
  • ppx_css :CSS記述用プリプロセッサ

Bonsai導入のメリット

  • 状態管理と再描画の最適化による 高パフォーマンス
  • 柔軟な 状態のスコープ管理、複雑なUI構成も容易
  • 型安全性 によるエラー削減とメンテナンス性向上
  • フロント・バックエンドの コード・型共有 による開発効率化
  • 自動テスト の充実による品質向上と開発サイクルの高速化

Hackerたちの意見

ウェブ専用みたいだね。ネイティブUIサポートについては何も言及されてないし(ターミナルUIは除く)。

Bonsaiの完全なターミナル実装もあるよ。最近は個人的なワークフローで連絡先データベースを管理するのに使ってるんだ! https://anil.recoil.org/notes/aoah-2025-9

BonsaiはOCamlで書かれているから、バックエンドとフロントエンドの両方で同じ言語と型を使えるようになるんだ。やっと!これが可能になるのを待ってたよ!

同じような試みにはScalajsがあるね。一般的な課題は、バックエンド言語で書かれたフロントエンドコードをJSにコンパイルして、他のJSエコシステムと統合することだよ。JaneStreetは自分たちで一から作るのが好きだから、彼らには当てはまらないけど、君には当てはまるかも。だからほとんどの人はフロントエンドをバックエンドとして使うことになっちゃうんだよね。

F#用のFableもあるけど、このコメントは皮肉だと思う。JavaScriptは一般的なバックエンド言語だしね。

やっと!これが可能になるのを待ってたんだ!皮肉?どうしてJaneStreetがJavaScriptで作られなかったのか、話したい?

今、Elixir/Phoenixがすごくいい選択肢だよ。集合論的型システムがLiveViewと一緒に整ってるからね。ここ5年間、かなり大きくて複雑なコードベースを少しずつ完全に統合する方向で進めてきたけど、すごく良かった。

Melangeと比べるとどうなんだろう?Ocamlのショップでも使われてるし、フロントとバックエンド両方にOcamlを使うためのものなんだよね(ahrefsが主要なユーザーでスポンサー)。これって、JSエコシステム(Reactやgraphqlなど)をかなり諦めることになるのかな?

パフォーマンスはすごく良さそうだけど、見た目がめちゃくちゃダサいと思う。誰かマージンを直して、パフォーマンスを保ったままにできる人はいないのかな。

UIの専門家じゃないけど、マージンに何か問題があるの?

ウェブUIプログラミングに詳しい人、これがローカルエージェントがHTMLベースのレポートや出力を作るのに良いか教えてくれない?それともTUI出力に?

たぶん無理だね。君のエージェントはこのツールについての情報があまりないから。

Hacker Newsで議論の続きを見る