Tauriの基礎 - アーキテクチャ

提供: MochiuWiki : SUSE, EC, PCB

2026年3月3日 (火) 14:56時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Tauriは、Rustをバックエンドとし、Webテクノロジー (HTML, CSS, JavaScript) をフロントエンドとして使用するクロスプラットフォームアプリケーション開発フレームワークである。<br> デスクトップ (Windows, MacOS, Linux) と モバイル (iOS, Android) の両プラットフォームに対応している。<br> <br> Tauriの最大の特徴は、システムのネイティブWebViewを活用する…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

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の比較
項目 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-devbuild-essentiallibssl-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読み取り / 書き込みに対応している。