TauriとLeptosで作るデスクトップアプリ(2)カウンタコンポーネントを作成する
はじめに
TauriとLeptosでデスクトップアプリを作っていきます。今回は、シンプルなカウンタを作成します。
関連記事
環境
- Windows 11 Home
- Rust 1.81
- Tauri 2.0.1
- Leptos 0.7.0-rc0
コンポーネントライブラリThaw UIを導入する
Leptosのコンポーネントライブラリはいくつかありますが、個人的にデザインが気に入っているThaw UIを使います。
./apps/src-ui/Cargo.toml
の[dependencies]
にthaw
を追加します。
VS Codeにフォーマッタを導入する
Leptosではview!
マクロを用いてRustソースコードの中にHTMLを書いていきます。VS Codeでソースコードを編集するなら、フォーマッタleptosfmt
を導入すると便利です。
leptosfmt
をインストールします。
> cargo install leptosfmt
.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
を宣言するだけです。
counter.rs
にカウンタを実装します。Leptos公式ページの例を参考にしました。
<Button>
コンポーネントのon_click
属性でボタンがクリックされたときの動作を指定します。RwSignal
のメソッドを使っています。[+1]ボタンと[-1]ボタンであえて異なった記述をしています。[Clear]ボタンではクロージャをview!
マクロの中に直に書いています。
SimpleCounter
コンポーネントをアプリのApp
コンポーネント内に配置します。
ConfigProvider
コンポーネントで全体を囲うことで、中のコンポーネントにThaw UIのスタイルが適用されます。SimpleCounter
コンポーネントは属性を2つ取ります。コンポーネントの定義における引数が、そのまま属性となります。初期値0、ステップ1を指定しています。
ライブラリクレートのクレートルートlib.rs
に、モジュールcomponents
の宣言を追加します。
準備が整いました。プロジェクトを実行します。
> cargo tauri dev
カウンタがThaw UIライブラリのスタイルで表示され、ボタンが期待通りに動作すれば完成です。
カウンタコンポーネントをテストする
wasm-packを使ってカウンタコンポーネントの動作をテストします。
テストコードはLeptos公式サイトを参考にしました。
まず、./apps/src-ui/Cargo.toml
の[dev-dependencies]
にテスト用のパッケージを追加します。
テスト用ディレクトリtests
を作成します。
tauri-leptos-example
├─ apps/
│ ├─ src-tauri/
│ └─ src-ui/
│ ├─ src/
│ ├─ tests/
│ │ ├─ common/
│ │ │ └─ mod.rs
: : └─ counter.rs
他のコンポーネントでも使う可能性のあるコードをcommon
モジュールにまとめておきます。
カウンタコンポーネント用のテストコードは以下になります。
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
を開きます。下のようにテストにパスしたら成功です。
--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; ...
サンプルコード
今回作成したプロジェクトは以下からダウンロード可能です。
Discussion