Tauriとは

Rustで書かれたデスクトップアプリケーション開発のツールキットです。Reactなどのフロントエンドのフレイムワークをそのまま使うことができるため、Webアプリケーションを実装コストをかけずにデスクトップアプリケーション化することができます。その上でOS関連の機能(ファイルの保存、編集や通知機能)にアクセスする際にはRustの関数を作成し、UI側から呼び出します。
 
ElectronとTauriの比較
 
同様のElectronに比べinstallerとメモリ使用量が少ないのが特徴です。これによりパフォーマンスではElectronより優位にあります。

Architecture

The Core Process

Core ProcessのみがOSにアクセスでき、WebViewと呼ばれるUIとはevent/commandを用いて通信されます。

The WebView Process

UIをレンダリングし、HTML/CSS/Javascriptなどを実行することができます。またWebViewのライブラリはexecutableに含まれません。
 

Inter-Process Communication (IPC)

バックエンドとの通信方法は以下の2種類があります。

Events

一方向の通信でcore process, webviewどちらからも送ることができます。ステートの管理などに使われます。
notion image

Commands

メインのapiで双方向への通信ができ、ブラウザのfetch apiのような役割をします。
notion image

Develop

webアプリケーションからTauriを用いてデスクトップアプリケーションにするのにTauri、Rustのインストール、各OS向けへのビルドのみでWebアプリケーションと挙動が変わらずデスクトップアプリケーションとして動作します。このため、OSに関わる機能(ファイル、通知、キーボードショートカット、プロセス、システムシェルなど)を使わない場合は実装コストをかけずにWebアプリケーションからデスクトップアプリケーションを作成することが可能です。
 
yarn tauri dev
 
イメージ
notion image

Build

https://tauri.studio/v1/guides/building/現時点ではcross-compilationができないため、それぞれのosでのみビルド可能つまりLinuxでwindows用のapplication bundleをビルドすることはできません。
yarn build yarn tauri build
ビルドのベストプラクティスはGitHub Actions などCI/CDのツールを用いて各OS用にビルドし、GitHub Actionsに関してはワークフローのテンプレートがあります。
 
使用例
アプリケーション内で使用するファイルをローカルで管理することができる
 

コード

コマンドを用いてRustの関数をUIから呼び出すことが可能
Rust
fn main() { tauri::Builder::default() .invoke_handler(tauri::generate_handler![my_custom_command]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } #[tauri::command] fn my_custom_command(invoke_message: String) { println!("I was invoked from JS, with this message: {}", invoke_message); }
 
Javascript
// With the Tauri API npm package: import { invoke } from '@tauri-apps/api/tauri' // With the Tauri global script, enabled when `tauri.conf.json > build > withGlobalTauri` is set to true: const invoke = window.__TAURI__.invoke // Invoke the command invoke('my_custom_command')
 

所感

Tauriのおかげでフロントエンドの技術をそのままデスクトップアプリケーション開発に活かすことができることからデスクトップアプリケーション開発の敷居を下げ、Javascriptでできることがさらに広がったという印象を受けました。