7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tauri(Rust)ってなんだ?〜Apple Silicon勢の救世主なのか?〜

7
Posted at

ねらい・対象・ゴール・TL;DR

ねらい: Electronに代わるデスクトップアプリフレームワーク「Tauri」の正体を暴き、特にApple Siliconユーザーにとっての恩恵を検証する

対象:

  • Electronアプリの重さにうんざりしているMacユーザー
  • M1/M2/M3/M4搭載Macでデスクトップアプリを開発したい人
  • Rustに興味があるフロントエンドエンジニア

ゴール: TauriとElectronの違いを理解し、自分のプロジェクトにどちらが適しているか判断できるようになる

TL;DR: TauriはRustベースの軽量デスクトップアプリフレームワーク。バイナリサイズ2.5MB(Electronは85MB)、メモリ消費30-40MB(Electronは100MB以上)。Apple Siliconではネイティブarm64ビルドでRosetta翻訳のオーバーヘッドなし。2024年10月にv2.0がリリースされ、iOS/Android対応も。


はじめに:Electronアプリ、重くない?

Slack、Discord、VS Code、Notion、Figma...

君のMacに入ってるアプリ、心当たりあるでしょ。これ全部Electron製。つまり中身はChromiumブラウザが丸ごと入ってる。

アクティビティモニタを開いてみ。Slackだけでメモリ300MB食ってる。Discordも似たようなもん。VS Codeに至っては拡張機能次第で1GBを超える。

M1 MacBook Airのメモリが8GBだとして、アプリを3つ開いただけで半分持っていかれる計算だ。なんかおかしくない?

そこで登場するのが「Tauri」(タウリ)。Rustで書かれた、Electronの代替を目指すフレームワークだ。


Tauriとは何者か

基本情報

"Tauri is a framework for building tiny and fast binaries for all major desktop (macOS, linux, windows) and mobile (iOS, Android) platforms."

— Tauri公式サイトより

「tiny and fast」がキーワード。小さくて速い。Electronとは真逆のアプローチだ。

Tauriは2019年に生まれ、2022年6月にv1.0がリリースされた。そして2024年10月2日、待望のv2.0が安定版としてリリースされた。

"On 2 October 2024, Tauri v2 was released as a stable release."

— Wikipedia「Tauri (software framework)」より

アーキテクチャの根本的な違い

ここがTauriとElectronの最大の違いだ。

Electron:

  • Chromiumブラウザを丸ごとバンドル
  • バックエンドはNode.js
  • アプリごとに独自のブラウザエンジンを持つ

Tauri:

  • OSのネイティブWebViewを使用(macOSならWebKit、WindowsならWebView2)
  • バックエンドはRust
  • ブラウザエンジンをバンドルしない

"Tauri instead uses the native system webview component for whatever operating system your app runs on."

— InfoWorld記事より

つまりTauriアプリは「ブラウザを同梱しない」。OSが持ってるWebView機能を借りるだけ。だから軽い。


数字で見る:TauriがどれだけElectronより軽いか

実際のベンチマークを見てみよう。

バイナリサイズ

フレームワーク 典型的なアプリサイズ
Electron 80-120MB
Tauri 2.5-10MB

"Tauri's binaries are as small as 2.5-3 MB"

— Codeology記事より

同じアプリで30-40倍の差。これは大げさじゃなくて、Electronは毎回Chromiumを同梱するから当然こうなる。

メモリ使用量(RAM)

フレームワーク アイドル時メモリ
Electron 100-400MB
Tauri 30-40MB

"RAM usage around 30-40 MB for similar apps"

— Levminer検証より

メモリ8GBのMacBook Airユーザーには死活問題だ。

起動時間

フレームワーク 起動時間
Electron 1-2秒
Tauri 0.5秒未満

"Electron apps typically took 1–2 seconds to open on mid-range laptops, while Tauri apps started in under half a second."

— RaftLabs記事より

起動が速いアプリは「質が高い」と感じる。これは心理的にも重要。


Apple Silicon勢の救世主?

さて、本題。M1/M2/M3/M4搭載のMacユーザーにとって、Tauriは本当に救世主なのか?

ネイティブarm64ビルド

Tauriは最初からApple Silicon(arm64)をサポートしている。

# Apple Silicon向けビルド
tauri build --target aarch64-apple-darwin

# Intel Mac向けビルド  
tauri build --target x86_64-apple-darwin

# ユニバーサルバイナリ(両方対応)
tauri build --target universal-apple-darwin

"tauri build --target aarch64-apple-darwin: targets Apple silicon machines."

— Tauri公式ドキュメントより

ポイントは「Rosettaなしでネイティブ実行できる」こと。

Electronアプリの多くは、配布されているバイナリがx86_64(Intel)向けにビルドされている。M1/M2/M3/M4 Macで実行すると、Rosetta 2による翻訳が入る。これがオーバーヘッドになる。

