📌 项目地址tokio-rs/topcoat | ⭐ 1,408 颗星 | 🔧 Rust | 📜 未标注

项目简介

Topcoat 是 Tokio 团队推出的一个模块化、开箱即用的 Rust 全栈框架。它的目标是用最少的样板代码构建交互式 Web 应用,核心思路是将所有标记(markup)放在服务端渲染,同时通过 $(...) 表达式让部分逻辑直接编译为 JavaScript 在浏览器端运行,既保留了服务端的完整能力(如直接查询数据库),又避免了客户端 Wasm 构建和冗余的 API 层。

目前项目处于早期实验阶段(Stars 1408),官方明确说明 会有破坏性变更,适合喜欢尝鲜的 Rust 开发者。

核心特点

客户端反应性,无需 Wasm

传统全栈 Rust 方案通常需要编写独立的 API 接口,前端再通过 Wasm 或 JavaScript 交互。Topcoat 的做法是:在 view! 宏中插入 $(...) 表达式,这些表达式在首次渲染时由服务端执行,同时会被翻译为等价的 JavaScript,因此后续交互完全发生在浏览器中,不需要来回请求服务端。例如:

“`rust,ignore
view! {
signal open = false;

// 这行代码在浏览器中直接运行,不经过服务端。
"What is Topcoat?"
"A fullstack Rust framework."

}


`signal` 是 Topcoat 内置的响应式状态,修改它时会自动触发相关视图的更新。

### #[shard]:按需服务端重渲染

当某个组件需要依赖服务端才能获取最新数据时(比如实时搜索结果),可以用 `#[shard]` 标记该组件。Topcoat 会监听 `$(...)` 传入的参数变化,一旦改变就自动在服务端重新渲染该组件,并将新的 HTML 直接替换到页面中,无需手动触发请求或刷新。

```rust,ignore
#[component]
async fn search() -> Result {
    view! {
        signal query = String::new();
        // ...
        search_results(query: $(query.get()))
    }
}

#[shard]
async fn search_results(cx: &Cx, query: String) -> Result {
    // 这里可以直接查询数据库或调用外部 API
}

这种方式让全栈开发回归最自然的思维:组件即服务端函数,需要更新的部分明确声明为 #[shard],其余交互纯客户端运行。

快速上手

根据 README 示例,创建一个基本的 Topcoat 应用只需要几行代码。在 Cargo.toml 中添加依赖(参考 crates.io),然后使用以下入口:

“`rust,ignore
use topcoat::{
Result,
router::{Router, RouterBuilderDiscoverExt, page},
view::{component, view},
};

[tokio::main]

async fn main() {
topcoat::start(Router::builder().discover().build()).await.unwrap();
}

[page(“/”)]

async fn home() -> Result {
view! {
// 使用组件标签渲染 hello 组件,传递 name 参数
hello(name: “World”)
}
}

[component]

async fn hello(name: &str) -> Result {
view! { “Hello, ” (name) “!” }
}
“`

Router::builder().discover() 会自动注册项目中所有 #[page]#[component] 路由,启动后即可访问。

与同类工具的区别

  • 与 Actix-web / Axum 相比:Topcoat 不提供底层 HTTP 处理器,而是直接提供完整的页面组件和响应式更新,更接近传统全栈框架(如 Next.js、Rails)的体验。
  • 与 Dioxus / Yew 相比:无需客户端 Wasm 编译,所有渲染在服务端完成,只有 $(...) 表达式中的逻辑会被翻译为 JS;无需单独维护客户端构建和状态管理。
  • 与 Leptos / Sycamore 相比:Topcoat 的 #[shard] 机制使得服务端更新变得显式且简洁,不需要手动实现 WebSocket 或 SSE 通信。

注意事项

  • 早期阶段:README 明确标注 “Early-stage and experimental. Expect breaking changes.”,API 不稳定,不适合生产环境。
  • 依赖 Tokio:基于 Tokio 异步运行时,意味着整个项目需要 #[tokio::main] 入口,并习惯 async/await 写法。
  • 缺少完整文档:目前 docs.rs 上的 API 文档可能不完整,部分特性需参考 Discord 社区或实验使用。
  • 不适用于纯静态站点:Topcoat 的设计目标是动态 Web 应用,如果只是生成静态 HTML,其他工具更轻量。

总结

Topcoat 为 Rust 全栈开发提供了一种新颖的思路:服务端渲染 + 客户端反应性,不用 Wasm,不用写 API。如果你对实验性项目有耐心,并且希望用 Rust 一揽子解决前后端,Topcoat 值得关注。它的代码示例清晰,上手门槛不高,但后续进展需要跟踪官方仓库。

这篇文章对你有帮助吗?

发表回复