optimizing-tauri-binary-size について
Tauri アプリを本番向けにビルドする開発者のための最適化ガイドです。Rust バイナリとフロントエンドのサイズ削減に向けた設定、確認方法、トレードオフを扱います。
主な機能
- 01Rust リリースプロファイルの調整
- 02Tauri コマンドと機能の整理
- 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:Chromium をバンドルする代わりに、オペレーティングシステムのネイティブ WebView を使用します(Electron とは異なります)。
- Rust バックエンド:ランタイムのオーバーヘッドなしで、効率的なネイティブコードにコンパイルします。
- ツリーシェイキング:実際に使用されるコードのみを含めます。
- V8 エンジンなし:JavaScript エンジンをバンドルするのではなく、既存のシステムコンポーネントを活用します。
サイズの比較
| フレームワーク | 最小バイナリサイズ |
|---|---|
| Tauri | ~3-6 MB |
| Electron | ~120-180 MB |
| NW.js | ~80-100 MB |
サイズに大きな差があるのは、ブラウザーエンジン全体をバンドルするのではなく、システムのネイティブ WebView を使用するという Tauri のアーキテクチャ上の選択によるものです。
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" | パニックハンドラーのコードを削除し、バイナリサイズを小さくします |
strip | true、"symbols"、"debuginfo" | バイナリからシンボルとデバッグ情報を削除します |
Nightly ツールチェーンのオプション
Nightly Rust ツールチェーンを使用するプロジェクトでは、追加の最適化を利用できます。
[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を実行して依存関係グラフを確認してください。 - 重複した依存関係がないか確認します。同じクレートの異なるバージョンが使われている場合があります。
- strip が機能していることを確認します。
fileコマンドを使用してデバッグシンボルの有無を確認してください。
LTO によるビルドの失敗
lto = true が原因でビルドに失敗する場合:
- 代替として
lto = "thin"を試してください - 十分なメモリを確保してください(LTO はメモリを大量に消費します)
- Rust ツールチェーンを最新バージョンに更新してください
Nightly 機能が動作しない場合
nightly がインストールされ、有効になっていることを確認してください:
rustup install nightly
rustup default nightly
# Or use +nightly flag with cargo commands