关于 optimizing-tauri-binary-size
面向 Tauri 开发者的生产构建优化指南,重点介绍如何缩减 Rust 二进制文件与前端资源体积,并说明配置、检查方法和优化取舍。
主要功能
- 01Rust 发布配置调优
- 02精简 Tauri 命令与功能
- 03前端资源缩减建议
- 04构建与二进制大小检查
- 05优化取舍说明
适用场景
- 01缩减生产版 Tauri 应用体积
- 02检查发布配置
- 03排查构建产物过大的原因
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dchuk/ claude-code-tauri-skills --skill optimizing-tauri-binary-size安装后在 Claude Code 中输入/optimizing-tauri-binary-size确认已加载。
详细介绍
Tauri 二进制文件大小优化
本指南介绍如何优化 Tauri 应用的二进制文件大小,以用于生产版本。
Tauri 为何能生成较小的二进制文件
Tauri 从设计之初就致力于生成精简的二进制文件:
- 原生 Webview:使用操作系统的原生 Webview,而不是捆绑 Chromium(与 Electron 不同)
- Rust 后端:编译为高效的原生代码,无运行时开销
- 摇树优化:只包含实际使用的代码
- 无 V8 引擎:利用现有系统组件,而不是捆绑 JavaScript 引擎
大小对比
| 框架 | 最小二进制文件大小 |
|---|---|
| Tauri | ~3-6 MB |
| Electron | ~120-180 MB |
| NW.js | ~80-100 MB |
大小差异显著,源于 Tauri 的架构选择:使用系统原生 Webview,而不是捆绑完整的浏览器引擎。
Cargo.toml 优化设置
在 src-tauri/Cargo.toml 中配置发布配置文件设置,以尽可能减小二进制文件大小。
推荐的稳定版工具链配置
[profile.release]
codegen-units = 1 # Compile crates one at a time for better LLVM optimization
lto = true # Enable link-time optimization across all crates
opt-level = "s" # Optimize for binary size (alternative: "z" for even smaller)
panic = "abort" # Remove panic unwinding code
strip = true # Strip debug symbols from final binary
配置选项说明
| 选项 | 值 | 说明 |
|---|---|---|
codegen-units | 1 | 降低并行度,但允许 LLVM 执行更好的全程序优化 |
lto | true、"thin"、"fat" | 链接时优化;true 或 "fat" 可生成最小的二进制文件 |
opt-level | "s"、"z"、"3" | "s" 平衡大小与速度,"z" 优先考虑大小,"3" 优先考虑速度 |
panic | "abort" | 移除 panic 处理程序代码,减小二进制文件大小 |
strip | true、"symbols"、"debuginfo" | 从二进制文件中移除符号和调试信息 |
Nightly 工具链选项
对于使用 Rust nightly 工具链的项目,还可以使用其他优化选项:
[profile.release]
codegen-units = 1
lto = true
opt-level = "s"
panic = "abort"
strip = true
trim-paths = "all" # Remove file path information from binary
[profile.release.build-override]
opt-level = "s" # Also optimize build scripts
你也可以设置 rustflags,以进行更多控制:
[profile.release]
rustflags = ["-Cdebuginfo=0", "-Zthreads=8"]
Tauri 构建配置
移除未使用的命令(Tauri 2.4+)
Tauri 2.4 引入了自动移除访问控制列表(ACL)中未获准命令代码的功能。在 tauri.conf.json 中添加以下配置:
{
"build": {
"removeUnusedCommands": true
}
}
此功能:
- 分析你的 ACL 配置
- 移除未获准的 Tauri 命令处理程序
- 在不改变功能的情况下减小二进制文件大小
- 在发布构建期间自动运行
最精简的功能集
在 src-tauri/Cargo.toml 中只启用实际需要的 Tauri 功能:
[dependencies]
tauri = { version = "2", features = ["macos-private-api"] }
# Avoid enabling unnecessary features like:
# - "devtools" in production
# - "protocol-asset" if not serving local assets
# - "tray-icon" if not using system tray
前端优化
本指南主要关注 Rust/Tauri 优化,但前端包大小也会影响最终应用:
- 使用打包工具:使用 Vite、webpack 或类似工具,并启用摇树优化
- 代码拆分:按需加载功能
- 精简依赖项:审查并移除未使用的 npm 包
- 压缩资源:优化图片和其他静态资源
构建命令
标准发布构建
cd src-tauri
cargo tauri build --release
使用 Nightly 工具链
cd src-tauri
cargo +nightly tauri build --release
检查二进制文件大小
构建完成后,检查二进制文件大小:
# macOS
ls -lh src-tauri/target/release/bundle/macos/*.app/Contents/MacOS/*
# Linux
ls -lh src-tauri/target/release/bundle/appimage/*.AppImage
# Windows
dir src-tauri\target\release\bundle\msi\*.msi
完整配置示例
以下是一个经过优化、可尽可能减小二进制文件大小的完整 src-tauri/Cargo.toml:
[package]
name = "my-tauri-app"
version = "0.1.0"
edition = "2021"
[dependencies]
tauri = { version = "2", features = [] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
[build-dependencies]
tauri-build = { version = "2", features = [] }
[profile.release]
codegen-units = 1
lto = true
opt-level = "s"
panic = "abort"
strip = true
[profile.release.package."*"]
opt-level = "s"
以及对应的 tauri.conf.json:
{
"productName": "my-tauri-app",
"version": "0.1.0",
"identifier": "com.example.my-tauri-app",
"build": {
"removeUnusedCommands": true,
"beforeBuildCommand": "npm run build",
"frontendDist": "../dist"
},
"bundle": {
"active": true,
"targets": "all",
"icon": ["icons/icon.png"]
}
}
优化取舍
| 设置 | 大小影响 | 构建时间 | 运行时性能 |
|---|---|---|---|
codegen-units = 1 | 更小 | 更慢 | 更好 |
lto = true | 更小 | 慢得多 | 更好 |
opt-level = "s" | 更小 | 相近 | 略慢 |
opt-level = "z" | 最小 | 相近 | 更慢 |
panic = "abort" | 更小 | 更快 | 不进行栈展开 |
strip = true | 更小 | 相近 | 无影响 |
故障排除
二进制文件仍然很大
- 检查是否为调试构建:确保使用
--release标志 - 审查依赖项:运行
cargo tree查看依赖关系图 - 检查是否存在重复依赖项:同一个 crate 的不同版本
- 确认 strip 是否生效:使用
file命令检查是否包含调试符号
使用 LTO 时构建失败
如果 lto = true 导致构建失败:
- 尝试将
lto = "thin"作为备用方案 - 确保内存充足(LTO 会占用大量内存)
- 将 Rust 工具链更新到最新版本
Nightly 功能无法使用
确保已安装并启用 nightly:
rustup install nightly
rustup default nightly
# Or use +nightly flag with cargo commands
参考资料
评论
支持 Markdown