zudo-paper

ElectronかTauriかどっちにすべき?

Author: Takazudo | 作成: 2026/03/12

概要

自分はElectronでzudo-textというノートアプリを作っている。ファイルツリー、CodeMirrorエディタ、ターミナル、AI機能を搭載したアプリで、「なぜElectronなのか: デスクトップアプリ開発の技術選定」みたいな記事シリーズを書いている最中に「そもそもTauriでいいのでは?」という疑問が出てきた。

TauriはRustバックエンドでファイルI/Oをネイティブに扱えるし、バンドルサイズも小さい。Electronから移行すべきなのか。Claude Codeに聞きながら、この問いを掘り下げていった。以下はそのやりとりをまとめたもの。

TauriだとファイルI/OにNode.jsが必要?

Takazudo

Tauriだとファイルの読み書きはどうするの? Node.jsが必要ならNode.jsバイナリをバンドルする必要がある? そうするとTauriの軽量さのメリットがなくなるのでは?

Claude

ファイルの読み書きはTauriでは問題にならない。Tauriはこれをネイティブに提供している。

  • @tauri-apps/plugin-fs — Tauri公式のファイルシステムプラグインで、フロントエンドのJSからファイルの読み書きができる
  • #[tauri::command] — Rustでstd::fsを使う関数を書いて、フロントエンドのJSから呼び出せるカスタムコマンド

なので「Markdownファイルの読み書き」「JSON設定ファイルの管理」みたいなユースケースは、Node.jsなしでTauriが普通に対応できる。

Electronが本当に強いのはnpmエコシステムへのアクセス。具体的にはnode-ptyのような、Node.jsのネイティブモジュールに依存するパッケージが使える点。基本的なファイルI/Oではない。

TauriにはSidecar機能(外部バイナリのバンドル)があるので、技術的にはNode.jsバイナリを同梱することもできる。ただそれをやるとTauriの軽量さというメリットが消えるので、本末転倒になる。

npmエコシステムへの依存が、ElectronとTauriを分ける本当の判断基準ということになる。

CodeMirrorにはサーバーサイド機能がある?

Takazudo

CodeMirrorってサーバーサイドの機能あるの? ブラウザのエディタだけじゃなくて?

Claude

ない。CodeMirrorは純粋にブラウザサイドで動作するJavaScriptライブラリ。DOMの中でエディタをレンダリングする。サーバーサイドのコンポーネントは持っていない。

なのでTauriのWebViewでもElectronのChromiumでも同じように動く。CodeMirrorは「なぜTauriではなくElectronか」の理由にはならない。ElectronでないとダメなのはNode.jsが必要なもの、例えばnode-ptyのようなパッケージ。

TauriでもCodeMirrorは問題なく使える?

Takazudo

じゃあCodeMirrorをアプリのエディタに使う場合、Tauriでも問題ないよね?

Claude

その通り。CodeMirrorはどのブラウザ / WebViewでも動くので、Tauriでも全く問題ない。

TauriかElectronかの判断は結局こういう話になる。

  • node-pty(ターミナル埋め込み) — これがElectronを選ぶ決定的な理由
  • Rustの学習コスト — Tauriプラグインにない機能を自前で実装するならRustが必要

もしzudo-textが「ファイルツリー + CodeMirrorエディタ + JSON設定ファイル管理」だけで、ターミナルがなければ、Tauriで十分成立する。

zudo-textをTauriに移行できるか調べてみてもらってよい?

Takazudo

実際にzudo-textをTauriに移行できるか調べてみてもらってよい?

Claude

zudo-textのコードベースを見て、Node.jsをバックエンドで何に使っているか整理した。

Node.jsに依存している処理は以下。

  • node-pty — シェルプロセスを生成してターミナルを埋め込む(pty-manager.jsで約150行)
  • ファイルシステム操作 — fs / fs/promisesでMarkdown、pins、drafts、settingsの読み書き。ディレクトリの一覧取得、スキャフォールディング。fs.watch()でファイル変更のリアルタイム検知
  • OS統合 — os.homedir()で設定パスの取得、pathモジュール
  • Electronダイアログ — ディレクトリ選択ダイアログ

逆に、フロントエンドだけで完結していてTauriのWebViewでそのまま動くものは以下。

  • React 19 + React Router SPA
  • CodeMirror 6エディタ(Vimモード付き)
  • xterm.jsターミナルUI
  • Markdownレンダリング、Tailwind CSS、MiniSearch等

