Skip to content

2026 年的 Rust 全栈指北:Axum 与 Leptos 的碰撞

毛佳国

📌 核心速览 (TL;DR)

Rust 全栈 2026 最优解:后端用 Axum(Tokio 生态,极致异步性能),前端用 Leptos(细粒度响应式 + SSR/WASM,语法接近 SolidJS)。两者共享同一套类型定义,通过 Server Functions 实现”前端调用后端函数”的无缝体验——编译器帮你生成 API 桥接,无需手写 REST 接口。

适合人群:追求极致性能(Rust WASM 比 React 快 2–5×)、内存安全与全栈类型一致性的工程师。


如果几年前,有人告诉你用 Rust 写前端,你可能会觉得他脑子多少有点大病。编译的成本、极高的学习曲线和当时还不够成熟的 WebAssembly (WASM) 生态都在告诉你:这只是一场脱落头皮的自虐。

但在 2026 年,这一切变了。随着 Leptos 框架的稳定,和后端王者 Axum 的深度融合,它带来了一种令人极度舒适的开发体验:一套 Rust 代码,同时运行在服务器和浏览器上。


全栈技术栈横向对比

维度Next.js (TS)SvelteKit (TS)Axum + Leptos (Rust)
运行时性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
内存安全❌ GC/AnyScript⚠️ 运行时检查✅ 编译期保证
WASM 支持❌ 无原生方案❌ 无原生方案✅ 原生 WASM 目标
类型全栈一致⚠️ tRPC 方案⚠️ 需额外配置✅ 原生共享类型
学习曲线低低高(Rust 本身)
生态成熟度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐(快速成长中)

Axum:Tokio 生态的后端王者

Axum 是由 Tokio 团队开发的异步 Web 框架,在 GitHub 上拥有 20k+ ⭐。其核心优势是与 Tokio 运行时的深度集成,以及基于 Tower 中间件生态的极高可组合性。

快速入门示例

