🐥

TauriとLeptosで作るデスクトップアプリ(2)カウンタコンポーネントを作成する

2024/08/18に公開

はじめに

TauriとLeptosでデスクトップアプリを作っていきます。今回は、シンプルなカウンタを作成します。

関連記事
環境
  • Windows 11 Home
  • Rust 1.81
  • Tauri 2.0.1

https://tauri.app/

  • Leptos 0.7.0-rc0

https://leptos.dev/

コンポーネントライブラリThaw UIを導入する

Leptosのコンポーネントライブラリはいくつかありますが、個人的にデザインが気に入っているThaw UIを使います。

https://thawui.vercel.app/

./apps/src-ui/Cargo.toml[dependencies]thawを追加します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/Cargo.toml#L6-L13

VS Codeにフォーマッタを導入する

Leptosではview!マクロを用いてRustソースコードの中にHTMLを書いていきます。VS Codeでソースコードを編集するなら、フォーマッタleptosfmtを導入すると便利です。

https://github.com/bram209/leptosfmt

leptosfmtをインストールします。

> cargo install leptosfmt

.vscode/settings.jsonに以下を追加します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/.vscode/settings.json

カウンタコンポーネントを作成する

Leptosフロントエンドクレート./apps/src-uiにコンポーネントをまとめたモジュールcomponentsを作ります。その中にサブモジュールcounterを作ります。ディレクトリ構成は以下のとおりです。

tauri-leptos-example
├─ apps/
│  ├─ src-tauri/
│  └─ src-ui/
│     ├─ src/
│     │  ├─ components/
│     │  │  ├─ counter.rs
│     │  │  └─ mod.rs
│     │  ├─ app.rs
│     │  ├─ lib.rs
:     :  └─ main.rs

mod.rsは単純にサブモジュールcounterを宣言するだけです。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/src/components/mod.rs

counter.rsにカウンタを実装します。Leptos公式ページの例を参考にしました。

https://github.com/leptos-rs/leptos/tree/main/examples/counter

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/src/components/counter.rs

<Button>コンポーネントのon_click属性でボタンがクリックされたときの動作を指定します。RwSignalのメソッドを使っています。[+1]ボタンと[-1]ボタンであえて異なった記述をしています。[Clear]ボタンではクロージャをview!マクロの中に直に書いています。

SimpleCounterコンポーネントをアプリのAppコンポーネント内に配置します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/src/app.rs

ConfigProviderコンポーネントで全体を囲うことで、中のコンポーネントにThaw UIのスタイルが適用されます。SimpleCounterコンポーネントは属性を2つ取ります。コンポーネントの定義における引数が、そのまま属性となります。初期値0、ステップ1を指定しています。

ライブラリクレートのクレートルートlib.rsに、モジュールcomponentsの宣言を追加します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/src/lib.rs

準備が整いました。プロジェクトを実行します。

> cargo tauri dev

カウンタがThaw UIライブラリのスタイルで表示され、ボタンが期待通りに動作すれば完成です。

counter

カウンタコンポーネントをテストする

wasm-packを使ってカウンタコンポーネントの動作をテストします。

https://rustwasm.github.io/wasm-pack/

テストコードはLeptos公式サイトを参考にしました。

https://github.com/leptos-rs/leptos/tree/main/examples/counter_without_macros

まず、./apps/src-ui/Cargo.toml[dev-dependencies]にテスト用のパッケージを追加します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/Cargo.toml#L15-L21

テスト用ディレクトリtestsを作成します。

tauri-leptos-example
├─ apps/
│  ├─ src-tauri/
│  └─ src-ui/
│     ├─ src/
│     ├─ tests/
│     │  ├─ common/
│     │  │  └─ mod.rs
:     :  └─ counter.rs

他のコンポーネントでも使う可能性のあるコードをcommonモジュールにまとめておきます。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/tests/common/mod.rs

カウンタコンポーネント用のテストコードは以下になります。

https://github.com/daizutabi/tauri-leptos-example/blob/0.2/apps/src-ui/tests/counter.rs

wasm-packをインストールします。

> cargo install wasm-pack

テストを実行します。

> wasm-pack test --chrome apps/src-ui --test counter

--chromeオプションを指定することによって、Chromeでテストを行います。Chromeがインストールされている必要があります。他には--node, --firefox, --safariが選択できるようです。apps/src-uiはテストしたいクレートのディレクトリです。--testオプションでテスト対象を選びます。今回はコンポーネントが1つしかないので必要ありませんが、複数あるときには指定が必要です。cargo testコマンドと違って、1つのテストファイルしかテストが実行されないためです。(一度に複数のテストをする方法があるかもしれません。)

テストを実行してから、ブラウザでhttp://127.0.0.1:8000を開きます。下のようにテストにパスしたら成功です。

test

--headlessオプションを使うことで、ブラウザを開くことなくテスト結果を確認できます。また、このときにはtestsディレクトリにある全ファイルを一度にテストできるため、--testを指定することは必須ではありません。

> wasm-pack test --chrome --headless apps/src-ui
[INFO]: Checking for the Wasm target...
   Compiling src-ui v0.2.0 (...)
:
test result: ok. 3 passed; ...

サンプルコード

今回作成したプロジェクトは以下からダウンロード可能です。

https://github.com/daizutabi/tauri-leptos-example/tree/0.2

GitHubで編集を提案

Discussion