メニューを閉じる

テクノデジタルグループ

メニューを開く

2024.02.26

Rust

Rust+SvelteKitでデスクトップアプリケーションを作ってみた

まえがき

こんにちは!普段はインフラエンジニアをやっているMです。この記事では、RUST+SvelteKitを使用してデスクトップアプリケーションを作成する過程を紹介します。

今回やりたかったこと

この記事も含めて、自分は記事の原稿作成はMarkdownで行っています(前回の記事も)。しかし、会社で使われているCMSで記事作成はリッチテキストエディタか、HTMLでの記述しかできず、Markdownをコピペしても、書式などをとりこんではくれません。

CMS側でMarkdownに対応するには、プラグインの導入が必要です。しかし、プラグインをインストールする申請を出すのが非常に面倒でした。

というわけで、自前でMarkdownからHTMLに変換するツールを作ってみることにしました。

今回やったこと

● Tauri for SvelteKit のインストール

● SvelteKitのインストール

● SvelteKitでGUI作成

● RustでMarkdownをHTMLにパースする処理を追加する(ほぼライブラリのおかげ)

苦労した点

私の普段の業務はクラウド(99%AWS)の設計と設定がメインなので、フロントエンド技術はほぼ初体験(HTMLとCSSでダサくて動かない画面がかろうじてつくれたくらいのど初心者、DOMとJSはなんだかよくわかっていない)でした。

そのため、いきなりフロントエンドフレームワークのSvelteKitを勉強しはじめて、コンポーネント間のデータの受け渡しや、CSSで思った通りの画面実現する方法を探すのにほとんどの時間を取られました。

SvelteKit(およびSvelte)がNext.js(React)やNuxt(Vue)よりも新興のフレームワークということもあり、Qiitaなどにマネできる日本語記事が少ないというのも、時間がかかった一要因ですね。

完成像

↑クリックすると再生できます。

上のGifが今回作成するアプリの完成像です。

作者の環境

  • OS Windows11 Pro
  • CPU AMD Ryzen 7 5800U
  • メモリ 16.0 GB
  • NodeJS バージョン v18.15.0

環境構築

それでは、環境構築の手順を以下に示します。

0.Rustのインストール(未インストールの場合):

Rustの公式ウェブサイトからRustをダウンロードしてインストールします。詳細は公式サイトを参照してください

1.SvelteKitのインストール:

今回はpnpmを使用しました。(インストールされていない方は公式サイトを参照してインストールしてください。)

以下のコマンドを実行します。

いくつかの質問に答えて、プロジェクトフォルダを作成しました。

プロジェクトの作成が完了すると以下のコマンドを実行する指示が表示されます。

実行すると以下のようなウィンドウが起動するでしょう。

 

これで環境構築は完了です。

実際にデスクトップアプリケーションの開発を始める準備が整いました。

実装していく

それでは、今回実際に実装したコードを参照しながら解説していこうと思います

1.RustでMarkdownをHTMLにパースする処理を追加する:

Rustのパッケージ管理ツールであるCargoを使用して、MarkdownをHTMLにパースする処理を追加します。具体的な手順は以下の通りです。

Cargo.tomlファイルに以下の依存関係を追加します。

■ Cargo.toml

ソースコードに以下の処理を追加します。

■ main.rs

フロントエンドのSvelteKitからRustで実装した処理を呼び出すAPIとして登録しているのが以下のコードです。

■ main.rs

.invoke_handler(tauri::generate_handler![exchenge_2_html]) この部分で関数をコマンドとして登録しています。

コマンドとして登録する関数には#[tauri::command] のアノテーション(注釈)をつけます。今回のコードでは以下の通りです。

■ main.rs

関数の引数には後述しますが、svelteのコードから関数を呼びだす際に指定する引数名と同一名の変数名を指定します。

2.SvelteKitでGUIを構築する:

SvelteKitでは/<projectfolder>/src/ に表示するページなどを構築していきます。今回は以下のようなフォルダ構造です。

lib 配下にコンポーネント。

routes 配下に表示するページという構成になっています。

routes直下の+page.svelte がアプリ起動時に表示されます。

+page.svelte の中身はこのようになっています。

■ +page.svelte

このページでは受け渡し用の変数の定義とコンポーネントの読み込み、ページ全体のスタイリングを行っています。

エディタへの書き込みと内容の読み取り、変換コマンドの呼び出しはコンポーネントの方でやっています。

各コンポーネントのコードは以下のようになっています。

■ Bottorn.svelte

■ Editor.svelte

Lixicalでエディターを作ろうとして挫折した形跡がありますね 😅

index.tsは初期に作成されるライブラリー用のファイルです。

Tauriの場合は、ロジックをRustに持たせるので、あまり用はないですが、$lib でライブラリを読み込むことができます。

上記に加えて、ボタンで使用しているTauri API(クリップボードCopy とAlert)を許可するために、src-tauri\tauri.conf.json に以下のオプションを追加しています。

■ tauri.conf.json

以上で実装は完了です。

viteによってホットロードに対応しているので、GUIの変更はファイルを保存すれば自動で変更されてきたかと思います。

アプリを終了していた方は以下を実行してください。

最終的にこのような画面のアプリケーションが完成すると思います。

終わりに

お疲れ様でした!

これでMarkdownをHTMLに変換するGUIアプリの完成です。

ぶっちゃけ一番時間がかかったのはGUIの部分でした。このデザインで力尽きるまで10時間くらいはいじっていたと思います。

デザインセンスがほしい……。

それはともかく、この記事が皆様のTauriとRust、あとSvelteKitエンジニア生に役に立つことを願って、長話を終わりにしようと思います。

次回があれば、作ったアプリをWindowsのほかの環境でも動かせる実行ファイルにビルドして、インストーラーにパッケージングする記事を書くつもりです。

以上、Mでした。


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事

SNS共有