「React + Rails」と「React on Rails」何がちがうの?
はじめに
タイトルの質問に答えられますか?
私は答えられませんでした。「React + Rails」と「React on Rails」どちらを使えばいいのか、そもそも違いが何なのか全く分かりませんでした。
私の経験:
個人開発: React + Rails(別々に構築)
業務: React on Rails(gem使用)
業務でReact on Railsに出会ったときは「そんなものがあるのか」程度であり、個人開発でReact + Railsを採用した当時は深く考えておらず「React実際に使いたい」という理由だけで選んでいましたが、本当にこの選択が正しかったのか、両者の違いを深掘りすることにしました。
React + Railsとは
React + Railsは、ReactとRailsを完全に分離して構築する方法です。
構成
my-app/
├── frontend/ # Reactアプリ
│ ├── src/
│ └── package.json
└── backend/ # Railsアプリ(APIモード)
├── app/
└── Gemfile
特徴
完全分離アーキテクチャ
2つの独立したプロジェクト
RailsはAPIモードで作成
別々にデプロイ可能
通信方法
// React側
fetch('http://localhost:3000/api/wines')
.then(response => response.json())
# ruby Rails側
class Api::WinesController < ApplicationController
def index
render json: Wine.all
end
end
メリット・デメリット
メリット:
完全な独立性(技術選択の自由)
マイクロサービス化しやすい
チーム分担が容易
デメリット:
CORS対応が必要
2つのサーバーを管理
デプロイが2箇所
React on Railsとは
React on Railsは、shakacode社が開発したgemで、RailsアプリにReactを統合します。
構成
my-app/
├── app/
│ ├── controllers/
│ ├── views/ # ERBビュー
│ └── javascript/ # Reactコンポーネント
└── Gemfile # react_on_rails gem
特徴
統合アーキテクチャ
ReactをRailsビュー内に埋め込む
単一プロジェクトで管理
SSR(サーバーサイドレンダリング)対応
使用例
# コントローラー
def index
@wines = Wine.all
end
<!-- ビュー -->
<%= react_component("WineList", props: { wines: @wines }) %>
メリット・デメリット
メリット:
セットアップが簡単(1プロジェクト)
SSR標準対応(SEO対策)
Railsの機能をフル活用
1つのサーバーで完結
デメリット:
フロントとバックエンドが密結合
gem依存
大規模化すると管理が複雑
どちらを使うべきか
React + Railsを選ぶ場合
✅ 大規模・長期運用プロジェクト
✅ モバイルアプリも作る予定(APIを使い回す)
✅ 完全なSPA
✅ チームが分かれている
React on Railsを選ぶ場合
✅ 小〜中規模プロジェクト
✅ SEOが重要
✅ 開発スピード重視
✅ 個人開発・スタートアップ
比較表
| 項目 | React + Rails | React on Rails |
|---|---|---|
| セットアップ | 複雑 | 簡単 |
| 開発速度 | やや遅い | 速い |
| SSR | 自前実装 | 標準対応 |
| デプロイ | 2箇所 | 1箇所 |
| スケーラビリティ | 高い | 中程度 |
まとめ
どちらが優れているわけではなく、プロジェクトの要件次第です。
判断基準:
完全分離が必要 → React + Rails
早く作りたい、SEO重視 → React on Rails
迷ったら → 小規模ならReact on Rails、大規模ならReact + Rails
gemはReact on Rails以外もあるので参考までに
Discussion