Tauri 2.0クロスプラットフォーム開発:2026年デスクトップからモバイルまで
前端工程高橋 翔
Tauri 2.0:1つのコードベース、6つのプラットフォーム
Tauri 2.0の最大のブレイクスルーはデスクトップからモバイルへの拡張。同じRustバックエンド+Webフロントエンドで、Windows、macOS、Linux、iOS、Androidの5プラットフォームのアプリを同時に構築できる。
比較データ:同じ機能のアプリ、Tauri 2.0パッケージサイズ8MB vs Electron 150MB、メモリ使用量45MB vs 280MB、起動速度0.3s vs 2.5s。
Tauri vs Electron 全面的な比較
| 次元 | Tauri 2.0 | Electron |
|---|---|---|
| パッケージサイズ | 5-15MB | 100-200MB |
| メモリ使用量 | 30-60MB | 200-400MB |
| 起動速度 | 0.2-0.5s | 1.5-3s |
| バックエンド言語 | Rust | Node.js |
| WebView | システムネイティブ | バンドルChromium |
| モバイル対応 | iOS/Android | 非対応 |
| ネイティブ機能 | Rust FFI | Node.js N-API |
| セキュリティモデル | パーミッションサンドボックス | 完全なNode.js |
| エコシステム成熟度 | 成長中 | 成熟 |
Tauri 2.0の新アーキテクチャ
┌──────────────────────────────────────────────────────┐
│ Webフロントエンド層 │
│ React / Vue / Svelte / Vanilla JS │
├──────────────────────────────────────────────────────┤
│ IPC通信層 │
│ invoke() / listen() / emit() │
├──────────────────────────────────────────────────────┤
│ Tauri Core │
│ ┌──────────┬──────────┬──────────┬───────────────┐ │
│ │ ウィンドウ│ プラグイン│ イベント │ パーミッション│ │
│ │ 管理 │ システム │ システム │ 管理 │ │
│ ├──────────┴──────────┴──────────┴───────────────┤ │
│ │ コマンドハンドラ │ │
│ ├─────────────────────────────────────────────────┤ │
│ │ プラットフォームアダプタ層 │ │
│ │ Windows │ macOS │ Linux │ iOS │ Android │ │
│ └─────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────┤
│ Rustバックエンド層 │
│ ビジネスロジック │ ファイル操作 │ ネットワーク │ 暗号化│
└──────────────────────────────────────────────────────┘
Rustバックエンド + WebフロントエンドのIPC通信
フロントエンドからRustコマンドを呼び出し
// src-tauri/src/commands.rs
#[tauri::command]
async fn process_image(image_path: String, options: ProcessOptions) -> Result<ProcessResult, String> {
let img = image::open(&image_path)
.map_err(|e| format!("画像を開けません: {}", e))?;
let processed = match options.operation.as_str() {
"compress" => compress_image(img, options.quality)?,
"resize" => resize_image(img, options.width, options.height)?,
"convert" => convert_format(img, options.format)?,
_ => return Err("サポートされていない操作".to_string()),
};
let output_path = save_processed_image(processed, &options.output_dir)?;
Ok(ProcessResult {
output_path,
file_size: fs::metadata(&output_path)?.len(),
})
}
// フロントエンド呼び出し
import { invoke } from "@tauri-apps/api/core";
async function processImage() {
const result = await invoke<ProcessResult>("process_image", {
imagePath: "/path/to/image.png",
options: {
operation: "compress",
quality: 80,
outputDir: "/path/to/output",
},
});
console.log(`処理完了: ${result.output_path}`);
}
イベント通信
// Rust側イベント送信
use tauri::Emitter;
#[tauri::command]
async fn start_batch_process(app: tauri::AppHandle, files: Vec<String>) -> Result<(), String> {
for (index, file) in files.iter().enumerate() {
process_single_file(file)?;
app.emit("batch-progress", BatchProgress {
current: index + 1,
total: files.len(),
file: file.clone(),
}).map_err(|e| e.to_string())?;
}
Ok(())
}
// フロントエンドイベントリスニング
import { listen } from "@tauri-apps/api/event";
const unlisten = await listen<BatchProgress>("batch-progress", (event) => {
console.log(`進捗: ${event.payload.current}/${event.payload.total}`);
updateProgressBar(event.payload.current / event.payload.total);
});
unlisten();
Tauriプラグインシステム
主要な公式プラグイン
| プラグイン | 機能 | 対応プラットフォーム |
|---|---|---|
| @tauri-apps/plugin-fs | ファイルシステム読み書き | 全プラットフォーム |
| @tauri-apps/plugin-notification | システム通知 | 全プラットフォーム |
| @tauri-apps/plugin-clipboard | クリップボード操作 | 全プラットフォーム |
| @tauri-apps/plugin-biometric | 生体認証 | iOS/Android/macOS |
| @tauri-apps/plugin-camera | カメラアクセス | iOS/Android |
| @tauri-apps/plugin-geolocation | 位置情報 | iOS/Android |
| @tauri-apps/plugin-barcode-scanner | バーコードスキャン | iOS/Android |
| @tauri-apps/plugin-store | ローカル永続ストレージ | 全プラットフォーム |
モバイル適応
iOS/Androidネイティブ機能呼び出し
import { platform } from "@tauri-apps/plugin-os";
async function shareContent(content: string) {
if (platform() === "ios" || platform() === "android") {
const { share } = await import("@tauri-apps/plugin-share");
await share({ text: content, title: "共有" });
} else {
await navigator.clipboard.writeText(content);
showToast("クリップボードにコピーしました");
}
}
async function authenticateUser() {
if (platform() === "ios" || platform() === "android") {
const { authenticate } = await import("@tauri-apps/plugin-biometric");
const result = await authenticate({
reason: "本人確認を行ってください",
fallbackToPin: true,
});
return result.isAuthenticated;
}
return true;
}
モバイルUI適応
.app-container {
display: grid;
grid-template-columns: 280px 1fr;
gap: 1rem;
height: 100vh;
}
@media (max-width: 768px) {
.app-container {
grid-template-columns: 1fr;
grid-template-rows: auto 1fr;
}
.sidebar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 60px;
z-index: 100;
display: flex;
flex-direction: row;
overflow-x: auto;
}
}
.toolbar {
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
}
パッケージングと配布
プラットフォーム別ビルドコマンド
# Windows NSISインストーラ
npm run tauri build -- --bundles nsis
# macOS DMG
npm run tauri build -- --bundles dmg
# Linux AppImage/Deb
npm run tauri build -- --bundles appimage,deb
# iOS
npm run tauri ios build -- --release
# Android APK/AAB
npm run tauri android build -- --release
自動更新設定
{
"plugins": {
"updater": {
"endpoints": [
"https://api.toolsku.com/updates/{{target}}/{{arch}}/{{current_version}}"
],
"pubkey": "PUBLIC_KEY_HERE"
}
}
}
import { check } from "@tauri-apps/plugin-updater";
import { relaunch } from "@tauri-apps/plugin-process";
async function checkForUpdates() {
const update = await check();
if (update?.available) {
await update.downloadAndInstall();
await relaunch();
}
}
パフォーマンス最適化
Rust側計算オフロード
// CPU集約的な計算をRust側にオフロード
#[tauri::command]
async fn calculate_hash(file_path: String) -> Result<FileHash, String> {
let mut hasher = Sha256::new();
let mut file = File::open(&file_path).map_err(|e| e.to_string())?;
let mut buffer = [0u8; 8192];
loop {
let n = file.read(&mut buffer).map_err(|e| e.to_string())?;
if n == 0 { break; }
hasher.update(&buffer[..n]);
}
Ok(FileHash {
algorithm: "SHA-256".to_string(),
hash: format!("{:x}", hasher.finalize()),
})
}
まとめ
- Tauri 2.0はクロスプラットフォーム開発の最適な選択 — 小さなパッケージサイズ、高いパフォーマンス、1つのコードベースで5プラットフォーム
- Rustバックエンドがコアの強み — CPU集約タスクをRustにオフロード、Node.jsより10-100倍高速
- 豊富なプラグインシステム — ファイルシステム、生体認証、カメラなどのネイティブ機能がすぐに使える
- モバイル対応がキラーフィーチャー — ElectronにできないことをTauri 2.0はできる
2026年にまだElectronを使っているなら、Tauri 2.0を真剣に検討する時だ。8MB vs 150MBのパッケージサイズの差——ユーザーはダウンロード数で投票する。
ブラウザローカルツールを無料で試す →
#Tauri#Rust#跨平台#桌面应用#移动端