Dioxus 全栈产品运行一年:好的和痛苦的
在 Dioxus 全栈产品运行的一年后,Rust 代码是我业务中最乏味的部分。持续集成是最令人兴奋的部分,而且并非好事:在 GitHub 托管的运行器上,发布构建需要 90 分钟。那一年始于我之前的工作并持续在我自己的产品上。今年四月我写过关于我为什么选择 Rust 用于生产微型 SaaS 的文章。简短的版本是:开始时较慢,以后使用成本较低。此文章就是这段时间的账单。我运行的 SeggWat 是一个用于 SaaS 产品的应用内反馈工具。它的仪表盘是一个 Dioxus 0.7 全栈应用,位于一个 Cargo 工作区内:一个带有服务器函数的后端 crate,一个身份验证 crate,以及大约十个覆盖见解、反馈、想法、板、组件和设置的用户界面 crate。十二个 crate 依赖 dioxus。所有的内容都配置在 PostgreSQL 上。infra.page 建立在相同的技术栈上。“全栈”的意思是一个 Rust 代码库完成三项工作。它在服务器上渲染,作为后端运行服务器函数,并将客户端编译为 WebAssembly,使页面变得互动。好处是:一种语言,贯穿始终。数据库查询、业务规则、服务器函数、按钮:全是 Rust。一个工具链,一个格式化工具,一套习惯,出现问题时查看的地方。当你是一个独立创始人,同时处理几个产品时,这听起来微不足道。我没有一个“前端思维”和一个“后端思维”,无需各自热身。我打开工作区,继续前进。两侧的类型相同。这是我最想念的部分。一个结构体只需定义一次。数据库层返回它,服务器函数发送它,组件渲染它。当我重命名一个字段时,cargo check 会给我一份列出所有出错地方的列表,包括用户界面。不存在需要重新生成的 OpenAPI 规范,也没有与后端不同步的 TypeScript 接口。成功不在于更快地编写代码,而在于无畏的重构,深夜时分,没人来审查。 门户被保持开放。Dioxus 可以从同一个组件模型同时支持桌面和移动设备,包括 iOS。今天我所有的产品都不需要本地应用。但是,当我决定把一年的工作放在哪里时,知道我可以在不重写的情况下发布一个是很重要的。生产是乏味的。这就是整个意义。一旦编译,它基本上只需运行。所有一类“未定义不是一个函数”的错误永远不会到达用户,因此,最终通过的错误是逻辑错误。这是我更愿意关注的地方。“生产中的乏味”这一论点从四月开始获得了实际用户的支持。痛苦之处在于:编译时间。这是 Rust 宣传者往往会跳过的部分。仪表盘编译两次:一次用于服务器,一次用于用于浏览器的 wasm32。十几个 Dioxus crate 加上重宏的用户界面总和。就本地来说,在一台不错的机器上尚可忍受。持续集成是另一回事,我工作流文件中的评论就像是日记:WASM 构建仅在 6 核心上大约需要 22 分钟。这是一个单一的叶子 crate:为浏览器编译的仪表盘。发布映像在 GitHub 托管的 2 核心运行器上大约需要 90 分钟。在我自己的 VPS 运行器上约为 40 分钟,这是比较好的版本。 Clippy 被 OOM 杀死。 cargo clippy --workspace --all-targets 在 7 GB 的托管运行器上以退出代码 143 结束,没有任何诊断。解决方案是一个 10 GB 的交换文件,加上 CARGO_BUILD_JOBS=1 来减少峰值内存。我的代码分析工具需要交换。在某个时候,我停止了在每次推送到主分支时构建镜像。现在它们仅在发布标签上构建,或当我手动触发时,因为每次推送 90 分钟的费用是浪费钱的方式。 我尝试的包括用 Swatinem/rust-cache 进行缓存。它有帮助,但也有一个陷阱。工作流程运行只能从其自己的引用或默认分支恢复缓存,而 GitHub 会在 7 天未使用时废弃缓存。一旦我停止在主分支上构建,发布构建就开始冷启动。我的解决方法几乎让人发笑:在依赖版本提升后,我手动在主分支上触发构建,只是为了保持缓存温热。一气呵成的构建和测试,因此测试重用编译的工件,而不是第二次编译整个世界。模具链接器。不错,但链接从来不是瓶颈。编译才是。我为重构构建了一个自托管的运行器。这无疑是最大的收获,从 90 分钟减少到 40 分钟。这也意味着我现在需要维护一个构建服务器。这些都有帮助,但没有改变基础的计算:两个编译目标,一个大的依赖树和很多宏意味着很多编译。“全 Rust”带来了一个附注。业务逻辑全部是 Rust,而边缘部分则不是。SeggWat 的见解页面显示图表,我无法找到我在生产中信任的 Rust 图表库。因此图表使用 Chart.js,从 CDN 加载并用大约 340 行 JavaScript 包装,Dioxus 通过 dioxus-use-js 调用。样式使用 Tailwind,因此持续集成还安装 Bun 并在 Rust 启动之前运行 Tailwind CLI。我对此没意见。这是务实的。
阅读全文 →本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