概要
Tauriは、Rustをバックエンドとし、Webテクノロジー (HTML, CSS, JavaScript) をフロントエンドとして使用するクロスプラットフォームアプリケーション開発フレームワークである。
デスクトップ (Windows, MacOS, Linux) と モバイル (iOS, Android) の両プラットフォームに対応している。
Tauriの最大の特徴は、システムのネイティブWebViewを活用することで、最小600[KB]未満という極めて小さなバイナリサイズを実現していることである。
これは、Chromiumをバンドルする必要があるElectron等の従来フレームワークと比較して、大幅な軽量化を実現している。
フロントエンドには、React、Vue、Svelte等のモダンなフレームワークを使用でき、TypeScriptによる型安全な開発もサポートされている。
バックエンドはRustで実装されるため、メモリ安全性と高いパフォーマンスを両立している。
Electronとの比較
下表に、TauriとElectronの主な違いを示す。
| 項目 | Tauri | Electron |
|---|---|---|
| バイナリサイズ | 600[KB]未満 | 100[MB]以上 |
| メモリ使用量 | OSネイティブのWebViewを再利用 | Chromiumインスタンスを内包 |
| セキュリティ | Rustのメモリ安全性、権限システム | Node.js統合によるリスク |
| パフォーマンス | Rustネイティブ、LLVM最適化 | V8エンジン + Node.js |
| バックエンド言語 | Rust | JavaScript / TypeScript |
| WebView | OSネイティブのWebView使用 | Chromiumバンドル |
詳細比較
| 項目 | Tauri | Electron |
|---|---|---|
| 起動時間 | 高速 (ネイティブコード) | 中程度 (V8起動オーバーヘッド) |
| CPU使用率 | 低い (Rust最適化) | 高い (Chromiumレンダリング) |
| ディスク容量 | 小さい (数[MB]) | 大きい (150[MB]以上) |
| 開発体験 | Rust + Web (学習曲線あり) | JavaScript全体 (低学習曲線) |
| エコシステム | 成長中 (v2で拡充) | 成熟 (豊富なリソース) |
| マルチプラットフォーム | デスクトップ + モバイル | デスクトップのみ |
アーキテクチャ
Tauriのアーキテクチャは、Core ProcessとWebView Processの2つの主要コンポーネントで構成されている。
Core Process
Core ProcessはRustで実装され、オペレーティングシステムへの完全なアクセス権を持つ。
主な役割は以下の通りである。
- ウインドウ管理
- アプリケーションウインドウの作成、制御、破棄を担当する。
- TAOライブラリを使用してクロスプラットフォームな実現を実現している。
- IPC通信管理
- フロントエンドとバックエンド間のプロセス間通信を管理する。
- システムAPIアクセス
- ファイルシステム、データベース、ネットワーク等のOS機能へのアクセスを提供する。
- セキュリティ制御
- 権限システムによる機能へのアクセス制御を行う。
状態管理
Core Processでは、アプリケーション全体の状態を管理できる。
use tauri::State;
use std::sync::Mutex;
struct AppState {
counter: Mutex<i32>,
}
#[tauri::command]
fn increment_counter(state: State<AppState>) -> i32 {
let mut counter = state.counter.lock().unwrap();
*counter += 1;
*counter
}
fn main() {
tauri::Builder::default()
.manage(AppState { counter: Mutex::new(0) })
.invoke_handler(tauri::generate_handler![increment_counter])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
WebView Process
WebView Processは、オペレーティングシステムが提供するネイティブWebViewを使用してUIをレンダリングする。
- Windows
- WebView2 (Chromiumベース) を使用する。
- MacOS
- WKWebView (WebKitベース) を使用する。
- Linux
- webkitgtk (WebKitベース) を使用する。
- iOS
- WKWebView (WebKitベース) を使用する。
- Android
- WebView (Chromiumベース) を使用する。
セキュリティの推奨事項
- CSP (Content Security Policy) の設定
tauri.conf.jsonでCSPを設定し、外部リソースの読み込みを制限する。
- リモートコンテンツの検証
- 外部APIとの通信はCore Process経由で行い、WebViewから直接アクセスさせない。
- 入力値の検証
- ユーザ入力は必ずCore Process側で検証する。
通信方法 (IPC)
Core ProcessとWebView Process間の通信には、以下に示すの3つの方法が提供されている。
invoke関数
フロントエンドからバックエンドのコマンドを呼び出すための非同期関数である。
- Rust側
#[tauri::command] fn greet(name: &str) -> String { format!("Hello, {}!", name) } fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!()) .expect("error while running tauri application"); }
- TypeScript側
import { invoke } from '@tauri-apps/api/core'; async function greetUser(name: string): Promise<string> { return await invoke<string>('greet', { name }); }
イベントシステム
プロセス間でイベントを送受信するためのPub / Subパターンを提供する。
- Rust側からのイベント送信
use tauri::Manager; #[tauri::command] fn send_notification(app: tauri::AppHandle, message: String) { app.emit("notification", message).unwrap(); }
- TypeScript側でのイベント受信
import { listen } from '@tauri-apps/api/event'; const unlisten = await listen<string>('notification', (event) => { console.log('Received:', event.payload); });
チャンネル
Tauri v2で導入された機能で、ストリーミングデータの送受信に最適化されている。
use tauri::ipc::Channel;
#[tauri::command]
async fn stream_data(channel: Channel<String>) -> Result<(), String> {
for i in 0..10 {
channel.send(format!("Message {}", i)).map_err(|e| e.to_string())?;
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
}
Ok(())
}
TAOとWRY
Tauriは、ウインドウ管理とWebViewレンダリングにそれぞれTAOとWRYというライブラリを使用している。
- TAO
- クロスプラットフォームなウインドウ管理ライブラリ
- ウインドウ作成、イベント処理、メニュー管理、トレイアイコンをサポートする。
- WRY
- クロスプラットフォームなWebViewレンダリングライブラリ
- WebView初期化、JavaScript実行、カスタムプロトコル、IPCブリッジを提供する。
対応プラットフォーム
デスクトップ
- Windows
- Windows 7以降 (WebView2ランタイム必要)
- Windows 10以降はWebView2が標準搭載
- 配布形式: NSIS、WiX、Microsoft Store
- MacOS
- MacOS 10.13 (High Sierra) 以降。WKWebView (WebKitベース) を使用
- 配布形式: DMG、App Bundle、Mac App Store
- Linux
- 主要なディストリビューション (Ubuntu 18.04以降、Fedora、Debian、Arch等)
- 依存パッケージ: libwebkit2gtk-4.1-dev、build-essential、libssl-dev 等
- 配布形式: AppImage、Deb、RPM、Snap
モバイル
Tauri v2からモバイルプラットフォームの正式サポートが追加された。
- iOS
- iOS 12.2以降、Xcode 15以降、MacOS必須
- WKWebView (WebKitベース) を使用
- 配布形式: App Store、TestFlight
- Android
- Android 5.0 (API 21) 以降、Android Studio、JDK 17以降、Android SDK必要
- 配布形式: Google Play Store、APK、AAB
セキュリティ
Rustのメモリ安全性
- バッファオーバーフロー防止
- Rustは配列アクセスの境界チェックを行うため、バッファオーバーフローが発生しない。
- ヌルポインタ回避
Option型 とResult型により、ヌルポインタの安全な処理が可能である。
- データ競合防止
- 所有権システムにより、マルチスレッド環境でのデータ競合をコンパイル時に検出する。
セキュリティ監査
Tauriは定期的に外部のセキュリティ企業による監査を受けている。
v1 (2022年) と v2 (2024年) で包括的な監査を実施し、重大な脆弱性は発見されていない。
v2の権限システム
Tauri v2では、従来のallowlist方式から、より柔軟で強力な権限システムへと変更された。
Permissions
個々の機能に対するアクセス許可を定義する。
{
"identifier": "fs:read",
"windows": ["main"],
"permissions": ["core:path:default", "fs:allow-read-text-file"]
}
Scopes
アクセス可能なリソースの範囲を制限する。
{
"identifier": "fs:scope",
"allow": [{ "path": "$APP/**" }],
"deny": [{ "path": "$APP/secret/**" }]
}
Capabilities
アプリケーション全体の権限設定を一元管理する。
{
"identifier": "default",
"windows": ["main"],
"permissions": ["core:default", "core:window:default", "fs:default", "shell:allow-open"]
}
Tauri v2の主な変更点
セキュリティシステム刷新
従来のallowlist方式から、より柔軟で強力な権限システム (Permissions, Scopes, Capabilities) へと変更された。
詳細な設定方法は、セキュリティセクションを参照のこと。
モバイル対応の正式サポート
iOSとAndroidの正式サポートが追加され、単一のコードベースからデスクトップとモバイルの両方に対応するアプリケーションを構築できるようになった。
コアプラグイン名前空間
コアプラグインにはcore:プレフィックスが必須となった。
例: 変更前fs変更後core:fs
最適化オプション
removeUnusedCommands オプションが追加され、使用されていないコマンドをビルド時に削除することにより、
バイナリサイズをさらに最適化できるようになった。
移行方法 =
v1からv2への移行は、npx @tauri-apps/cli migrate コマンドで自動的に行える。
権限設定の更新、プラグイン名の更新 (core:プレフィックス追加)、APIの更新が必要である。
Cargo最適化設定
リリースビルド時の最適化設定を Cargo.toml ファイルに追加することにより、バイナリサイズを大幅に削減できる。
[profile.release]
codegen-units = 1
lto = true
opt-level = "s"
panic = "abort"
strip = true
- codegen-units = 1
- より良い最適化を有効にする。
- より良い最適化を有効にする。
- lto = true
- Link Time Optimizationを有効にする。
- opt-level = "s"
- バイナリサイズの最適化を優先する。
- panic = "abort"
- パニック時のスタックアンワインドを無効にする。
- strip = true
- デバッグシンボルを削除する。
公式プラグイン
Tauriは、公式プラグインを通じて機能を拡張できる。
ファイルシステム
- fs
- ファイルの読み書き、ディレクトリ操作を行う。
- 安全なスコープ設定によりアクセス可能なパスを制限できる。
データベース
- sql
- SQLite、MySQL、PostgreSQL等のデータベースに接続する。
- 非同期APIによる高性能なデータアクセスを提供する。
ネットワーク
- http
- HTTPリクエストを送信する。
- CORS制約を回避し、ネイティブなHTTPクライアントとして動作する。
通知
- notification
- OSの通知システムを使用して通知を送信する。
- 全プラットフォームに対応している。
アップデート
- updater
- アプリケーションの自動更新機能を提供する。
- 署名検証による安全な更新をサポートする。
セキュリティ
- biometric
- 生体認証 (指紋、顔認証) を使用する。
- iOS、Android、Windows Hello、MacOS Touch IDに対応
- stronghold
- 暗号化されたデータストアを提供する。
- パスワードや機密データを安全に保存できる。
ハードウェア
- nfc
- NFC (近距離無線通信) 機能を使用する。
- iOSとAndroidのNFC読み取り / 書き込みに対応している。