2025 年 3 月 26 日:
- 正在构建Scour,这是一个个性化内容推送,能从嘈杂的源中筛选出优质内容,用 Rust 编写,速度快。
- 评估后选定一些关键框架和库,发现有人将其写成“栈”,即"mash 🥔 stack"。
- 服务器端渲染 HTML:Scour 使用服务器端渲染 HTML 而非前端框架,原因是浏览器渲染 HTML 快,且 Scour 不需要大量复杂交互,遵循“不必需则不添加”原则,受 BearBlog 启发,HTML 模板简单、可靠、快速。
- HTML 模板选项:需要模板库,Rust 有多种选择,主要决策是模板在编译时还是运行时评估,以及在 Rust 源代码还是单独文件中。最初选
askama
,后因开发体验不佳而寻找替代,最终选择Maud,它是在 Rust 源代码中编写 HTML 模板的宏,格式简洁,能轻松将 Rust 值插入模板,控制结构也很直观,部分模板可复用。 - Axum - “人机工程学和模块化 Web 框架”:由 Tokio 团队构建的流行 Web 框架,使用带有提取器的函数声明式解析 HTTP 请求,示例展示了构建带有多个路由的路由器,包括处理 POST 请求和返回 JSON 响应的路由,提取器能轻松解析 HTTP 体、路径和查询参数并转换为 Rust 结构体,与其他库配合良好。
- SQLx - “Rust 的异步 SQL 工具包”:每个命名栈都需要持久层,SQLx 用于处理 SQLite、Postgres 和 MySQL,可通过派生
FromRow
trait 映射数据库行和 Rust 类型,实际中常将数据库类型与服务器 API 类型分离,但容易定义From
实现进行映射。 - HTMX - “用于 HTML 的高性能工具”:使能使用少量 HTML 属性构建较交互性网站,控制发送 HTTP 请求和处理响应,自身是 JavaScript 库,但网站常避免直接使用自定义 JavaScript,示例展示按钮点击发送 AJAX 请求并替换自身,其优雅之处在于从 HTML 表单和链接的基本行为出发进行泛化,使得无需编写自定义 JavaScript 即可构建更交互性网站,且与其他语言后端配合良好。同时强调 HTMX 只需加载一次,后续访问只需加载 HTML 以加快页面加载速度。
MASH 栈协同效应:
- 提到与
askama
对比时在重用基于用户登录状态的基础模板方面的困扰,以及 David Pedersen 在 Reddit 上的相关回复,通过创建PageLayout
结构体作为 Axum 提取器并提供render
方法来解决,使基础模板可自动访问请求所需组件。 - Maud 的
Markup
可直接返回给 Axum 路由,实现方便。 - HTMX 的Preload 扩展与设置缓存响应头的中间件配合良好,可确保浏览器在请求变化时有正确的缓存行为,
axum-htmx
crate 包含 Axum 提取器和响应器,方便处理 HTMX 相关头部。
- 提到与
MASH 不太好的部分:
- 编译时间是 Rust 开发的常见抱怨,在开发中使用Bacon和
tower-livereload
来加快前端更改的反馈速度,可通过将代码拆分为小 crate 来降低编译时间,Maud 有未合并的 PR 可实现更新模板无需重新编译。 - HTMX 在通过交换后端发送的 HTML 块构建交互性时,有时感觉过于繁琐,例如Click To Edit示例,用户需获取后端的表单组件并替换按钮,感觉不优雅,一些用户会结合其他技术处理。
- 编译时间是 Rust 开发的常见抱怨,在开发中使用Bacon和
- 结论:如果用 Rust 构建网站,可尝试 MASH 栈,Maud 使用愉快,Axum 和 SQLx 优秀,HTMX 提供新的前端思路,但不确定是否推荐给所有 Web 开发者,已在r/rust、r/htmx和Hacker News上讨论,未注册 Scour 的可尝试并反馈,标签为#rust #scour。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。