"While Apple silicon machines can run applications compiled for Intel-based Macs through a translation layer called Rosetta, this leads to a reduction in performance due to processor instruction translations."

— Tauri公式ドキュメントより

Tauriでarm64ネイティブビルドすれば、この翻訳オーバーヘッドがゼロになる。

macOSのWebKit最適化

Apple SiliconのMacでTauriアプリを動かすとき、WebViewとして使われるのはWebKit(Safari)だ。WebKitはAppleが開発しているので、当然Apple Siliconに最適化されている。

  • Metal対応のGPUアクセラレーション
  • Neural Engineとの連携(機械学習タスク)
  • 電力効率の最適化

Chromium(Electron)もApple Silicon対応しているけど、Apple純正のWebKitには敵わない部分がある。

開発環境のセットアップ

Apple Silicon Macでの開発で注意が必要なのは、ARM64向けのネイティブパッケージを使うこと。

GitHubのIssue #13771で報告されているように、こんなエラーに遭遇することがある:

  • "Cannot find module @tauri-apps/cli-darwin-x64"
  • "Cannot find module @rollup/rollup-darwin-x64"
  • "Cannot find module @esbuild/darwin-x64"

— GitHub Issue #13771より

解決策:

# ARM64向けパッケージを明示的にインストール
npm install @tauri-apps/cli-darwin-arm64 --save-dev
npm install @rollup/rollup-darwin-arm64 --save-dev
npm install @esbuild/darwin-arm64 --save-dev

または、node_modulesを削除してRosetta経由じゃないターミナルでnpm installし直す。


Tauri 2.0で何が変わった?

2024年10月リリースのTauri 2.0は、単なるバージョンアップじゃない。パラダイムシフトだ。

モバイル対応(iOS / Android)

"Support for iOS and Android: You'll be able to build Tauri apps and run them on iOS and Android."

— Tauri Roadmap記事より

デスクトップアプリのコードベースを、そのままiOS/Androidアプリに展開できる。React NativeやFlutterとは別のアプローチだ。

# iOSアプリとして実行
tauri ios dev

# Androidアプリとして実行
tauri android dev

Hot Module Replacement(HMR)もモバイルに対応。フロントエンドの変更がリアルタイムでエミュレータに反映される。

新しいプラグインシステム

公式プラグインが充実した:

プラグイン 機能
Barcode Scanner QRコード・バーコード読み取り
Biometric 生体認証(Touch ID / Face ID)
Clipboard クリップボード操作
Dialog ファイル選択・保存ダイアログ
File System ファイルシステムアクセス
Geolocation 位置情報取得
HTTP Rust製HTTPクライアント
Notification ネイティブ通知
NFC NFCタグ読み書き

これらはSwift(iOS)やKotlin(Android)でネイティブ実装されている。パフォーマンスが段違い。

セキュリティモデルの刷新

v1の「Allowlist」から、「Permissions, Scopes, Capabilities」システムに変更された。

"The Allowlist has been replaced by a permissions, scopes, and capabilities system, offering a flexible yet straightforward access control mechanism."

— AlternativeTo記事より

Electronの問題点の一つは、Node.jsのAPIがフロントエンドから叩けてしまうこと。悪意あるコードがfsモジュールでファイルを読み書きできたりする。

Tauriはデフォルトで全APIがブロックされていて、必要なものだけ明示的に許可する設計。

// Rustで明示的にコマンドを公開
#[tauri::command]
fn read_file(path: String) -> Result<String, String> {
    std::fs::read_to_string(path)
        .map_err(|e| e.to_string())
}

フロントエンドからは、公開されたコマンドしか呼べない。これが「セキュリティバイデザイン」ってやつだ。


Rust、怖くない?

正直に言おう。Tauriの最大の障壁は「Rust」だ。

"Now if you know Rust you're probably happy, but if you have to learn Rust from scratch (like me) you are going to face some issues."

— Levminer記事より

所有権、借用、ライフタイム...。Rust特有の概念に最初は戸惑う。

でも、実は朗報がある。

Rustを書かなくてもいいケースが多い

"No Rust Skills Needed! You don't need to write Code in Rust, Swift or Kotlin in most cases. Tauri already offers an extensive JavaScript API."

— Tauri公式サイトより

単純なアプリなら、フロントエンド(React, Vue, Svelte等)だけで完結できる。Tauri公式のJavaScript APIが充実しているから。

import { open } from '@tauri-apps/plugin-dialog';
import { readTextFile } from '@tauri-apps/plugin-fs';

// ファイル選択ダイアログを開く
const selected = await open({
  multiple: false,
  filters: [{ name: 'Text', extensions: ['txt'] }]
});

// ファイルを読み込む
if (selected) {
  const content = await readTextFile(selected);
  console.log(content);
}

