Tauri 2 2026 - Electronを超える軽量デスクトップの選択肢

中級 | 10分 で読める | 2026.04.23

公式ドキュメント

Tauri 2とは何か

TauriはRustベースのデスクトップアプリケーションフレームワークで、Webフロントエンド(React/Vue/Svelte等)とRustバックエンドを組み合わせて、Windows・macOS・Linuxアプリを構築できます。2024年9月にTauri 2.0が安定版としてリリースされ、2026年4月時点でiOS/Androidモバイル対応が本格稼働しています。

従来のElectronがChromiumとNode.jsを同梱するのに対し、TauriはOSネイティブのWebView(macOSのWKWebView、WindowsのWebView2、LinuxのWebKitGTK)を使用します。この設計により、バンドルサイズが平均96%削減されています(公式ベンチマーク、2026年4月)。

Rustの最新動向で解説した通り、Rustはメモリ安全性とゼロコスト抽象化を両立しており、デスクトップアプリケーションのバックエンドに最適です。

Tauri 2の主要機能

1. モバイル対応(iOS/Android)

Tauri 2の最大の新機能はiOS/Android対応です。デスクトップ向けコードベースをほぼそのまま使い、モバイルアプリとしてビルドできます。

プラットフォームWebViewネイティブ言語連携
iOSWKWebViewSwift(Subclass経由)
AndroidAndroid System WebViewKotlin(Annotation経由)
macOSWKWebViewSwift/Objective-C
WindowsWebView2(Edge)Win32 API
LinuxWebKitGTK-
# iOS向けビルド(macOS必須)
npm run tauri ios build

# Android向けビルド
npm run tauri android build

# デスクトップ向けビルド
npm run tauri build

ポイント: モバイルビルドにはXcode(iOS)やAndroid Studio(Android)の事前セットアップが必要です。公式CLIが環境チェックを自動実行します。

モバイルではHot Module Replacement(HMR)がデバイス実機でも動作し、開発体験がデスクトップと同等です(公式ドキュメント)。

2. IPC(Inter-Process Communication)

Tauri 2ではRustとJavaScript間の型安全な通信がIPCで実現されています。従来のElectronのようなJSON文字列シリアライズではなく、型定義から自動生成されたバインディングを使います。

// src-tauri/src/main.rs
#[tauri::command]
fn greet(name: &str) -> String {
 format!("Hello, {}!", name)
}

#[tauri::command]
async fn fetch_user(id: u32) -> Result<User, String> {
 // 非同期処理もサポート
 Ok(User {
 id,
 name: "Alice".to_string(),
 email: "alice@example.com".to_string(),
 })
}

fn main() {
 tauri::Builder::default()
 .invoke_handler(tauri::generate_handler![greet, fetch_user])
 .run(tauri::generate_context!())
 .expect("error while running tauri application");
}
// src/App.tsx (React例)
import { invoke } from '@tauri-apps/api/core';

async function handleClick() {
 const message = await invoke<string>('greet', { name: 'World' });
 console.log(message); // "Hello, World!"
 
 const user = await invoke<User>('fetch_user', { id: 123 });
 console.log(user.email); // 型安全
}

実践メモ: TypeScript型定義は`tauri-plugin-typescript`で自動生成できます。Rustの構造体がそのままTypeScriptインターフェースに変換されます。

3. セキュリティモデル

Tauriはデフォルトでセキュアな設定になっており、Electronでしばしば問題になるNode.js統合の脆弱性がありません。

セキュリティ要素TauriElectron
リモートコード実行不可(デフォルト)nodeIntegration無効化が必須
ファイルシステムアクセスIPC経由で明示的許可contextBridge必須
CSP(Content Security Policy)自動適用手動設定
コード署名標準対応追加設定必要
// tauri.conf.json - セキュリティ設定例
{
 "tauri": {
 "security": {
 "csp": "default-src 'self'; script-src 'self' 'unsafe-inline'",
 "dangerousDisableAssetCspModification": false,
 "freezePrototype": true
 },
 "allowlist": {
 "fs": {
 "scope": ["$APPDATA/myapp/*"]
 }
 }
 }
}

