返回

文章详情

Topcoat 正在利用 Rust 推动服务器应用的边界

Hacker News2026年9月25日 09:59

两个月前,我(朱利安和我)发布了 Topcoat,这是一个包含完整功能的全栈 Rust 框架。它包括视图、组件、邮件发送器、一个 ORM(Toasty)等等。Topcoat 的目标是让使用 Rust 构建 web 应用的生产力与其他语言一样高。我们一直在努力发布新功能,所以现在是谈论新内容的好时机。我以专业软件开发者的身份开始了我的职业生涯,构建 Ruby on Rails 的 web 应用。在那时,“在 15 分钟内构建一个博客”的视频是开创性的。那时候,构建软件是乏味的:要写样板,而不是直接发布功能。Ruby on Rails 挑战了这一点,并证明了你可以高效工作,构建软件也可以很有趣。我爱上了 Ruby on Rails,曾在核心团队工作了几年,至今仍是 Ruby on Rails 的前 50 名历史贡献者。经历了那段时期后,难以夸大 Ruby on Rails 哲学对软件开发一般的影响。从那以后,我花了大约 13 年的时间来建立 Rust 的网络生态系统。虽然 Rust 在基础设施层面得到了广泛采用,但我始终将重点放在更高级的应用开发上,包括 Ruby on Rails 所占据的空间。我一直想抓住我构建 Ruby on Rails 应用时感觉到的一些魔力,但这次是用 Rust(谁不喜欢运行速度极快且大约占用 20MB 内存的应用呢?)。我会第一个说 Rust 并不像其他一些现代语言那样优雅,但我绝对宁愿使用 Rust,也不想把酸液倒入我的眼睛。此外,大多数高级应用可以最小化地使用生命周期和泛型。Rust 是非常富有表现力的。用 Rust 和良好设计的库构建的应用可以看起来很漂亮。Rust 是新一代 AI 驱动开发的最佳通用语言。这包括构建 web 应用或任何服务器应用。库和框架在这个新世界中的角色仍然悬而未决。抛弃一个库或框架并使用定制解决方案的成本下降了,但并没有完全消失。它们将继续扮演重要但稍有不同的角色。明确定义的约定和抽象将帮助 LLM 更快地工作,使用更少的令牌和更少的错误。这就是我仍然推动 Rust 的一个包含电池的框架的根本原因。我与朱利安合作,他负责 Topcoat 的前端设计,而我主要专注于 Toasty 和数据库层。我们仍在确定这个新框架应该是什么样子,但它正在朝着一个非常好的方向发展。至于 Topcoat 和 Toasty 的新变化是什么呢? Topcoat 0.9 及之后的客户端反应性 今天,我们发布了 Topcoat v0.9。当开始构建一个 web 框架时,通常选择构建浏览器端渲染器或服务器端渲染器。如果你从浏览器渲染开始,挑战就在于如何尽快将数据从服务器传递到浏览器并渲染初始页面。如果从服务器开始,数据访问和初始页面加载变得简单,但现在延迟和客户端响应性成为瓶颈。无论你从何处开始,通常都会向中间逐渐汇聚,以获得两全其美的效果。我们相信服务器端渲染是大多数 web 应用的最佳默认选项,但我们想确保你可以在需要时降级到完全交互式的零延迟 UI。 服务器上的客户端信号 Topcoat 从信号和一个特殊的运行时表达式语法开始,这在 view! 宏内部:这是 Rust 的一个完全类型检查的子集,可以被转译为 JavaScript 并在浏览器中重新运行。这个想法是将尽可能多的渲染和业务逻辑放在服务器上,仅仅加入运行时表达式来弥补延迟差距,例如显示加载旋转器或更改某些类属性。使用这样的系统,构建基本交互性成为可能,同时完全避免服务器访问: #[page] pub async fn page (cx: &Cx) -> Result < impl View > { // 这个状态变量在服务器上初始化,但在浏览器上存在。 let count = signal (cx, || 0i32 ); Ok (view! { <button @click=$(|_e| count. increment ())> "increment" </button> <button @click=$(|_e| count. decrement ())> "decrement" </button> // 点击按钮时,计数更新。没有服务器往返。 <div>$(count. get ())</div> }) } 然而,仅靠这些,Topcoat 的运行时表达式在你需要更改标记结构本身时显得不足。为了解决这个问题,我们添加了 shards,这是一种特殊类型的组件,可以在其参数变化时在服务器上重新渲染: #[component] async fn search (cx: &Cx) -> Result < impl View > { let query = signal (cx, String ::new); Ok (view! { <input @input=$(|e: Event| query. set (e.target.value))> // 搜索结果随着

赞助内容

NordVPN Next-gen Antivirus

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

☕请我喝杯咖啡