第37章 React / Vue / SPA との使い分け
この章のねらい
Hotwire を学ぶと、「では React や Vue のような SPA は要らないのか」と考えたくなります。しかし、これは「どちらが優れているか」の問題ではありません。向き不向きがあり、選択肢の問題です。
この章では、Hotwire と SPA を対立ではなく選択肢として比較し、どんなときにどちらが向くかを整理します。
37.1 比較する軸
両者を分ける主な軸は、次のとおりです。
- HTML を誰が組み立てるか。Hotwire はサーバー。SPA はクライアント(JavaScript)。
- 状態をどこに持つか。Hotwire は基本サーバー(と HTML)。SPA はクライアントに大きな状態を持つ。
- 通信に何を流すか。Hotwire は HTML。SPA は主に JSON。
- JavaScript の量。Hotwire は少なめ。SPA は多め。
この軸で見ると、両者は「描画と状態を、サーバー寄りに置くか、クライアント寄りに置くか」で分かれていると分かります。
ただし、これは高レベルの単純化です。近年は SPA 側にも、サーバーで描画するメタフレームワーク(Next.js など)があり、「サーバー描画かクライアント描画か」の線は実際にはぼやけています。ここでは大づかみの違いとして捉え、細部はそれぞれの技術で確認してください。
37.2 Hotwire が強い場面
Hotwire が向くのは、次のような場面です。
- サーバー中心の CRUD アプリ。Relay のような、データの一覧・作成・編集が中心のアプリ。
- コンテンツ中心のアプリ。記事や管理画面など、サーバーが持つデータを見せるのが主な役割のもの。
- Rails に強いチーム。サーバー側の知識を活かし、JavaScript の量を抑えたい場合。
- 速く作り、速く直したい。サーバー側で機能を足せるので、反復が速い。
多くの業務アプリは、この範囲に収まります。Relay も、Hotwire で無理なく作れました。
37.3 SPA が強い場面
一方、SPA が向くのは、次のような場面です。
- クライアント側の状態が大きい。描画ツール、表計算、複雑なフィルタを多段で持つダッシュボードなど、クライアントで重い状態を扱う UI。
- オフラインや高い即応性。ネットワークが切れても動く、ネイティブアプリ並みの操作感が要る場合。
- すでに API が中心。複数のクライアント(Web・モバイル・外部連携)が同じ API を使う設計。
「サーバー往復を挟まずに、クライアントだけで完結させたい操作」が多いほど、SPA が向きます。
37.4 混在させる場合
「全部 Hotwire か、全部 SPA か」だけが選択肢ではありません。混在もできます。
たとえば、アプリの大部分は Hotwire で作り、特に複雑な 1 つのウィジェット(高機能なエディタなど)だけ、React のコンポーネントを島のように埋め込む、という形です。Stimulus から、その島を初期化・破棄します(第22章の外部ライブラリ連携と同じ考え方です)。
「複雑なところだけクライアントに寄せ、それ以外はサーバー中心のまま」という混在は、現実的な選択肢です。最初から全部を SPA にしなくても、必要な箇所だけ強い道具を使えます。
37.5 API 設計が必要になる場面
判断の分かれ目の一つが、API です。
Hotwire は HTML を返すので、Web のためだけなら、JSON API は要りません。しかし、モバイルアプリ(ネイティブで作り込む場合)や、外部サービス連携で、どうせ JSON API が要るなら、話が変わります。
ただし、Hotwire Native(第9部)を使えば、モバイルのためだけに JSON API を用意しなくても済むことがあります。Web の HTML をそのまま使うからです。「本当に JSON API が必要か、それとも HTML で足りるか」を見極めると、不要な API 設計を避けられます。
37.6 チームのスキルと保守コスト
技術選定は、チームの事情も含めて決めます。
Rails に強く、JavaScript の専任が少ないチームなら、Hotwire は学習・保守のコストを抑えられます。サーバー側の知識がそのまま活きるからです。逆に、フロントエンドに強いチームで、すでに SPA の資産があるなら、SPA を選ぶ合理性もあります。
「技術的に何ができるか」だけでなく、「このチームが、これを何年も保守できるか」まで含めて判断します。これが、第10部の視点「使い続けて保守できるか」です。
37.7 採用判断チェックリスト
最後に、判断の目安をまとめます。次に多く当てはまるほど、Hotwire が向きます。
- データの一覧・作成・編集が中心である
- クライアント側に持つ状態は、それほど大きくない
- オフライン対応は要らない
- チームは Rails に強く、JavaScript は少なくしたい
- Web のためだけなら、JSON API は必須ではない
逆に、クライアント状態が大きい・オフラインが要る・すでに API 中心、に多く当てはまるなら、SPA や混在を検討します。Hotwire は万能ではありませんが、多くの業務アプリにとって、十分で、保守しやすい選択肢です。
第37章では、Hotwire と SPA を選択肢として比較しました。次の第38章では、Hotwire の現在地と今後を見て、本書を締めます。
参考資料
- Hotwire: https://hotwired.dev/
- Turbo Handbook(Introduction): https://turbo.hotwired.dev/handbook/introduction