結論としては、node-ptyが移行のブロッカー。ターミナル機能がなければ、移行はかなり現実的。ファイルI/O、ファイル監視、ダイアログはすべてTauriプラグインで代替できる。Reactフロントエンドはほぼそのまま持っていける。

xterm.jsもTauriでは使えなくなる?

Takazudo

ターミナルにはxterm.jsを使ってるけど、Tauriだとxterm.jsも使えなくなるの? 代替は?

Claude

xterm.js自体は使える。xterm.jsは純粋にブラウザサイドのターミナルUIレンダラーで、どのWebViewでも動く。

依存関係を分けて整理するとこうなる。

  • xterm.js(フロントエンド) — ターミナルのUIを描画する。Tauriでも動く
  • node-pty(バックエンド) — 実際のシェルプロセスを生成する。Node.jsが必要

この2つは別物。Tauriに移行する場合、xterm.jsはそのまま使って、node-ptyだけをRustのportable-ptyで置き換えることになる。

Electron(現状)Tauri(仮)
ターミナルUIxterm.jsxterm.js(同じ)
シェル生成node-pty(Node.js)portable-pty(Rust)
通信方式IPC via window.api.terminal.*Tauri invoke() + events

移行作業はバックエンド側だけ。Rustのコマンドとしてportable-ptyを使ったPTY管理を書くことになる。

移行は技術的にはそこまで難しくない?

Takazudo

じゃあ移行は技術的にはそこまで難しくなさそう?

Claude

pty-manager.jsは約150行で、Rustで同等のものを書いてもスコープとしてはそこまで大きくない。

ただ、技術的に可能かどうかと、やるべきかどうかは別の話。

Tauriに移行して得られるもの。

  • バンドルサイズの削減(ChromiumをバンドルしないでOSのWebViewを使う)
  • メモリ使用量の削減

Tauriへの移行で失うもの / コスト。

  • IPCハンドラをすべてRustで書き直す(ファイルI/O、設定管理、ファイル監視、スキャフォールディング)
  • PTYマネージャをRustで書き直す
  • Rustの学習コスト(またはAIに頼る)
  • OS間のWebView差異への対応
  • 今後使いたくなるnpmパッケージへのアクセスを失う

zudo-textは個人ツールなので、バンドルサイズやメモリ使用量はそこまで気にならない。移行コストに見合わないだろうという判断になる。

WebViewはOS間で違う?

Takazudo

WebViewって、macOSだとSafariベースで、WindowsだとEdgeベースってこと?

Claude

その通り。

  • macOS — WebKit(Safariのエンジン)
  • Windows — WebView2(Edge / Chromiumベース)
  • Linux — WebKitGTK

WindowsのWebView2は実質Chromiumベースなので、Electronと近い動作になる。問題はmacOSのWebKit。SafariはChromeと比べて一部のCSSやJS機能のサポートが遅れることがある。

React + CodeMirror + xterm.jsのアプリならおそらく動くだろうが、WebKit固有のレンダリング差異や、ChromiumにはあるのにWebKitにはないAPIにたまに遭遇することになる。ElectronならどのOSでも同じChromiumなので、そういうクロスエンジンのテストが不要。

結論

ElectronからTauriへの移行はしないことにした。

理由を整理するとこうなる。

  • node-ptyへの依存 — ターミナル機能がある限り、Node.jsが必要。Rustで書き直すことは可能だが、そのためだけにRustを導入するモチベーションが薄い
  • WebViewのクロスプラットフォーム差異 — Electronなら全OSで同じChromiumが動くのでCSS / JSの挙動が一致する。TauriだとmacOSはWebKit、WindowsはChromiumベースのWebView2、LinuxはWebKitGTKで、レンダリングエンジンがバラバラになる
  • 移行コスト — IPCハンドラ、PTYマネージャ、ファイル監視など、バックエンド処理を全部Rustで書き直す必要がある
  • バンドルサイズ削減のメリットが薄い

個人的にはWebViewの差異は大きい。ElectronならどのOSでも同じChromiumなので、一度書けばどこでも同じ見た目・同じ挙動になる。取り立てて面倒と思われるのがMacのSafariで、比較的諸々の対応が遅い上に、頻繁にOSをアップデートしない人にとってはなんか知らんが壊れてる風にしか見えない。Electron無難という感想。

ターミナル埋め込みが不要で、Rustに慣れていて、バンドルサイズを気にするようなケースであればTauriは良い選択肢だろう。ただzudo-textの場合はElectronがプラグマティックな選択ということになる。