人人都会AI编程

19.2 Rust 编译优化

更新时间:2026-07-11

在 Tauri 项目中,Rust 代码负责核心逻辑,编译速度与最终二进制大小直接影响开发体验和用户下载更新。通过合理配置,可以在不牺牲安全性的前提下,让编译更快、包体更小。


1. 加快编译速度

Rust 的编译速度通常比前端打包慢,尤其在依赖较多时。以下配置能让迭代更快:

# Cargo.toml
[profile.dev]
opt-level = 1        # 开发模式下做轻度优化,编译时间比默认的 0 稍长,但运行时更快
incremental = true   # 启用增量编译,修改少量代码后只重编译变化的部分

[profile.release]
lto = "thin"         # 使用 ThinLTO(链接时优化),比 full LTO 快得多,也能减小体积
codegen-units = 16   # 增大代码生成单元数量,利用多核并行编译,加快发布构建速度
  • opt-level = 1:相比默认的 0 级(完全不优化,编译最快但运行极慢),1 级做了一些简单优化,运行时性能明显改善,而且编译时间增加很小。这对 Tauri 开发中频繁重启应用很有帮助。
  • incremental:默认开启,能大幅减少重复编译时间。如果因为某些原因关闭了,记得重新打开。
  • codegen-units:发布构建时默认是 16,开发模式下可保持不变。如果遇到链接错误或想进一步优化体积,可以降低到 1(但编译会变慢很多)。

IDE 与工具链
使用 RustRover、VS Code + rust-analyzer 时,可设置 "rust-analyzer.cargo.features": "all" 避免重复分析。同时确保使用最新稳定版 Rust 工具链,编译器性能本身也在持续提升。


2. 减小最终二进制体积

Tauri 应用里,Rust 内核加上 WebView 壳是体积的主要组成。WebView 由系统提供,我们能优化的是 Rust 编译产物。

[profile.release]
opt-level = "s"       # 优化体积,而不是速度。"s" 和 "z" 可进一步压缩,"z" 更激进
lto = true            # 启用链接时优化,有利于死代码消除和内联
strip = true          # 去除符号表等调试信息,体积能减少 30%-50%
codegen-units = 1     # 单代码生成单元让 LTO 更彻底,但编译时间显著增加
panic = "abort"       # 发生 panic 时直接终止,不生成栈展开代码,可减小编译结果

分步建议(平衡体积与编译时间):

  1. 默认加入 strip = true:几乎无编译时间成本,体积立减。
  2. opt-level 设为 "s":常见 crate 测试表明,从 3 降到 "s" 能减少 10-30% 体积,性能损失通常可接受(对桌面应用 GUI 操作几乎无感)。
  3. 谨慎使用 codegen-units = 1lto = true:会显著增加编译时间(可能翻倍),建议只在 CI 最终发布构建时开启。日常迭代可用 lto = "thin"codegen-units = 16
  4. panic = "abort":若你的 Rust 后端不依赖 unwind 来捕获 panic,可安全使用。Tauri 本身对 panic 做了捕获处理,不会让整个应用崩溃,开启 abort 可缩小体积且不影响基本行为。

第三方库裁剪

  • 仔细检查 Cargo.toml 中是否启用了不必要的 feature,例如很多 crate 的默认 feature 可能包含 serde 的 derive 宏,若不需要可关闭。
  • 使用 cargo-udeps 找出未使用的依赖并移除。
  • 替换过于庞大的依赖:如需要小 JSON 解析,可用 miniserde 替代 serde_json

3. 减少 Rust 依赖对 Tauri 打包的影响

Tauri 的二进制最终会被嵌入到各个平台安装包中。在 Windows 上,.exe 本身的大小就是 Rust 二进制大小;在 macOS 和 Linux 上,还包含框架和资源文件,但 Rust 部分仍是主体。

  • 开启 strip 后,一个小型 Tauri 应用的 Rust 内核大约在 1~4 MB,加上 WebView 壳和前端资源,总体安装包仍能保持在 10 MB 以内。
  • 对比:若不开任何体积优化,同样功能的 Rust 内核可能膨胀到 10 MB 以上。

一次典型优化后的 Cargo.toml 示例

[profile.release]
opt-level = "s"
lto = true
strip = true
codegen-units = 1
panic = "abort"

一句话总结:开发期间追求编译速度,用 opt-level = 1、增量编译、多 codegen-unit;发布时追求体积,用 opt-level = "s"ltostrippanic = "abort",并清理多余依赖。这样在数分钟内就能完成优化,换来用户下载和更新时的小体积惊喜。