# Cargo.toml
[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tower-http = { version = "0.5", features = ["cors", "trace"] }
use axum::{
    routing::{get, post},
    extract::Json,
    http::StatusCode,
    Router,
};
use serde::{Deserialize, Serialize};

// 共享类型定义(前后端共用)
#[derive(Serialize, Deserialize)]
struct CreatePost {
    title: String,
    content: String,
}

#[derive(Serialize)]
struct Post {
    id: u64,
    title: String,
    content: String,
}

// 处理器:类型安全的 JSON 解析,编译期验证
async fn create_post(
    Json(payload): Json<CreatePost>,
) -> (StatusCode, Json<Post>) {
    let post = Post {
        id: 1,
        title: payload.title,
        content: payload.content,
    };
    (StatusCode::CREATED, Json(post))
}

#[tokio::main]
async fn main() {
    let app = Router::new()
        .route("/posts", post(create_post))
        .route("/health", get(|| async { "OK" }));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    println!("🦀 Axum server running on http://0.0.0.0:3000");
    axum::serve(listener, app).await.unwrap();
}

Axum 的核心特性


Leptos:不仅是 React 的精神续作,更是性能怪物

Leptos 是 Rust 世界里的 SolidJS——通过细粒度响应式系统(Signals),在不使用 Virtual DOM 的情况下,实现颗粒度极其精准的 DOM 更新。

组件示例(语法对比)

use leptos::*;

// Leptos 组件:对比 React 的 useState,几乎一眼就懂
#[component]
fn Counter() -> impl IntoView {
    // 对应 React 的:const [count, setCount] = useState(0)
    let (count, set_count) = create_signal(0);

    view! {
        <div class="flex items-center gap-4">
            <button
                class="bg-blue-500 text-white px-4 py-2 rounded"
                on:click=move |_| set_count.update(|n| *n += 1)
            >
                "点击次数: " {count}
            </button>
            // 派生信号:只有 count 变化时才重新计算
            <p>"翻倍: " {move || count() * 2}</p>
        </div>
    }
}

编译后,生成的是通过 WebAssembly 运行的超紧凑代码。在浏览器中,以接近原生速度运行的状态绑定,其流畅程度能让你感觉到物理级别的丝滑。

SSR + Hydration:SEO 友好的全栈渲染

Leptos 原生支持服务器端渲染(SSR)和选择性 Hydration,类似 React 的 Next.js:

// 在服务器上渲染 HTML,发送到客户端后 WASM 接管交互
// 无需任何额外配置,Leptos 自动处理 SSR 和 WASM 的边界
#[component]
fn App() -> impl IntoView {
    view! {
        <Router>
            <Routes>
                <Route path="/" view=HomePage />
                <Route path="/posts/:id" view=PostPage />
            </Routes>
        </Router>
    }
}

Server Functions:魔法般的全栈交互

过去,当我们用前端写了一个表单,要提交给后端,需要:

  1. 后端定义 API 路由 /api/submit;
  2. 后端写处理 JSON 参数的结构体;
  3. 前端用 fetch 小心翼翼地序列化 JSON 发送;
  4. 前端收到响应后解析 JSON。

这太蠢了,对吧?

在 Axum + Leptos 的全栈开发中,上述所有繁琐彻底消失。Server Functions 让你像调用普通函数一样,直接在前端调用后端的数据库操作:

// 这个函数标记了 #[server] 宏
// 在前端调用时:Leptos 自动生成 HTTP 请求
// 在服务器上执行时:直接运行 Rust 代码访问数据库
#[server(CreatePost, "/api")]
pub async fn create_post(title: String, content: String) -> Result<Post, ServerFnError> {
    // 这段代码只在服务器上运行
    let db = use_context::<DbPool>().ok_or(ServerFnError::ServerError("No DB".into()))?;
    let post = sqlx::query_as!(
        Post,
        "INSERT INTO posts (title, content) VALUES ($1, $2) RETURNING *",
        title,
        content
    )
    .fetch_one(&db)
    .await?;
    Ok(post)
}

// 在前端组件中,直接调用这个函数!
#[component]
fn CreatePostForm() -> impl IntoView {
    let create = create_server_action::<CreatePost>();

    view! {
        <ActionForm action=create>
            <input type="text" name="title" placeholder="标题" />
            <textarea name="content" placeholder="内容" />
            <button type="submit">"发布"</button>
        </ActionForm>
    }
}

编译器会自动把这个函数抽离:前端编译成 WASM 并隐形建立网络连接,后端编译成超高性能的本机服务器二进制。这就是全栈 Rust 在 2026 年交出的终极答卷:类型安全、无缝调用、极致性能。


❓ 常见问题与 AI 快问快答 (FAQ)

Q:Leptos 的 WASM 包体积大吗?会影响首屏加载?

A:Leptos 的 WASM 包体积经 wasm-opt 压缩后约 300–500 KB,与 React + ReactDOM 的 JS 包(约 150 KB gzip)相当。配合 SSR + Streaming,首屏 LCP 不受影响,WASM 在后台异步加载后接管交互(Hydration)。

Q:Axum 适合处理高并发吗?与 Nginx 相比如何?

A:Axum 基于 Tokio 异步运行时,在 TechEmpower Web Framework Benchmark Round 22 中,Axum 的 JSON 序列化吞吐量约 600k req/s(16 核),性能远超 Node.js/Django 等框架。Nginx 主要作为反向代理和静态文件服务使用,两者定位不同,生产环境中推荐 Nginx(反代 + TLS 终止)+ Axum(应用层)组合使用。

Q:Rust 全栈开发适合个人项目吗?还是只适合大公司?

A:适合对性能有极致追求、愿意投入 Rust 学习成本的个人开发者。但如果你需要快速 MVP 验证,Next.js / SvelteKit 的开发效率仍然更高。Rust 全栈的优势在于长期维护成本极低(编译期错误远多于运行期错误)和部署成本极低(单一静态二进制,无运行时依赖)。

Q:数据库层推荐什么?

A:Axum 生态中推荐 SQLx(异步 SQL,编译期 SQL 校验)或 SeaORM(ActiveRecord 风格 ORM)。SQLx 的 query_as! 宏可以在编译时验证 SQL 语句的正确性,彻底消灭 SQL 语法错误。

上一篇
拥抱 NixOS:用代码定义你的全部 Homelab 服务器
下一篇
2026 年的 Mac 菜单栏极简折腾:这几个神器帮你夺回控制权