【Rust】Web開発フレームワーク完全ガイド - バックエンドからフロントエンドまで

PUBLISHED 2026-02-07

Rust はシステムプログラミング言語として知られていますが、Web 開発でも利用が広がっています。バックエンドの API サーバーから、WebAssembly を活用したフロントエンドまで、幅広い Web 開発が可能です。

この記事では、Rust の Web 開発フレームワークをカテゴリ別に紹介し、どのような場面で Rust が適しているかを解説します。

Rust Web 開発の全体像

Rust による Web 開発は、大きく 3 つのカテゴリに分かれます。

%%{init: {'theme':'neutral'}}%% graph TD A[Rust Web 開発] --> B[バックエンド] A --> C[フロントエンド] A --> D[フルスタック] B --> B1[Actix Web] B --> B2[Axum] B --> B3[Rocket] C --> C1[Leptos] C --> C2[Yew] C --> C3[Dioxus] C --> |WebAssembly 経由| E[ブラウザ] D --> D1[Leptos] D --> D2[Dioxus]

バックエンドフレームワーク

Rust のバックエンドフレームワークは、高いパフォーマンスと安全性が特徴です。

フレームワーク特徴適するケース
Actix Web高性能、成熟、本番環境で広く使用高負荷 API サーバー
AxumTokio チーム開発、モダンな設計新規プロジェクト全般
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 との類似度
LeptosSSR 対応、現在最も勢いがある高い(シグナルベース)
YewReact 風コンポーネントモデル高い
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);
}
💡 React との共通点

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();
}

フルスタック開発

LeptosDioxus は、フロントエンドとバックエンドを 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 が適するケースと適さないケース

✅ Rust が活きるケース
  • 毎秒数万リクエストを捌く API サーバー
  • リアルタイム処理(WebSocket、ゲームサーバー)
  • CPU 負荷の高い処理(画像処理、データ変換)
  • インフラツール・CLI ツール
❌ Rust がオーバースペックなケース
  • 静的サイト(ブログ、ポートフォリオ)
  • プロトタイプや MVP
  • フォーム中心の一般的な Web アプリ
  • 小規模チームでの素早い開発

静的サイトには専用ツールが最適

静的サイトの場合、Rust のパフォーマンスやメモリ安全性といった強みが活きません。以下のような専用ツールが最適です。

ツール言語特徴
AstroJavaScriptコンポーネント指向、部分ハイドレーション
HugoGoビルド速度が最速
Next.jsJavaScriptSSG 対応、React エコシステム
11tyJavaScriptシンプル、軽量
📌 Hugo と SSG の位置付け

Hugo などの静的サイトジェネレーター(SSG)はフロントエンドでもバックエンドでもなく、「ビルド時に HTML を生成するツール」です。サーバーは不要で、Netlify や GitHub Pages に静的ファイルを配置するだけで公開できます。

フレームワーク選択ガイド

選択のポイント
  • 高性能 API → Axum または Actix Web
  • 学習しやすさ → Rocket
  • フロントエンド → Leptos(SSR 対応、最も活発)
  • フルスタック → Leptos または Dioxus
  • 静的サイト → Astro / Hugo を推奨
  • プロトタイプ → Node.js / Python を推奨

参考文献

まとめ

Rust での Web 開発は、バックエンドを中心に実用レベルに達しています。フロントエンドは Leptos を中心に急速に成長しています。選択のポイントは以下の 3 点です。

  1. バックエンド API なら Axum か Actix Web。パフォーマンスと安全性を両立できる
  2. フロントエンド は Leptos が現在最も活発。ただし JS エコシステムと比べるとまだ発展途上
  3. 静的サイトや小規模プロジェクト には Rust はオーバースペック。Astro や Hugo など専用ツールが最適
CATEGORY
TAGS
円