🧥 Topcoat — tokioが出したフルスタックRustフレームワーク、wasmを捨ててRust式をJSにトランスパイルする

Rust非同期ランタイムtokioのチームからフルスタックWebフレームワークTopcoatが登場。$()式で型チェック済みRustをJSに変換しwasmバンドルなしでリアクティブUIを作る設計。Leptos/Dioxusとの違い、tokio作者carllercheのHN発言、v0.4.0時点の現在地を整理する。

読む深さ

RustのWebフレームワークと聞いて思い浮かぶのは、LeptosやDioxusのような「Rustをwasmにコンパイルしてブラウザで動かす」路線だと思う。tokio(Rustの非同期ランタイム。Rustのネットワークコードのほぼ全部が乗っている土台)のチームが7月22日に正式発表したTopcoatは、その路線を選ばなかった。

自己紹介は「The full full-stack framework for Rust」。fullが2回入っているのは誤植ではなく、HNで「DB層がないのにフルスタックか」と突っ込まれる程度には野心的な看板だ。MITライセンス、公開時点でv0.4.0、スターは2,775(7/24時点)。READMEに「Early-stage and experimental」と明記されている。

wasmではなく、RustをJSに変換する

設計の核はリアクティビティの実現方法にある。コンポーネントはasync関数で、完全にサーバーレンダリング。DBにも直接クエリできるので、APIエンドポイントを別に書くボイラープレートがない。

ではボタンを押したときの動きはどうするか。ここで$(...)式が出てくる。型チェック済みのRust式のサブセットを、JSにトランスパイルしてブラウザで実行するのだ。カウンターの増減みたいな軽いインタラクションは、サーバーへのラウンドトリップなしでJS化されたRustが処理する。wasmバンドルなし、クライアントビルドなし。Leptos/Dioxusが「Rustのままブラウザへ」なら、Topcoatは「Rustの見た目のままJSへ」で、バンドルサイズの問題を根本から消しにいっている。

サーバー側の再描画は#[shard]が担う。引数が変わるとサーバーで再レンダリングしてHTMLを差し替える——作者自身がHTMX/Hotwire系の戦略だと説明していて、実際HTMXとAlpine AJAXの統合ヘルパーも同梱されている。他にもHTML+Rust制御フローを書くview!マクロ、#[page]属性のルーティング、キャッシュハッシュ付きのasset!バンドラと、必要な道具は一通り揃う。UIコンポーネント集「Topcoat UI」はshadcn/uiと同じ「コピーして自分のコードとして編集する」配布方式(Tailwindベース・Node不要)で、先日Base UIの記事で書いた配布モデルの潮流がRust圏にも届いた格好だ。

作者本人が降臨したHNスレッド

HN(131ポイント)にはtokio作者のcarllerche本人が現れて、批判に一つずつ答えていた。この受け答えがプロジェクトの現在地をよく表している。

「DB層がないのにフルスタックか」には、同じtokio-rs製のORM Toastyとの統合が間もなく来ると回答(ロードマップはissue #104に公開済み)。Rails型のloco.rsとの違いを問われると、「ブラウザ用のJSを書かずにリアクティブなアプリを作る」のがTopcoatの狙いだと整理した。そして一番興味深かったのは、「tokioのブランド力で品質以上に採用が広がるのでは」という懸念に対して、TopcoatとToastyは将来tokio-rsから分離される可能性が高いと本人が認めたことだ。いまtokio-rs配下にあるのはCI利用枠の都合が大きいらしい。ブランドの威を借りない姿勢の表明として読んだ。

Django相当のもの(admin画面・認証・マイグレーション)が欲しいという要望も複数出ていた。v0.4.0のexperimentalに今それを求めるのは気が早いが、要望の方向がRails/Django側を向いているのは、Rustでアプリを書きたい人の実像を示していると思う。インフラのためにRustを選んだ組織が、同じ言語で管理画面も書きたい——carllercheが挙げた想定読者と、要望はきれいに重なっている。

「サーバーで描いてHTMLを差し替える」の再発明ではなく合流

自分の内部ツールはHono+htmxのサーバーレンダリング構成で作っているので、Topcoatの設計は他人事に思えなかった。SPAを避けてサーバーで描く、動きが要る部分だけ最小の仕掛けを差す——この構成の気持ちよさをRustの型システム付きでやれるなら、それは確かに欲しい人がいる。

日本語圏にはZennの第一報が1本あるだけで、設計思想まで踏み込んだ記事はまだない。ちなみに2013年にAdobeが出した同名のCSSフレームワーク「Topcoat」とは別物なので、検索時はご注意を。v0.4.0を本番に入れる話ではまだない。ただ、wasm一辺倒だったRustフロントエンドに「トランスパイルで戻る」という第三の道が引かれたことは、覚えておいて損がない。RustでWebアプリ、あなたならwasm側とJS側、どちらの橋を渡りますか。

元ネタ: https://github.com/tokio-rs/topcoat