これ、全部JavaScript。Rustは一行も書いてない。

Rustが必要になるケース

  • 複雑なバックエンド処理(重い計算、並列処理)
  • OS固有のAPIを叩きたい
  • カスタムプラグインを作りたい
  • セキュリティ上、フロントエンドに処理を置きたくない

こういう場合だけRustを書けばいい。


ElectronからTauriへの移行は現実的?

既存のElectronアプリをTauriに移行したい人も多いだろう。

移行の難易度

フロントエンドはほぼそのまま使える。React、Vue、Svelteなど、お好きなフレームワークで。

// next.config.js
module.exports = {
  output: 'export'  // 静的エクスポートに設定
}

"To make a Next app work with Tauri, you just need to set output: 'export' in your Next configuration file, and Tauri handles the rest."

— DoltHub記事より

問題はバックエンド。ElectronのNode.jsコードは全部書き直しになる。

  • fsモジュール → Tauri File System API
  • electron-store → Tauri Store Plugin
  • child_process → Tauri Shell API

移行すべき?ステイすべき?

Tauriに移行すべきケース:

  • アプリサイズ・メモリ使用量が問題になっている
  • セキュリティが最優先
  • モバイル展開も視野に入れている
  • チームにRustを学ぶ意欲がある

Electronに留まるべきケース:

  • 既存のNode.jsエコシステムに強く依存している
  • チームがRustを学ぶ時間がない
  • 現状のアプリで問題が起きていない

"Choose YOLOv8 if: You have an existing pipeline heavily tuned for v8 specific behaviors"

— ...あ、これ前の記事のコピペだ。失礼。

正しくは:

"Electron is best if you already know JavaScript well—especially if you've already delivered other Electron-based apps and want to leverage that knowledge"

— InfoWorld記事より


実践:Tauriで「Hello World」

理屈はいいから、実際に動かしてみよう。

前提条件(macOS)

# Xcode Command Line Tools
xcode-select --install

# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Node.js(お好みのバージョンマネージャで)

プロジェクト作成

npm create tauri-app@latest

# 対話形式で設定
# - Project name: my-tauri-app
# - Package manager: npm
# - UI template: React + TypeScript(お好みで)

開発サーバー起動

cd my-tauri-app
npm install
npm run tauri dev

数秒でウィンドウが立ち上がる。Electronより明らかに速い。

ビルド

npm run tauri build

src-tauri/target/release/bundle/に成果物ができる。dmgファイルのサイズを確認してみ。驚くほど小さいはず。


Apple Silicon開発でのTips

ユニバーサルバイナリを配布したい

M1以降のMacとIntel Macの両方に対応したいなら:

# 両方のターゲットをインストール
rustup target add aarch64-apple-darwin
rustup target add x86_64-apple-darwin

# ユニバーサルバイナリをビルド
npm run tauri build -- --target universal-apple-darwin

GitHub Actionsでのクロスプラットフォームビルド

jobs:
  build:
    strategy:
      matrix:
        include:
          - platform: 'macos-latest'
            args: '--target aarch64-apple-darwin'
          - platform: 'macos-latest'
            args: '--target x86_64-apple-darwin'
          - platform: 'windows-latest'
            args: ''
          - platform: 'ubuntu-latest'
            args: ''

"This workflow will build and release your app for Linux x64, Windows x64, macOS x64 and macOS Arm64 (M1 and above)."

— Tauri公式ドキュメントより


まとめ:救世主かどうかは「あなた次第」

Tauriは確かに技術的に優れている。軽い、速い、セキュア。Apple Siliconとの相性も抜群だ。

でも、「救世主」かどうかは使う人次第。

Tauriが救世主になる人:

  • メモリ8GBのMacBook Airでも快適に開発したい
  • 配布するアプリを軽くしたい
  • Rustを学ぶことに抵抗がない(または学びたい)
  • セキュリティを妥協したくない

Electronの方が幸せになれる人:

  • Node.jsの資産が大量にある
  • チームがJavaScript/TypeScriptオンリー
  • とにかく早くリリースしたい
  • メモリは潤沢にある

2024年のTauri 2.0リリースで、フレームワークとしての成熟度は確実に上がった。モバイル対応も加わって、「Electron代替」から「クロスプラットフォーム開発の本命」に進化しつつある。

Apple Silicon Macで開発するなら、一度触ってみる価値は間違いなくある。Rustに慣れるまでの数日を乗り越えれば、その先には軽量でセキュアなアプリ開発の世界が待っている。

...え、救世主かどうかって?

少なくとも、Slackがメモリ300MB食わなくなる未来は見たい。それだけは確かだ。


参考リンク


この記事が役に立ったら、ぜひフォローといいねをお願いします。Tauri開発で困ったことがあればコメント欄でどうぞ。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?