Hacker News 中文摘要

RSS订阅

Show HN: Proa – A Rust web framework with fast SSR and multi-target rendering

Proa 是一个用 Rust 编写的超高性能、开箱即用的 Web 框架,围绕一种新的编程模型,支持可组合的多目标渲染,可用于构建快速、信息密集的应用。它让同一个类型化组件同时输出 HTML、Markdown 等多种渲染目标:示例中的 ProductCard 通过 MdRenderSync 渲染出带标题和购买链接的 Markdown,又通过 WebRenderSync 与 html_sync! 宏生成包含商品名和链接的 article 结构,Link 组件也能分别产出 Markdown 链接与 HTML 锚点。

正文

性能极强、开箱即用的 Rust Web 框架 Proa,围绕一种用于可组合、多目标渲染的新编程模型构建。

开始使用 观看介绍

一个对象。覆盖所有渲染目标。

从同一个类型化组件渲染 HTML、Markdown 和其他渲染目标。

观看多目标渲染

ProductCard::new(product)

impl MdRenderSync for ProductCard { fn rendermd(self, cx: &mut WebContext) -> Result<(), WriteError> { mdsync! { r###" # {self.product.name}

        {Link::new("Buy now", self.product.url)}
        "###
    }
    .render_md(cx)
}

}

