Tauri
Tauriとは
Tauri は、画面をWeb技術で書き、OS寄りの処理を [[Rust]] で書くデスクトップアプリの枠組みです。[[Electron]] と目的は同じですが、ブラウザエンジンを同梱しない点が決定的に違います。
| Electron | Tauri | |
|---|---|---|
| 画面の描画 | 同梱した Chromium | OS内蔵のWebView(Windows は WebView2、macOS は WKWebView) |
| OS側の処理 | Node.js | Rust |
| 配布サイズ | 数十MB〜 | 数MB〜 |
| 表示の一貫性 | どのOSでも同じエンジン | OSごとにエンジンが違う |
配布サイズが小さいのは、ブラウザエンジンを持ち歩かずOSに既にあるものを借りるからです。その代償として、表示や対応機能がOSのWebViewの版に左右されます。
フロントエンドとRustの分担
画面側は通常のWebアプリです。[[React]] や Vue で書き、[[Vite]] で開発サーバーを立て、ビルド成果物を Tauri が読み込みます。フロントエンドのコードはWeb版とほぼ共有できます。
OSの機能に触れる処理は Rust 側に command として定義し、フロントエンドから名前で呼びます。
#[tauri::command]
fn read_note(path: String) -> Result<String, String> {
std::fs::read_to_string(path).map_err(|e| e.to_string())
}
import { invoke } from '@tauri-apps/api/core'
const text = await invoke<string>('read_note', { path: '/tmp/a.md' })
フロントエンドは Rust の関数を直接呼べません。 invoke を通した明示的な窓口だけが公開され、それ以外のOS機能には届きません。Electron の preload + contextBridge と同じ「最小権限の窓口を用意する」設計です。加えて Tauri では、使う機能を設定ファイルの許可リストで宣言する必要があります。
Rust側の構成
時間のかかる処理(ファイル走査・HTTP通信)は [[tokio(非同期ランタイム)]] 上の非同期タスクとして走らせ、UIを止めないようにします。command を async fn にすると、その呼び出しはランタイムのタスクとして扱われます。
規模が大きくなったら [[Cargoワークスペース構成]] でドメインロジックを別クレートへ切り出します。UIに依存しないコアはテストが速く、将来CLI版を足すときも再利用できます。
repo/
├─ src/ # フロントエンド(React + Vite)
├─ crates/core/ # ドメインロジック。UIやOSに依存しない
└─ src-tauri/ # Tauri層。command の定義とウィンドウ設定
選ぶときの判断材料
- 配布サイズ・メモリを抑えたい — Tauri が有利。常駐するツールほど差が効く
- どのOSでも同じ描画を保証したい — Electron が有利。TauriはOSのWebView差を検証する手間がかかる
- Node.jsの資産(npmのネイティブモジュール)を使いたい — Electron が有利
- 重い処理をネイティブ速度で回したい — Tauri が有利。Rust側で完結する
初学者向けポイント
- 開発には Rust のツールチェーンとOS側のビルド依存(WebView2・Xcode Command Line Tools など)が要ります。画面だけ書く場合でも環境構築は Rust 側から始まります
invokeの引数はキャメルケースで渡し、Rust側はスネークケースで受けます。名前が合わずに「コマンドが見つからない」となるのはよくある詰まりどころです- 画面のコードはWebアプリそのものなので、[[Vite]] の開発サーバーでブラウザに出しながら作り、OS連携が要る段階で Tauri のウィンドウに切り替えると速く進みます
関連技術とのつながり
- [[Rust]] — OS寄りの処理を書く言語。所有権の規則がそのまま安全性になる
- [[Electron]] — 同じ目的の先行フレームワーク。エンジン同梱の有無が最大の違い
- [[React]] — 画面側に載せるWebアプリ本体
- [[Vite]] — フロントエンドの開発サーバーとビルドに使う
- [[tokio(非同期ランタイム)]] — UIを止めずにファイル走査やHTTP通信を行う土台
- [[Cargoワークスペース構成]] — コアロジックとTauri層を別クレートへ分ける
Q: TauriがElectronより配布サイズを小さくできる理由はどれ?
- [ ] JavaScriptを使わずRustだけで書くから
- [x] ブラウザエンジンを同梱せず、OS内蔵のWebViewを使うから
- [ ] 画面を画像として事前に生成しているから
解説: Chromiumを持ち歩かない代わりにOSのWebViewを借ります。その分、OSごとのエンジン差を検証する必要が出ます。
Q: Tauriでフロントエンドからファイル読み込みを行う方法はどれ?
- [ ] フロントエンドから直接Rustの関数を呼ぶ
- [x] Rust側に `command` を定義し、`invoke` で名前を指定して呼ぶ
- [ ] WebViewの設定でファイルシステムを全面的に許可する
解説: 公開された `command` だけが窓口になります。最小権限の考え方はElectronのpreload + contextBridgeと同じです。
Q: 「どのOSでも同じ見た目を保証したい」要件で有利なのはどれ?
- [x] Electron(同梱したChromiumで描画するため)
- [ ] Tauri(OSごとのWebViewで描画するため)
- [ ] どちらも同じ
解説: Tauriは描画をOSのWebViewに任せるため、OSと版によって差が出ます。一貫性を最優先するならElectronが向きます。