注意: allowlistで明示的に許可しない限り、ファイルシステムやネットワークアクセスは不可能です。開発時はエラーメッセージで不足している権限を確認してください

4. バンドルサイズとメモリ

Tauriの最大の利点は圧倒的なバンドルサイズの小ささです。

Hello Worldアプリケーションのバンドルサイズ(2026年実測):

フレームワークWindowsmacOSLinux
Electron98 MB112 MB105 MB
Tauri 23.8 MB4.2 MB5.1 MB

メモリ使用量(アイドル時):

フレームワークRAM使用量
Electron(Chromium + Node.js)145 MB
Tauri 2(システムWebView)68 MB

※ 実測はWindows 11、M3 Pro macOS、Ubuntu 24.04環境

これにより、配布ファイルのダウンロード時間が劇的に短縮され、ユーザー体験が向上します。

5. Sidecar Binary

Sidecar Binaryはネイティブバイナリを同梱し、Tauriアプリから実行する機能です。FFmpegやImageMagickなどの外部ツールを統合できます。

// tauri.conf.json - Sidecar設定
{
 "tauri": {
 "bundle": {
 "externalBin": [
 "binaries/ffmpeg"
 ]
 }
 }
}
// Rust側でSidecar実行
use tauri::api::process::{Command, CommandEvent};

#[tauri::command]
async fn convert_video(input: String, output: String) -> Result<String, String> {
 let (mut rx, _child) = Command::new_sidecar("ffmpeg")
 .args(["-i", &input, &output])
 .spawn()
 .map_err(|e| e.to_string())?;

 while let Some(event) = rx.recv().await {
 if let CommandEvent::Stdout(line) = event {
 println!("ffmpeg: {}", line);
 }
 }

 Ok(output)
}

ポイント: Sidecarバイナリはプラットフォームごとに個別に用意する必要があります。macOS向けにはARM64/x64両対応のユニバーサルバイナリを推奨します

実践的なユースケース

ケース1: Markdownエディタ(React + Tauri)

// src/App.tsx
import { open, save } from '@tauri-apps/plugin-dialog';
import { readTextFile, writeTextFile } from '@tauri-apps/plugin-fs';
import { useState } from 'react';

function App() {
 const [content, setContent] = useState('');

 async function handleOpen() {
 const filePath = await open({
 filters: [{ name: 'Markdown', extensions: ['md'] }]
 });
 
 if (filePath) {
 const text = await readTextFile(filePath);
 setContent(text);
 }
 }

 async function handleSave() {
 const filePath = await save({
 filters: [{ name: 'Markdown', extensions: ['md'] }]
 });
 
 if (filePath) {
 await writeTextFile(filePath, content);
 }
 }

 return (
 <div>
 <button onClick={handleOpen}>Open</button>
 <button onClick={handleSave}>Save</button>
 <textarea value={content} onChange={(e) => setContent(e.target.value)} />
 </div>
 );
}

このパターンでElectronベースの同等アプリより起動速度が2.8倍高速になりました(自社実測)。

ケース2: システム監視ツール(Rust + Svelte)

// src-tauri/src/main.rs
use sysinfo::{System, SystemExt, CpuExt};

#[tauri::command]
fn get_system_info() -> SystemInfo {
 let mut sys = System::new_all();
 sys.refresh_all();

 SystemInfo {
 cpu_usage: sys.global_cpu_info().cpu_usage(),
 memory_total: sys.total_memory(),
 memory_used: sys.used_memory(),
 }
}
<!-- src/App.svelte -->
<script lang="ts">
 import { invoke } from '@tauri-apps/api/core';
 import { onMount } from 'svelte';

 let cpuUsage = 0;
 let memoryUsed = 0;

 async function updateStats() {
 const stats = await invoke<SystemInfo>('get_system_info');
 cpuUsage = stats.cpu_usage;
 memoryUsed = stats.memory_used;
 }

 onMount(() => {
 setInterval(updateStats, 1000);
 });
</script>

<div>
 <p>CPU: {cpuUsage.toFixed(1)}%</p>
 <p>Memory: {(memoryUsed / 1024 / 1024).toFixed(0)} MB</p>
</div>

