こんにちは。また久しぶりに投稿させていただきます。
だいぶ前にGodotの開発について投稿していたが、あれ以来イラストに詰まってあまり進んでなくてね…
Stable Diffusionを活用してイラストを作ろうと思うので、何か出来たらまた投稿する。
さて、今回はTauriについて話をしよう。
どんなデスクトップアプリ
仕事であらゆる案件を担当して、昔から案件の資料をどう管理するか悩んでいた。
Notionを使おうとも考えていたが、「データはクラウドまで上げられるからNG」と上司に言われて断念した。
その後、Notionと似ていたOSSを見つけて、使い始めたが、このOSSの開発チームはクラウドサービスを提供しているために、ローカルで保存されているデータも暗号化をかけている。そして、バージョンアップでデータが復旧できなくなり、私の大事な資料がローカルで保存されているものの、見えなくなってきた。
あの時はショックを受けて、「いっそ自分でNotionみたいなやつをつくろう」と思い切った。
それは半年前のことでした。
なぜTauri
READMEには書いてあるので、ここで同じことを書くね。
ローカルで暗号化・圧縮をせず、ありのまま保存されている資料を読み取って、一元管理のアプリが欲しい。そしてできるだけ軽いやつが良い。左記の方針でいくつかフレームワークを調べてみた。
- Electron:有名なFWだったが、重い。Chromiumなんかいらんわ
- Flutter:バックエンドはさておき、フロントエンドも新しい言語を勉強しては負担が大きい。そもそも私はフロントエンドにそんなに興味を持っていない。Reactでできたらそれで良い
- Wails:これを聞いていた時点で本プロジェクトがすでに始まった…
- Tauri:軽くて簡単。そしてRustを勉強するチャンス
というわけで、Tauriを選んでた。
プロジェクトの立ち上げに
Tauriの公式サイトを見ながらプロジェクトを作った。特に問題はなかった。
ファイル構成
Root
├ src:フロントエンド。どこでも見れるViteで立ち上げたReact
├ src-tauri:バックエンド
│├ capabilities:アプリの権限配置。windowのタイトルを変更できるかなどはここで設定
│├ src:Rustソースファイル
│├ target:デバッグファイル。開発とともに膨大化するので定期的にクリアして良い
│├ Cargo.toml:Rustのライブラリー管理
│└ tauri.conf.json:アプリの基本配置。中身を見たらわかるだろう
├ package.json:Tauri(Nodejs)のライブラリー管理
├ tsconfig.json:TypeScriptの基本配置
└ vite.config.ts:Viteの基本配置
ライブラリー利用
フロントエンド
- react-dnd-treeview:ファイルツリー用。Tauriのdndと競合しているので、tauri.conf.jsonでTauriのdndを無効にしないと動けない
- MUI:紹介するまでもないだろう
- dayjs:日付&時刻解析用。今は未使用
- i18next:i18n用。機能が強いわりに実装が簡単
- react-markdown:markdownレンダー用
- remark-gfm:同じくmarkdownレンダー用
- react-syntax-highlighter:markdownソースコードレンダー用
- zustand:Hook化状態管理。神
バックエンド
- uuid:ファイル&フォルダー(ノードと呼ばれる)のidを作成用。v4のみ使っている
- trash:ノードを削除する時、ゴミ箱に入れる用
- regex:正規表現(こいつはRustのstdに入れてないのは意外だった)
感想
「Tauriのバグが多くて最悪」
と聞いていたが私のアプリが簡単のせいか、バグとかは特になかった。
ただ、公式資料が少なすぎて「これどうすれば?」と思っていた時が多かった。特にバックエンドのほう。
実際にできたアプリは、サイズが20MB程度で、メモリー使用は~200MB程度です。私は満足している。
「Rustは難しくて醜い」
まぁ、難しさは否定しない。最初は練習としてコンパイルエラーのないコードを書くだけでかなりの手間がかかっていた。
その後GitHub Copilotに書いてもらったコードをしっかり読んで、隅々まで理解してきたら、だいぶ楽になってきた。
Rustはメモリーリーク防止と型安全性に結構工夫している。慣れたら苦労せずにRustを書ける。そして厳しい型安全性が確保されているうえで、ソースコード全体をしっかり把握しているのは気持ちいいです。
レポジトリ