RustのcdylibをバックエンドにElectronをフロントエンドにするcargo-generateプロジェクトテンプレートを公開したメモ
「RustのcdylibをバックエンドにElectronをフロントエンドにする」プロジェクトを3秒くらいでお手軽作れるcargo-generate
できるプロジェクトテンプレートを公開しました。
- template-rust-backend-with-electron-frontend https://github.com/usagi/template-rust-backend-with-electron-frontend
使い方:
cargo generate --git https://github.com/usagi/template-rust-backend-with-electron-frontend.git
使い方としての細かいことは README.md#Usage を読んでください。
このメモの主体は↑の使い方ではなく、作る最中に遭遇したトラブルシュートのメモです。
作るまでに遭遇したトラブルたち
- Rust の GUI Toolkit を採用したプロジェクトを作ろうと思ったけれど:
- さいきん試した Rust の GUI Toolkit 的な crate たちと日本語アプリでの実用性のメモ - C++ ときどき ごはん、わりとてぃーぶれいく☆
- Rust 純度が高い利点 = 開発環境の統一性が高まりツールチェインや言語を使い分ける労力が減り、結果的にプロジェクトの生産性が向上しやすくなる
- Rust の得意な事 =
- 高速な処理速度の実現 → 参考: https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/rust.html
- 安全な型システムによる実装時の凡ミス低減および生産性の保持
- 比較的充実度の高いライブラリーとパッケージマネージャーのエコシステム
- ソースコードに対応した単体試験や文書記述性の高さ、文書とツールチェインとパッケージマネージャーのエコシステムの結合による生産性の高さ
- 「Firefoxで有名なMozillaが始めたやつです」と言えるので非技術者や偉い人にも相手がソフトウェア技術からそれほど遠くなければ話が少なくとも上辺では通じて納得して貰いやすい
- Rust の不得意な事 =
- ∴ バックエンド部を Rust で作りビジネスロジックを詰め込みつつ、フロントエンド部は特にGUIについてより得意でUXの向上要求にも対応しやすい他の要素技術を融合したプロジェクトが少なくとも"今"は欲しい
- Electron を GUI フロントエンド部に採用しようと思い:
- ① Node.js をフロントエンドに Rust バックエンドをマーシャリングするのです:
- Rust ( cdylib ) <--> Node.js ( 🙅♀️node-ffi -> 🙆♀️node-ffi-napi ): Node.js と FFI の 2020-03-18 時点でのメモ; node-ffi 系 → node-ffi-napi 系 - C++ ときどき ごはん、わりとてぃーぶれいく☆
- ② Electron 使いたい ≃ Electron + React + ... + ... + ... + Node.js + ES6 + Chromium; 爆裂するテクノロジーのスタッキング (すべて完全に理解して使うのは人類には不可能。たぶん)
- ③ Electron で node-ffi-napi して native library 呼ぶと "値" はうまいこと Electron 末端まで渡ってくるけれど…
- Rust ( cdylib ) で醸した (メモリーアロケートした) メモリーアドレス (ポインター) が Electron で読み出す迄に Electron のプロセスレベルのアイソレーションとIPCの機構を渡る中で内部的なクローンのアドレスにオフセットが化けて…
- つまりこういう事が起きた: node.js - How to get the correct native memory address in electron + node-ffi-napi - Stack Overflow
- ① Node.js をフロントエンドに Rust バックエンドをマーシャリングするのです:
こんな事がありました。ありましたが💪で解決できたのでとりあえずこの Rust をバックエンドに cdylib を書いて Electron をフロントエンドにイケイケできるプロジェクトのテンプレートを cargo-generate できるように公開しました。👍
ちなみに、この template-rust-backend-with-electron-frontend で GUI 部分をイケイケに作り込む場合はさらに TypeScript やクライアントサイド向けのフレームワークなどの要素技術スタックがアーキテクチャーに仲間入りしたり、 React を Angular / Vue へ変えたくなる事もあるかもしれません。🤔 バックエンド部の Rust も何をするアプリかにより crate を追加し、ビジネスロジックをにゃんにゃん書きます。もちろん、最小限の試作程度ならこの CSS なにそれ美味しいの的な HTML で GUI をごりっと書いて Rust でビジネスロジックの核心的な部分を書いて十分、それもアリです。
全ての技術要素を完全に理解して使う事は難しいと思いますが、このテンプレートを使えば Rust と Electron で可能性は無限大かつ現実的なやつがすぐに作れちゃうぞ的な美味しい感じでわくわくプロジェクトを始められると思います。たぶん。Rust 純度高めでも QML みたいなお手軽GUIホイホイできるようになるその日まで。(ΦωΦ)フフフ…