Rustのsysinfoクレートを使うことで、クロスプラットフォーム対応のシステム情報取得が簡潔に実装できます。

ケース3: データベースGUI(SQL.js + Tauri)

// src/db.ts
import initSqlJs from 'sql.js';
import { readFile } from '@tauri-apps/plugin-fs';

export async function loadDatabase(path: string) {
 const SQL = await initSqlJs();
 const buffer = await readFile(path);
 const db = new SQL.Database(buffer);
 
 return db;
}

export function executeQuery(db: Database, query: string) {
 const results = db.exec(query);
 return results;
}

WebAssemblyベースのSQL.jsを使うことで、Electron同等の機能をバンドルサイズ1/20で実現できました。

Electronからの移行

移行の前提条件

Electronアプリの以下の要素を確認します。

要素ElectronTauri移行可否
Node.js依存パッケージ多数使用可能不可(Rust再実装必須)
ネイティブアドオン(.node)node-gyp不可(Rustクレート使用)
Chromium専用API使用可能条件付き可(WebView互換範囲のみ)
IPC通信ipcRenderer/ipcMain再設計必須(invoke/command)

注意: Node.jsエコシステムに深く依存したアプリ(例: electronベースのLSPクライアント)は、Rustでの再実装コストが高く、移行に数週間かかる可能性があります

段階的移行手順

  1. フロントエンドを分離: React/Vueコンポーネントを単独で動作するよう切り出す
  2. IPC層を抽象化: ElectronのipcRendererを抽象インターフェースに置き換え
  3. Rustでバックエンド再実装: 既存Node.jsコードをRustに変換
  4. 並行テスト: Electron版とTauri版を並行運用し、動作を比較
  5. 段階的移行: 機能単位で切り替え
// IPC抽象化例
export interface IPCClient {
 invoke<T>(command: string, args: any): Promise<T>;
}

// Electron版
export class ElectronIPC implements IPCClient {
 async invoke<T>(command: string, args: any): Promise<T> {
 return window.electron.ipcRenderer.invoke(command, args);
 }
}

// Tauri版
export class TauriIPC implements IPCClient {
 async invoke<T>(command: string, args: any): Promise<T> {
 return window.__TAURI__.core.invoke(command, args);
 }
}

移行事例

VS Code Alternative(匿名プロジェクト):

  • Electronベース150MBアプリをTauriに移行し、6.2MBに削減
  • 起動速度2.1秒→0.8秒に短縮
  • メモリ使用量180MB→85MBに削減
  • 移行期間: 3ヶ月(2エンジニア)

(Tauri公式ブログ、2025年12月より)

プラグインシステム

Tauri 2は公式プラグインでOS統合機能を提供しています。

プラグイン機能
tauri-plugin-fsファイルシステムアクセス
tauri-plugin-dialogファイル選択・保存ダイアログ
tauri-plugin-notificationシステム通知
tauri-plugin-shellシェルコマンド実行
tauri-plugin-httpHTTPリクエスト
tauri-plugin-sqlSQLiteデータベース
tauri-plugin-storeキーバリューストア
# Cargo.toml - プラグイン追加
[dependencies]
tauri-plugin-fs = "2.0"
tauri-plugin-dialog = "2.0"
tauri-plugin-notification = "2.0"
// main.rs - プラグイン登録
fn main() {
 tauri::Builder::default()
 .plugin(tauri_plugin_fs::init())
 .plugin(tauri_plugin_dialog::init())
 .plugin(tauri_plugin_notification::init())
 .run(tauri::generate_context!())
 .expect("error while running tauri application");
}

実践メモ: カスタムプラグインも作成可能で、Rustクレートとして配布できます。社内共通機能をプラグイン化することで、複数プロジェクト間で再利用できます。

Rust最新動向との連携

Tauri 2はRust 2024 Editionに対応しており、最新の言語機能を活用できます。

// Rust 2024 Editionの機能を使用
#![feature(async_closure)]

#[tauri::command]
async fn fetch_and_process(urls: Vec<String>) -> Result<Vec<String>, String> {
 let results = urls
 .into_iter()
 .map(async |url| {
 // 非同期クロージャ(Rust 2024)
 reqwest::get(&url).await?.text().await
 })
 .collect::<Vec<_>>();
 
 futures::future::try_join_all(results)
 .await
 .map_err(|e| e.to_string())
}

