【Rust】Web開発フレームワーク完全ガイド - バックエンドからフロントエンドまで
Rust はシステムプログラミング言語として知られていますが、Web 開発でも利用が広がっています。バックエンドの API サーバーから、WebAssembly を活用したフロントエンドまで、幅広い Web 開発が可能です。
この記事では、Rust の Web 開発フレームワークをカテゴリ別に紹介し、どのような場面で Rust が適しているかを解説します。
Rust Web 開発の全体像
Rust による Web 開発は、大きく 3 つのカテゴリに分かれます。
バックエンドフレームワーク
Rust のバックエンドフレームワークは、高いパフォーマンスと安全性が特徴です。
| フレームワーク | 特徴 | 適するケース |
|---|---|---|
| Actix Web | 高性能、成熟、本番環境で広く使用 | 高負荷 API サーバー |
| Axum | Tokio チーム開発、モダンな設計 | 新規プロジェクト全般 |
| Rocket | 使いやすさ重視、Rails 風 | 学習・プロトタイプ |
| Warp | フィルタベースの軽量フレームワーク | マイクロサービス |
Axum
Tokio チームが開発するモダンなフレームワークです。型安全な設計と Tower ミドルウェアとの互換性が特徴です。
use axum::{routing::get, Router, Json};
use serde::Serialize;
#[derive(Serialize)]
struct User {
name: String,
age: u32,
}
async fn get_user() -> Json<User> {
Json(User {
name: "太郎".to_string(),
age: 25,
})
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/user", get(get_user));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}
Actix Web
パフォーマンスベンチマークで常に上位に位置する高性能フレームワークです。
use actix_web::{get, web, App, HttpServer, Responder};
use serde::Serialize;
#[derive(Serialize)]
struct User {
name: String,
age: u32,
}
#[get("/user")]
async fn get_user() -> impl Responder {
web::Json(User {
name: "太郎".to_string(),
age: 25,
})
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(get_user))
.bind("0.0.0.0:3000")?
.run()
.await
}
Rocket
Rails のように規約ベースで、直感的に書けるフレームワークです。
#[macro_use] extern crate rocket;
use rocket::serde::{Serialize, json::Json};
#[derive(Serialize)]
struct User {
name: String,
age: u32,
}
#[get("/user")]
fn get_user() -> Json<User> {
Json(User {
name: "太郎".to_string(),
age: 25,
})
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![get_user])
}
新規プロジェクトなら Axum がおすすめです。Tokio エコシステムとの統合が優れており、ドキュメントやコミュニティも充実しています。パフォーマンスを最優先するなら Actix Web、手軽に始めたいなら Rocket を検討してください。
フロントエンドフレームワーク(WebAssembly)
Rust でフロントエンドを開発する場合、コードは WebAssembly(Wasm) にコンパイルされてブラウザ上で実行されます。
| フレームワーク | 特徴 | React との類似度 |
|---|---|---|
| Leptos | SSR 対応、現在最も勢いがある | 高い(シグナルベース) |
| Yew | React 風コンポーネントモデル | 高い |
| Dioxus | クロスプラットフォーム対応 | 非常に高い(JSX 風マクロ) |
| Sycamore | リアクティブ、軽量 | 中程度 |
Leptos
現在最も活発に開発されているフレームワークです。SSR にも対応しており、フルスタック開発が可能です。
use leptos::*;
#[component]
fn App() -> impl IntoView {
let (count, set_count) = create_signal(0);
view! {
<button on:click=move |_| set_count.update(|n| *n += 1)>
"クリック: " {count}
</button>
}
}
fn main() {
mount_to_body(App);
}
Leptos の create_signal は React の useState に似ています。コンポーネントモデルや JSX 風のマクロ(view!)など、React 経験者には馴染みやすい設計です。
Yew
Rust フロントエンドの先駆けとなったフレームワークです。
use yew::prelude::*;
#[function_component(App)]
fn app() -> Html {
let count = use_state(|| 0);
let onclick = {
let count = count.clone();
Callback::from(move |_| count.set(*count + 1))
};
html! {
<button {onclick}>
{ format!("クリック: {}", *count) }
</button>
}
}
fn main() {
yew::Renderer::<App>::new().render();
}
フルスタック開発
Leptos と Dioxus は、フロントエンドとバックエンドを 1 つの Rust プロジェクトで書けるフルスタックフレームワークとしても機能します。
// Leptos のサーバー関数 - バックエンドのロジックをフロントエンドから直接呼び出せる
#[server(GetUsers)]
async fn get_users() -> Result<Vec<User>, ServerFnError> {
// この関数はサーバー側で実行される
let users = db::get_all_users().await?;
Ok(users)
}
#[component]
fn UserList() -> impl IntoView {
// フロントエンドからサーバー関数を呼び出す
let users = create_resource(|| (), |_| get_users());
view! {
<ul>
{move || users.get().map(|data| {
data.unwrap().into_iter().map(|user| {
view! { <li>{user.name}</li> }
}).collect_view()
})}
</ul>
}
}
Rust の Web 開発における強みと注意点
強み
C/C++ に匹敵する実行速度。ガベージコレクションがなく、予測可能なパフォーマンスを実現します。
所有権システムにより、メモリリークやデータ競合をコンパイル時に検出します。
async/await と Tokio ランタイムによる効率的な非同期処理が可能です。
強力な型システムにより、ランタイムエラーの多くをコンパイル時に防止します。
注意点
Rust の Web 開発には以下のトレードオフがあります。学習コストとエコシステムの成熟度を考慮して選択してください。
| 注意点 | 詳細 |
|---|---|
| 学習コスト | 所有権・借用・ライフタイムの概念の理解が必要 |
| コンパイル時間 | プロジェクトが大きくなるとビルド時間が長くなる |
| エコシステム | JS エコシステムと比べるとライブラリが少ない |
| DOM オーバーヘッド | フロントエンドは Wasm 経由のため、DOM 操作にオーバーヘッドがある |
Rust が適するケースと適さないケース
- 毎秒数万リクエストを捌く API サーバー
- リアルタイム処理(WebSocket、ゲームサーバー)
- CPU 負荷の高い処理(画像処理、データ変換)
- インフラツール・CLI ツール
- 静的サイト(ブログ、ポートフォリオ)
- プロトタイプや MVP
- フォーム中心の一般的な Web アプリ
- 小規模チームでの素早い開発
静的サイトには専用ツールが最適
静的サイトの場合、Rust のパフォーマンスやメモリ安全性といった強みが活きません。以下のような専用ツールが最適です。
| ツール | 言語 | 特徴 |
|---|---|---|
| Astro | JavaScript | コンポーネント指向、部分ハイドレーション |
| Hugo | Go | ビルド速度が最速 |
| Next.js | JavaScript | SSG 対応、React エコシステム |
| 11ty | JavaScript | シンプル、軽量 |
Hugo などの静的サイトジェネレーター(SSG)はフロントエンドでもバックエンドでもなく、「ビルド時に HTML を生成するツール」です。サーバーは不要で、Netlify や GitHub Pages に静的ファイルを配置するだけで公開できます。
フレームワーク選択ガイド
- 高性能 API → Axum または Actix Web
- 学習しやすさ → Rocket
- フロントエンド → Leptos(SSR 対応、最も活発)
- フルスタック → Leptos または Dioxus
- 静的サイト → Astro / Hugo を推奨
- プロトタイプ → Node.js / Python を推奨
参考文献
- Axum - GitHub
- Actix Web - 公式ドキュメント
- Rocket - 公式ドキュメント
- Leptos - 公式ドキュメント
- Yew - 公式ドキュメント
- Dioxus - 公式ドキュメント
- Are We Web Yet?
まとめ
Rust での Web 開発は、バックエンドを中心に実用レベルに達しています。フロントエンドは Leptos を中心に急速に成長しています。選択のポイントは以下の 3 点です。
- バックエンド API なら Axum か Actix Web。パフォーマンスと安全性を両立できる
- フロントエンド は Leptos が現在最も活発。ただし JS エコシステムと比べるとまだ発展途上
- 静的サイトや小規模プロジェクト には Rust はオーバースペック。Astro や Hugo など専用ツールが最適