ブログ

デスクトップアプリの軽量化とRustによる高速化:Typst StudioがTauriを採用した理由

今回は、The Rust/Tauri Revolution: How Typst Studio Got 90% Smaller and 100% Native (A Case Study) 🚀 という記事を読み、モダンなデスクトップアプリケーション開発におけるフレームワーク選定の影響が興味深かったので、こちらで内容を整理してみたいと思います。

Tauri 興味あるんだよなぁ、と言う事で紹介です。

現在、多くのデスクトップアプリケーションが「Electron」などのWeb技術をベースに構築されています。しかし、その利便性の代償として、アプリのサイズが肥大化し、メモリを大量に消費するという課題がよく議論されてきました。Typst Studioの事例は、そうした課題に対してRustとTauriがどのような解決策を提示できるのかを示す一つの好例かもしれません。

以前の課題:デスクトップアプリの「肥大化」

Typstは、LaTeXに代わる現代的な組版システムとして注目を集めているマークアップ言語です。Typst Studioはそのエディタとして開発されましたが、当初は一般的なデスクトップアプリと同様に、リソース消費の多さが懸念される構成だったと言われています。

従来のElectronアプリが重くなる主な理由は、各アプリケーションが個別に「Chromium(Webブラウザの実体)」と「Node.js」を丸ごと抱え込んでしまう点にあります。たとえば、単純なテキストエディタであっても、配布サイズが数百MBに達することも珍しくありません。

Tauriによるアプローチの変化

Typst Studioが採用した「Tauri」は、Rustで作られたデスクトップアプリ構築フレームワークです。Electronとの最大の違いは、アプリ自体にブラウザエンジンを同梱しない点にあります。

代わりに、OSが標準で持っているWebビュー(WindowsならWebView2、macOSならWebKitなど)を共有して利用します。これにより、配布サイズを劇的に削減することが可能になります。

Tauriの基本的な仕組み

以下の図は、Tauriがどのようにフロントエンドとバックエンドを橋渡ししているかを簡略化したイメージです。

flowchart TD
    subgraph Client_Side[ユーザー環境]
        OS_WebView[OS標準のWebView]
        Rust_Core[Rustバックエンド]
    end

    subgraph Frontend[フロントエンド層]
        UI[UI: HTML/CSS/JS]
    end

    UI -- IPC (Inter-Process Communication) --> Rust_Core
    Rust_Core -- システム操作 / 組版処理 --> OS_WebView
    OS_WebView -- 画面描画 --> UI

このように、UI層はWeb技術を使いつつ、システムに近い処理や重たい計算はRustが担当するという役割分担がなされています。

移行によって得られた成果

実際にTypst StudioがTauri(およびRust)へ移行したことで、どのような変化があったのか。主要な指標を比較すると、以下のような傾向が見て取れます。

比較項目 従来の構成(イメージ) Tauri移行後
バイナリサイズ 約 100MB〜200MB 約 10MB以下(約90%削減)
メモリ使用量 非常に高い(数百MB〜) 比較的低い(OS共有のため)
実行速度 Node.jsの実行オーバーヘッド Rustによるネイティブ実行
バックエンド言語 JavaScript / TypeScript Rust

これほどのサイズ削減は、ユーザーにとってもダウンロード時間の短縮やディスク容量の節約という形で、確かなメリットとして感じられる部分かと思います。

なぜRustが重要だったのか

Tauriを使う以上、バックエンドはRustで書くことになります。これがTypst Studioにとって単なる「軽量化」以上の意味を持ったのではないかと推測されます。

Typstの組版処理(ドキュメントのレンダリング)は、非常に高い計算コストがかかる作業です。Rustはメモリ安全性を保証しながらC++に匹敵するパフォーマンスを発揮できるため、エディタを操作しながらリアルタイムでプレビューを更新するような、負荷の高い処理には最適の選択肢だったのでしょう。

たとえば、Rustの強みであるメモリ管理は、以下のようなイメージで動作しています。

  • 所有権システム: ガベージコレクション(GC)がないため、実行時のポーズが発生しにくい。
  • ゼロコスト抽象化: 高レベルなコードを書いても、コンパイル時には効率的なマシンコードに変換される。
  • 並行処理の安全性: プレビュー生成を別スレッドで回しても、データ競合のリスクを抑えやすい。

導入にあたっての考慮点

もちろん、すべてのアプリがTauriに移行すれば良いというわけでもないかもしれません。

Rustは学習曲線が比較的緩やかではないと言われていますし、OSごとのWebビューの差異(ブラウザの挙動の違い)を意識する必要があるという実務上の手間も一応存在します。しかし、Typst Studioのような「パフォーマンスが求められ、かつ配布のしやすさも重視されるツール」にとっては、今のところ最良のバランスに近い選択肢の一つなのではないでしょうか。

まとめ

Typst Studioの事例は、適切な技術選定がいかにプロダクトの品質に直結するかを教えてくれます。

  1. Tauri を活用してOSのWebビューを共有し、配布サイズを最小化する。
  2. Rust をバックエンドに据えて、ネイティブレベルの計算速度と安定性を確保する。

この組み合わせによって、90%もの軽量化を実現したというのは、実務レベルでも非常に参考になる数字です。もし、現在開発しているツールが「少し重いな」と感じているのであれば、この辺りのアーキテクチャを検討してみるのも良いかもしれません。

これからのデスクトップアプリ開発は、かつての「Web技術だけで完結させる」フェーズから、Rustのようなシステムプログラミング言語を組み合わせて「最適化」していくフェーズへと移りつつあるのかもしれませんね。

参照記事