返回

文章详情

Topcoat:Rust的全栈框架

Hacker News2026年7月17日 20:41

Rust的全栈框架Topcoat是一个模块化、开箱即用的Rust框架,用于构建全栈应用程序。它优先考虑简单性和生产力。请参阅入门指南以设置新项目。处于早期阶段和实验性。请期待重大变更。 使用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! { <!DOCTYPE html> <html> <body> hello(name: "World") </body> </html> } } #[component] async fn hello(name: &str) -> Result { view! { <h1>"Hello, "(name)"!"</h1> } } Topcoat的不同之处在于: 客户端反应性,无需样板代码 Topcoat在服务器上渲染所有markup:组件可以是异步的并直接查询数据库,消除了传统API层所需的所有样板代码。然而,交互不必消耗往返时间。$(...)表达式是普通的类型安全Rust,Topcoat在服务器端进行初始渲染并转换为JavaScript,因此在浏览器中瞬间重新运行。 没有wasm包,没有客户端构建步骤: view! { signal open = false; // 完全在浏览器中运行;没有服务器往返。 <button @click=$( |_e| open.set(!open.get()))> "什么是Topcoat?" </button> <p: hidden=$( !open.get() )> "一个全栈Rust框架。" </p> } 当更新确实需要服务器时,像新搜索结果一样,将组件标记为#[shard]。每当其$(...)参数之一改变时,Topcoat会在服务器上重新渲染它,并替换新的HTML: #[component] async fn search() -> Result { view! { signal query = String::new(); <input @input=$( |e: Event| query.set(e.target.value) )> // 用户输入时更新。 search_results(query: $(query.get())) } } #[shard] async fn search_results(cx: &Cx, query: String) -> Result { view! { <ul> // 你的服务器端代码,比如数据库查询: for product in search_products(cx, &query).await? { <li>(product.name)</li> } </ul> } } 强大的、无意外的HTML模板 view!宏忠实于HTML和Rust。使用熟悉的Rust控制流程作为你的模板的一部分: view! { <nav> for item in nav_items { <a href=(item.url) if item.url == current_path { aria-current="page" class="active" }> (item.label) </a> } </nav> } 使用topcoat fmt CLI命令在你的代码库中自动格式化view!片段(和其他宏)。 模块化路由 Topcoat可以选择性地从你的应用程序的模块结构推断路由树(无需构建步骤): src/ |-- app.rs -> / (and the root <html> layout) `-- app/ |-- about.rs -> /about |-- _marketing.rs (layout, no URL segment) |-- _marketing/ | `-- pricing.rs -> /pricing |-- posts.rs -> /posts |-- posts/ | `-- id.rs -> /posts/{post_id} `-- api/ `-- health.rs -> GET /api/health 资产打包 打包程序扫描你的编译二进制文件以查找asset!调用,将每个文件复制(甚至下载)到本地资产目录,并允许Topcoat高效地通过激进的浏览器缓存来提供它们。 const FERRIS: Asset = asset!("./ferris.png"); view! { <img src=(FERRIS)> } Topcoat还附带了网络字体和图标的实用工具,以及Fontsource(谷歌字体)和Iconify的易于集成。 内置Tailwind支持 启用tailwind功能以毫不费力地将Tailwind集成到你的项目中: view! { <link rel="stylesheet" href=(topcoat::tailwind::stylesheet!())> } 学习Topcoat 从这里开始 入门:创建新项目,安装CLI,运行开发服务器。 源代码格式化:topcoat fmt用于宏体。 渲染 view!宏:模板语法,控制流,条件属性。 #[component]宏:异步函数作为组件,带有子内容。 attributes!宏:可重用的运行时属性片段。 class!宏:来自静态和条件条目的以空格分隔的类列表。 路由 Router:页面、布局和API路由;手动和自动发现。 模块化路由:从模块树派生路由表。 处理请求 请求上下文(Cx):页面、布局和组件从中读取的值。 应用上下文:在请求之间共享长值,由类型键控。 记忆化:#[memoize]用于每请求缓存和去重。 函数,而不是中间件:推荐使用模型认证和其他请求范围的关注。 Cookies:读取和写入请求cookie jar,带有签名的、加密的和前缀的cookies。 会话:自己存储的会话认证:登录/注销生命周期、滑动到期和令牌轮换。 资产系统 资产:在Rust中声明资产,使用内容哈希URL提供它们。 字体:捆绑和提供网络字体。 图标:

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