首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

Topcoat 正在利用 Rust 突破服务器应用程序的界限

摘要

Two months ago, we ( Julien and I ) announced Topcoat , a batteries-included full-stack Rust framework. It includes views, components, mailers, an ORM ( Toasty ), and more. Topcoat aims to make buildi...

the Rust and with Ruby Rails building applications software that
2026-09-25 1 阅读 约6分钟阅读 sagacity
分享:
字号:
两个月前,我们(Julien 和我)发布了 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 RAM 的非常非常快的应用程序?)。我将是第一个说 Rust 不像其他一些现代语言那么优雅的人,但我绝对宁愿使用 Rust 也不愿向我的眼睛里泼酸。此外,大多数高级应用程序都可以只使用最少的生命周期和泛型。 Rust 非常具有表现力。使用 Rust 和精心设计的库构建的应用程序看起来很不错。 Rust 是人工智能驱动开发新世界的最佳通用语言。这实际上包括构建 Web 应用程序或任何服务器应用程序。库和框架在这个新世界中的作用仍然悬而未决。放弃库或框架并使用定制解决方案的成本已经下降,但并未完全消失。他们将继续发挥重要但略有不同的作用。明确定义的约定和抽象将帮助法学硕士更快地工作,减少标记和错误。这就是我仍在推动 Rust 包含电池的框架的根本原因。我与 Julien 合作,他一直领导 Topcoat 的前端设计,而我主要关注 Toasty 和 DB 层。我们仍在弄清楚这个新框架到底应该是什么样子,但它正在成为一个非常好的东西。那么,Topcoat 和 Toasty 有何新功能? Topcoat 0.9 及更高版本中的客户端反应性 今天,我们发布了 Topcoat v0.9。当开始构建 Web 框架时,您通常选择构建浏览器端渲染器或服务器端渲染器。如果您从浏览器渲染开始,挑战就变成从服务器向浏览器获取数据并尽快渲染初始页面。如果从服务器开始,数据访问和初始页面加载变得很容易,但现在延迟和客户端响应能力成为瓶颈。无论你从哪里开始,你通常都会越来越向中间靠拢,以获得两全其美的效果。我们相信服务器端渲染是大多数 Web 应用程序的最佳默认设置,但我们希望确保您可以在需要时使用完全交互式、零延迟的 UI。在服务器上跟踪客户端信号 Topcoat 从信号和视图内的特殊运行时表达式语法开始!宏:经过完全类型检查的 Rust 子集,可以转换为 JavaScript 并在浏览器中重新运行。这个想法是在服务器上拥有尽可能多的渲染和业务逻辑,并且仅在运行时表达式中添加一些内容来弥补延迟差距,例如通过显示加载旋转器或更改某些类属性。使用这样的系统,可以构建基本的交互性,同时完全避免服务器往返: #[page] pub async fn page (cx: &Cx) -> Result < impl View > { let count = signal (cx, || 0i32 ); Ok (view! {
$(count.get ())
}) } 但是,当您需要更改标记本身的结构时,Topcoat 的运行时表达式本身就不够用了。为了解决这个问题,我们添加了分片,它是一种特殊类型的组件,只要参数发生变化,就可以在服务器上重新渲染: #[component] async fn search (cx: &Cx) -> Result < impl View > { let query = signal (cx, String ::new); } Ok (view! { search_results (query: $(query.get ())) }) } #[shard] async fn search_results (cx: &Cx, query: String ) -> Result < impl View > { Ok (view! {
    for search_products (c
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