Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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 など)があり、「サーバー描画かクライアント描画か」の線は実際にはぼやけています。ここでは大づかみの違いとして捉え、細部はそれぞれの技術で確認してください。

Hotwire と SPA の比較軸。描画・状態・通信・JavaScript 量の 4 軸上で両者の位置を対比し、SSR メタフレームワークで境界がぼやけることも示すスペクトラム図

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 採用判断チェックリスト

CRUD 中心か、クライアント状態、オフライン、チーム、API 要否の問いから、Hotwire 向きか SPA/混在向きかを導く図。

最後に、判断の目安をまとめます。次に多く当てはまるほど、Hotwire が向きます。

  • データの一覧・作成・編集が中心である
  • クライアント側に持つ状態は、それほど大きくない
  • オフライン対応は要らない
  • チームは Rails に強く、JavaScript は少なくしたい
  • Web のためだけなら、JSON API は必須ではない

逆に、クライアント状態が大きい・オフラインが要る・すでに API 中心、に多く当てはまるなら、SPA や混在を検討します。Hotwire は万能ではありませんが、多くの業務アプリにとって、十分で、保守しやすい選択肢です。

第37章では、Hotwire と SPA を選択肢として比較しました。次の第38章では、Hotwire の現在地と今後を見て、本書を締めます。

参考資料