mcpField
O
optimizing-tauri-binary-size

optimizing-tauri-binary-size

github.com/dchuk開発36167 回インストール40 週間前に更新
リポジトリ

optimizing-tauri-binary-size について

Tauri アプリを本番向けにビルドする開発者のための最適化ガイドです。Rust バイナリとフロントエンドのサイズ削減に向けた設定、確認方法、トレードオフを扱います。

主な機能

  1. 01Rust リリースプロファイルの調整
  2. 02Tauri コマンドと機能の整理
  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:Chromium をバンドルする代わりに、オペレーティングシステムのネイティブ WebView を使用します(Electron とは異なります)。
  2. Rust バックエンド:ランタイムのオーバーヘッドなしで、効率的なネイティブコードにコンパイルします。
  3. ツリーシェイキング:実際に使用されるコードのみを含めます。
  4. 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-units1並列処理を減らす一方で、LLVM によるプログラム全体の最適化を向上させます
ltotrue、"thin"、"fat"リンク時最適化です。true または "fat" を指定すると、バイナリサイズが最小になります
opt-level"s"、"z"、"3""s" はサイズと速度のバランスを取り、"z" はサイズを優先し、"3" は速度を優先します
panic"abort"パニックハンドラーのコードを削除し、バイナリサイズを小さくします
striptrue、"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 の最適化に重点を置いていますが、フロントエンドのバンドルサイズも最終的なアプリケーションに影響します。

  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. 重複した依存関係がないか確認します。同じクレートの異なるバージョンが使われている場合があります。
  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

参考資料

コメント