md_sync! { r###" {self.label} "### }

impl WebRenderSync for ProductCard { fn render(self, cx: &mut WebContext) -> Result<(), WriteError> { html_sync! {

{self.product.name}

{Link::new("Buy now", self.product.url)}
} .render(cx) } }

html_sync! { {self.label} }

构建快速、信息密集的应用。

探索用 Proa 重制的 GitHub、Sentry 和 Airbnb,具备快速服务端渲染和选择性交互。

查看展示 基准测试

oven-sh/bun

Code Issues 5k+ Pull requests 1.9k Actions Security Insights

[跟踪] Zig/C++ 分支:Rust->Zig 移植进度 #31136

已关闭 MaurerAnton 希望将 8 个提交合并到 oven-sh:main

讨论 9,提交 8,检查 1,文件变更 16,+461 -10

23.5 微秒

Proa 渲染 p50

5.56 毫秒

React renderToString p50

237 倍

更快

热生产环境 p50 在 8 核 AMD EPYC-Milan VPS 上测得。

独立演示。与 GitHub、Sentry 或 Airbnb 无关,也未获得其认可或支持。

速度背后的数字。

构建你的设计系统。

Proa UI 提供 Shadcn 风格的 Proa 组件。源码在你的仓库中,使用类型化 Rust。可以主题化、组合并发布。

浏览组件

  1. 是否需要 JavaScript?是否可访问?能否重新设计样式?支持单个或多个展开面板,并提供完全不发送 JavaScript 的纯 CSS 构建。
  2. | 发票 | 状态 | 金额 | | --- | --- | --- | | INV-2041 | 已支付 | $1,499.00 | | INV-2042 | 待处理 | $399.00 | | INV-2043 | 已支付 | $399.00 | | INV-2044 | 已退款 | $399.00 | 由表头、表体、表尾和标题部分组成,可组合成密集的记录视图。
  3. 提供实心、描边、ghost 和链接四种变体,涵盖三种尺寸和三种意图。
  4. Workspace:用于你的部署 URL。默认服务端渲染,仅在需要时才发送 island。标签、描述和错误文本可绑定到任何控件,支持横向或纵向两种方向。
  5. ### 部署预览 2 分钟前推送到 main。渲染 41 µs。客户端 JS 0 kB。在你的仓库中从源码构建。提供页头、内容和页脚插槽,对应大多数产品屏幕所基于的表面。
  6. 2026 年 3 月。Mo Tu We Th Fr Sa Su。支持单选和范围选择、月份翻页和键盘导航,以纯 HTML 渲染。
  7. 每周请求 36.2k。面积图、条形图、折线图、环形图和堆叠系列,在服务端绘制为纯 SVG。
  8. 分组的一次性代码输入框,带分隔符、尺寸变体,以及可自定义样式的插入符。
  9. 我:Can an agent add a settings page to this app?(智能体可以为这个应用添加设置页面吗?)AI(Proa)于 9:41 回复:Yes. Every component is typed Rust in your repo, so the compiler checks the edit before it ever reaches a browser.(可以。每个组件都是你仓库里的类型化 Rust,因此编译器会在修改进入浏览器前完成检查。)我于 9:41 又问:How much JavaScript does that ship?(这会发送多少 JavaScript?)9:42 展示的是用于助手机器人界面的消息气泡、头像、时间戳和输入指示器。
  10. 语法高亮在服务端完成,因此不会有高亮器发送到浏览器。
  11. 58 个组件,每个都带有实时示例、props 表格和可复制的 Rust 代码。

横向滚动或使用方向键浏览组件演示。

现代 Web 应用想要的一切,却没有底层的渲染负担。

这是一个组件系统和框架层面,而不是模板引擎。

框架

超越模板胶水的框架原语。

Proa 将流式渲染、请求数据、路由、元数据和响应控制都保留在与组件相同的类型化 WebContext 中。

流式 SSR:按顺序或乱序

当顺序重要时按文档顺序刷新 HTML,或者当慢数据不应阻塞页面时,让 Suspense 边界乱序流式传输已就绪的块。

由 DataLoader 支持的 WebContext

每次渲染都能通过组件已有的同一个 WebContext,以类型化方式访问请求作用域数据、响应元数据、路由状态和加载器缓存。

类型化 SSR 框架语义

布局、路由、元数据、静态资源、表单、变更和渐进式导航都通过同一个 Rust 组件模型组合,而不是模板胶水。

交互性

在不放弃原生 SSR 的前提下添加交互。

保持页面为服务端渲染的 HTML,然后通过类型化信号和事件处理程序将特定控件选择性地加入客户端行为。Proa 只把需要动的部分编译成 JavaScript。

RSJS islands

在 Rust 中使用 signal(...)、bind_value、类型化事件和命名处理程序。编译器会下沉客户端行为。

极小的每 island JavaScript

每个经过 hydration 的 RSJS island 都会生成一个小型原生 JS 模块和种子状态,配合一个约 1.3 KB gzip 的共享运行时一起提供。

采用方式

保留你已有的技术栈。先迁移一个路由。

可以为 Proa 路由和响应使用 Axum-native,或者通过 FFI 从 Node、Go、Python、Ruby 或 Java 调用 Proa。

与你现有的应用并行运行

将一个路由代理到 Proa,其余保留在 Next.js 或 Rails 上,然后在生产环境中比较延迟和成本。

默认安全

自动转义输出、跨源请求保护、安全标头和固定上游代理都是框架层面的一部分。

编译时的可访问性

WCAG 和 WAI-ARIA 检查在 cargo build 期间运行,因此常见的标记缺陷会在部署前失败。

评论

多数人对这个用 Rust 实现的极简 JavaScript 服务端渲染方案 Proa 感到兴奋和好奇,认可它让老式服务端渲染与现代工具链结合,并表示愿意尝试或用于实验;分歧主轴是少数人认为它虽高效却只是重复造轮子,并未解决紧迫问题,且缺少与静态文件或现有框架的对比基准,社区能否快速形成将决定其存亡。

认可其复兴服务端渲染与极简 JavaScript 的取向

  • 认为它让老派服务端渲染和基础 Web 组件以现代方式回归,令人耳目一新,值得尝试(较多人)
  • 赞赏极简 JavaScript 与范围把控得当,可能用于未来项目或下一次实验(较多人)
  • 表示这类项目点燃了对 Rust 的好奇心,产生“怕错过”的尝试冲动(较多人) > 这些项目真的点燃了我对 Rust 的好奇心,是时候试试看了,怕错过的感觉太强了(@trnvll)

质疑付费 Pro 组件的意义,更希望有捐赠入口

  • 觉得 Pro 组件没必要,因为人们完全可以靠氛围编程克隆出替代品,现在更愿意看到一个捐赠按钮(少数人) > 既然人们反正会用氛围编程克隆,为什么还要 Pro 组件?我现在更希望有个捐赠按钮(@egeozcan)

要求给出性能对比、API 设计理由和部署数据

  • 想知道 Proa 为何比 Dioxus、Leptos、Topcoat 等现有 Rust 框架快很多,要求给出要点说明(较多人)
  • 疑问 fn render 为何需要可变借用 WebContext,以及 HTML 与 Markdown 两套视图能否互相推断(较多人)
  • 关心在低配机器上 CI/CD、构建和部署耗时,希望部署体验显著优于 React 生态,从而愿意放弃 React(较多人) > 能否给我一个它为何比 Dioxus、Leptos、Topcoat 等现有 Rust 框架快那么多的要点说明(@lwhsiao)

感叹 Rust Web 框架过多导致选择瘫痪

  • 虽然觉得众多 Rust Web 框架涌现令人兴奋,但 loco、topcoat、proa 以及 actix、rocket、axum 等让人完全无法抉择(少数人) > 现在想用 Rust 做东西,至少有 loco、topcoat 和 proa 三个完整框架,还有 actix、rocket、axum……选择完全瘫痪了(@farmeroy)

认为它是重复造轮子且未解决紧迫问题

  • 认为其统一模型带来的维护优势在大语言模型时代并不高摩擦(可用 CI/CD 或 TDD 解决),速度对简单渲染任务也并非瓶颈,整体虽是高效代码库,却有点非我发明综合征,也就是在重复造轮子,没解决特别紧迫的问题(少数人)
  • 断言除非社区迅速形成,否则项目可能会消亡,并希望拿 binserve 提供静态文件服务做基准对比(少数人) > 整体是个不错的高效代码库,但有点患上非我发明综合征,也就是重复造轮子,没解决什么特别紧迫的问题;除非社区快速形成,否则可能会消亡(@contingencies)

有价值的补充

  • 有讨论将 Proa 的定位拆解为:支持 chat、web、markdown 多目标输出,面向人类与机器人双受众,并以“速度”和“统一模型”为核心卖点(@contingencies)