RailsではなくRocketでHotwire(Turbo)する その1

HotwireというかTurboは単なるJavaScriptのライブラリなので、Railsじゃないと使えないということはない。Railsでturbo-rails gemを使うととても便利に使えることは間違いないけど。

ということでRust製のウェブアプリケーションフレームワークのRocketでアプリを書くのを試すついでに、Ralis以外でHotwireを導入することを試してみた。

成果物と導入、Turboのおかげでよくなっているポイントを1つ書く

成果物

できたのはこれ。本家のデモと同じくチャット

github.com

こんな感じに動く。左と右で2つのブラウザでアプリを開いているところ

導入

RocketやRails以外のフレームワークでTurboを導入する場合は、webpackなど何かしらJavaSciprtのbunderを使って、通常のnpm packageを使うのと同じ方法で使える。

Turbo DriveとTurbo Framesに関してはインストールしてTurboをjsで読み込んでおくだけで有効になるのでなんの手間もない。

Turboが活きているポイント:フォーム周りの動的な振る舞い

部屋を追加するところや、部屋の名前を変更するところで、ページ遷移せずにフォームが追加されたりプレーンテキストだった箇所がフォームに変更されたりしている。これはTurbo Framesを使っている。Turbo Framesを使うとページを複数のフレームに分割することができて、分割したフレーム内でページ遷移が発生すると、ページ全体を書き換えず対応するフレームの箇所だけを遷移先のページのものに置き換えてくれる。

f:id:totem_3:20210128150303p:plain

この+ボタンは/rooms/newというURLの部屋追加画面への単なるリンクで、Turboを読み込むことをやめるとただそのページに遷移するだけになる。遷移先の/rooms/newのページは右の画面で、フォームだけがある雑なページが用意されている。

それぞれのページで赤で囲んだ箇所が turbo-frame というタグで囲まれたひとつのフレームになっていて、同じidを付けているので、この中でページ遷移をするとページ全体が遷移するのではなくこのフレームだけが書き換わる。

部屋の名前を変更する箇所も同様で、/rooms/editという雑な編集ページが用意されていて、ペンマークのボタンは編集ページへのただのリンクになっている。

トップのチャット画面のタイトル部分と、編集ページのフォーム部分が Turbo Frame になっているので、ペンボタンを押して遷移するとタイトル部分がフォームに書き換わり、submitするとまたタイトルになる。

このように単純な複数の静的なページと、通常のページ遷移だけで動的なページが作れるのはいい感じ(かもしれない)

まとめ

  • Turbo(の一部)の導入はRailsじゃなくてもとても簡単
  • サーバサイドでビューをレンダリングしていて、静的なページをちょっとリッチに(?)したいときに便利かもしれない
  • その2に続くかもしれない