莉光迷站
にじさんじ所属のVtuber卯月コウさんと魔界ノりりむさんのコンピ「おりコウ」のファンサイトです。バックエンド・フロントエンドともにRustを用いています。 以下は開発中に得たフロントエンド部分にRustを利用するメリットとデメリットを紹介します。
フロントエンドにRustを用いるメリット
型システムによる安全性
- ドメイン層をバックエンドとフロントエンドの両方で利用できるため、フロントエンド側で型の安全性が保障できます。結果的にパース部分をドメイン層にまとめることができます。
- フェッチ部分でもserdeによってエラーハンドリングが容易になります。サーバー側のエラーをそのままフロントエンドに送ることができます。
- 厳密なエラーハンドリングができます。エラーが起きうる箇所が分かりやすく、エラーをキャッチした場所・どこでどんなエラーが起こったか(エラー文字列に含める)をデバッグ情報に追加できます。エラーの種類ごとに処理を変えたい場合でもmatch式を用いて簡潔かつ列挙体の安全性を発揮できます。
テスト
- フェッチ部分や最初のレンダリングはローカルのサーバーサイドでコンパイルできるため,テストをサーバーサイドで行うことができます。便利なテストクレートが利用でき、非同期テストも力を最大限発揮できます。
条件付きコンパイル
- サーバー側と独立して開発するためにフェイクデータを利用したい場合でも、条件付きコンパイルによってプロダクトと同じインターフェースで利用できます。フィーチャーフラッグを変えるだけでフェイクデータ・テストサーバー・本番サーバーのデータを切り替えられます。
- 開発用コード・プロダクションコードとバージョンを分けながら開発ができます。wasmバイナリに含めないので不必要にサイズが大きくなることも防げます。
- 条件付きコンパイルによってドメイン固有型をバックエンド側と異なるインターフェースとして制御できるため、アクセスを制限するためのDTOは不必要です。
所有権
- 各クレートでRAIIが徹底されているため,リソースの解法を分かりやすく行うことができます。所有権があるためリソースの解法を保証できます。
- 所有権によってどこで変更されうるか、つまりどのような値を取るのかが変数から分かりやすいです。フロントエンドでは親から子へデータが目まぐるしく渡され、場合によっては双方向バインディングがありますが、所有権があるため別途スマートポインタ―を用いないと他の箇所で変更することはできず・暗黙的にコピーされることもありません。
フロントエンドにRustを使うデメリット
- 所有権があるためクロージャーで状態を変更する際に内部可変性が必須になります。つまりコールバックで状態を変更していく仕組みとはもともと相性が悪いです。
- どうしてもファイルサイズ・バイナリサイズが大きくなってしまいます。