Hotwire(HTML Over The Wire)は、Rails 7 で標準採用された「JavaScript を最小限に抑えながら SPA のような操作感を実現する仕組み」です。Rails に深く統合されており、特に以下の構成要素が中心になります。
Rails 5〜6 時代と比較すると、フロントエンド構成やページ遷移の仕組みが大幅に変化しました。
通常のリンクやフォーム送信を Ajax 化し、ページ全体を再描画せず高速な遷移を実現します。
特徴
ページの一部分だけをロード・更新できる仕組みです。
<turbo-frame id="post_1">
<%= render @post %>
</turbo-frame>
用途
サーバー側から DOM 操作(append, remove, replace など)を指示できます。
<%= turbo_stream.append "posts" do %>
<%= render @post %>
<% end %>
最小限の JavaScript を HTML アノテーションで扱う仕組み。
HTML側
<div data-controller="hello">
<button data-action="click->hello#greet">Click</button>
</div>
JS側
export default class extends Controller {
greet() {
alert("Hello!");
}
}
特徴
React/Vue を使わず、ERB 中心で UI を組める。
Turbo Drive が SPA に近い体験を実現。
HTML を返す仕組みのため、検索エンジンと相性がよい。
状態管理が多い場合は React や Vue が有利。
ゲーム、エディタ、地図アプリなどは JS フレームワークが向く。
Rails 7 以降ではデフォルトで Hotwire がセットアップされています。
rails new myapp
Rails 6.1 以前でも Hotwire gem + JavaScript パッケージを追加すれば導入可能。
リンク・フォームが自動で高速化される。
部分的な UI 更新を簡単に実装できる。
例:インライン編集画面など
<turbo-frame id="edit_post_1">
<%= render "form", post: @post %>
</turbo-frame>
リアルタイム更新や DOM 操作をサーバー側から指示。
<%= turbo_stream.replace @post do %>
<%= render @post %>
<% end %>
| 分類 | Hotwire | React / Vue |
|---|---|---|
| 規模 | 小〜中 | 中〜大 |
| 状態管理 | 弱い | 強力 |
| SEO | 強い | 場合による |
| リアルタイム | 標準で簡単 | 追加ライブラリ必要 |
| 学習コスト | 低い | 中〜高 |
| Rails 統合 | 最強 | API 化が必要 |