Rails とモダンフロントエンド(React / Vue)を組み合わせる方法のまとめです。 Rails 7 以降は Webpacker が廃止され、フロントエンドの統合方法が大きく変わりました。
2025年現在では、次の 3 方式が主流です:
ここでは React と Vue の概要と、Rails での導入方法サンプルを紹介します。
| 項目 | React | Vue |
|---|---|---|
| 特徴 | UI ライブラリ(View に特化) | フル機能のフレームワークに近い |
| 学習コスト | JSX・Hooks に慣れが必要 | 直感的で学びやすい |
| 書き方 | JSX(JavaScript 内に HTML) | SFC(.vue ファイル)で構造が明確 |
| 適性 | 大規模アプリ、柔軟な設計 | 中小〜大規模、テンプレート志向 |
Rails と組み合わせる場合、どちらも “Rails API + SPA” 構成と相性が良い です。
最も一般的で、保守性も高い構成です。
rails new myapp --api
class Api::PostsController < ApplicationController
def index
render json: Post.all
end
def create
post = Post.new(post_params)
if post.save
render json: post, status: :created
else
render json: { errors: post.errors }, status: :unprocessable_entity
end
end
end
useEffect(() => {
fetch("/api/posts")
.then(res ⇒ res.json())
.then(data ⇒ setPosts(data));
}, []);
fetch("/api/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ title: "テスト" })
});
SPA 分離ほど重くしたくない場合に最適。
bundle add vite_rails
bin/vite install
bin/vite add react
import React from "react";
import ReactDOM from "react-dom/client";
const App = () ⇒ <div>Hello React!</div>;
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
<div id="root"></div>
<%= vite_javascript_tag "application" %>
Rails 7〜8 では、この Vite組み込み方式が最もストレスが少ない らしいですね。
画面の一部にだけ React/Vue を導入したい場合。
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<div id="root"></div>
<script>
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<h1>Hello React</h1>);
</script>
backend/ # Rails API
app/controllers/api/...
app/models/
config/
frontend/ # React or Vue
src/
components/
views/
今は、Rails は API としての役割に絞り、フロントは React/Vue で完全に構築する構成が多いだね。