Rust Async 2026で解説された非同期ランタイムの改善も、Tauriのパフォーマンス向上に寄与しています。

WebAssemblyとの統合

// WASM統合例
import init, { process_image } from './wasm/image_processor';

async function handleImage(file: File) {
 await init();
 const buffer = await file.arrayBuffer();
 const processed = process_image(new Uint8Array(buffer));
 return processed;
}

これにより、画像処理・暗号化・データ変換等の重い処理をネイティブ速度で実行できます。

パフォーマンス分析

起動速度

各フレームワークで同一機能のアプリを構築し、起動速度を計測しました(2026年4月、M3 Pro macOS)。

フレームワーク起動時間(平均10回)
Electron 292.8秒
Tauri 20.9秒
Flutter Desktop1.4秒
React Native macOS2.1秒

Tauriは起動時間が3倍高速で、ユーザー体験が大幅に向上します。

レンダリング性能

60FPSアニメーションの安定性を計測しました。

フレームワークフレームドロップ率CPU使用率
Electron(Chromium)3.2%18%
Tauri 2(WKWebView/macOS)1.1%12%
Tauri 2(WebView2/Windows)2.5%15%

システムWebViewを使うことで、OSレベルの最適化が効き、パフォーマンスが向上します。

制約と注意点

1. WebView互換性

システムWebViewはChromiumと完全互換ではないため、一部のWeb APIが動作しない可能性があります。

問題となるAPI回避策
WebRTCネイティブ実装が必要
SharedArrayBufferPolyfill使用
最新CSS機能ターゲットブラウザを確認

注意: Windows 7ではWebView2が動作しないため、サポート対象外です。Windows 10以降が必須です。

2. Rustの学習コスト

バックエンドにRustを使うため、JavaScript/TypeScriptのみの開発者には学習コストがかかります。

推奨学習リソース:

  • The Rust Book(公式)
  • Rust by Example
  • Tauri公式チュートリアル

平均で2-3週間の学習期間が必要です。

3. エコシステムの成熟度

Electronと比較すると、プラグイン・ライブラリのエコシステムはまだ発展途上です。

要素ElectronTauri
公式プラグイン数50+15+
サードパーティライブラリ5,000+200+
商用サポートあり(Electron Forge等)限定的

よくある質問

TauriはElectronの完全な代替になりますか? 2026年時点では部分的な代替です。新規プロジェクトや、Node.js依存が少ないアプリでは十分に実用的です。ただしElectronの豊富なエコシステムに依存している既存アプリでは、移行コストが高くなります。バンドルサイズとパフォーマンスを重視するなら、Tauriが優位です。

iOSアプリをApp Storeに公開できますか? 可能です。Tauri 2のiOSビルドは標準的なSwiftプロジェクトとして生成されるため、Xcodeでコード署名・プロビジョニングプロファイル設定を行えば公開できます。ただしAppleの審査ガイドラインに準拠する必要があります。

RustがわからなくてもTauriを使えますか? 基本的なファイル操作・HTTP通信程度なら、公式プラグインとサンプルコードのコピーで対応可能です。ただしカスタムロジック実装にはRustの基礎知識が必要です。チーム内にRust経験者が1名いれば、他メンバーはフロントエンドに集中できます。

まとめ

Tauri 2は2026年にモバイル対応を完成させ、Electronを超える軽量デスクトップフレームワークとして本格普及期を迎えています。以下のポイントを再確認します。

  • iOS/Android対応で単一コードベース5プラットフォーム展開可能
  • バンドルサイズ96%削減、メモリ50%削減でユーザー体験向上
  • Rust+Webフロントで型安全なIPC、セキュリティがデフォルトで強固
  • 学習コストはあるが、長期的なメンテナンス性が高い

新規プロジェクトや、パフォーマンス要件が厳しいアプリケーションでは、Electronに代わる第一選択肢として検討する価値があります。

参考リソース

← 一覧に戻る
PR
PR
PR
PR