mcpField
O
optimizing-tauri-binary-size

optimizing-tauri-binary-size

github.com/dchuk开发36167 次安装40 周前更新
代码仓库

关于 optimizing-tauri-binary-size

面向 Tauri 开发者的生产构建优化指南,重点介绍如何缩减 Rust 二进制文件与前端资源体积,并说明配置、检查方法和优化取舍。

主要功能

  1. 01Rust 发布配置调优
  2. 02精简 Tauri 命令与功能
  3. 03前端资源缩减建议
  4. 04构建与二进制大小检查
  5. 05优化取舍说明

适用场景

  1. 01缩减生产版 Tauri 应用体积
  2. 02检查发布配置
  3. 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 从设计之初就致力于生成精简的二进制文件:

  1. 原生 Webview:使用操作系统的原生 Webview,而不是捆绑 Chromium(与 Electron 不同)
  2. Rust 后端:编译为高效的原生代码,无运行时开销
  3. 摇树优化:只包含实际使用的代码
  4. 无 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-units1降低并行度,但允许 LLVM 执行更好的全程序优化
ltotrue、"thin"、"fat"链接时优化;true 或 "fat" 可生成最小的二进制文件
opt-level"s"、"z"、"3""s" 平衡大小与速度,"z" 优先考虑大小,"3" 优先考虑速度
panic"abort"移除 panic 处理程序代码,减小二进制文件大小
striptrue、"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 优化,但前端包大小也会影响最终应用:

  1. 使用打包工具:使用 Vite、webpack 或类似工具,并启用摇树优化
  2. 代码拆分:按需加载功能
  3. 精简依赖项:审查并移除未使用的 npm 包
  4. 压缩资源:优化图片和其他静态资源

构建命令

标准发布构建
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更小相近无影响

故障排除

二进制文件仍然很大
  1. 检查是否为调试构建:确保使用 --release 标志
  2. 审查依赖项:运行 cargo tree 查看依赖关系图
  3. 检查是否存在重复依赖项:同一个 crate 的不同版本
  4. 确认 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