最近試しているRails+Reactの構成
最近試しているRails+Reactの構成について。
Rails + React
Rails上でReactを使用する方法は大きく分けて3パターンに分けることができると考えています。
react-rails
等のGemを用いてRails内で使用する。- frontendディレクトリ等を作成し、一部JS実装部分をRailsから切り離して
yarn/npm/webpack
等で管理する。 - APIサーバとクライントで完全に分離する。
フロントエンドの実装ボリュームによってどの構成を選択するかが変わってくると思います。
今回の要望
新規Railsプロジェクトを作成する際の要望は以下でした。
- フロントエンド専任はいない。
- SPAにしない。
- なるべくレールに乗りたい。
- 複雑な箇所、非同期処理の部分はReactを使いたい。
- Reduxを使うほどの複雑さでもない。でもFlux的な事はしたい。
- 適宜jQueryも使いたい。
- ES6を使いたい。
- JSライブラリの管理はGemでしたくない。
試している構成
検討した結果、現在はパターン2
の構成で試しています。
Railsプロジェクト内にfrontend
ディレクトリを作成し、npm/webpack/babel
でフロントエンドの開発を行い、その成果物をreact-rails
でDOMにマウントしています。
frontend/ ├── package.json ├── src │ ├── components │ │ ├── hoge-container │ │ │ └── index.js │ │ └── huga-container │ │ └── index.js │ └── entry.js └── webpack.config.js
react-rails
を使用してDOMにマウントするため、各コンポーネントをグローバルから参照できるようにしておきます。
frontend/src/components/hoge-container/index.js
import MicroContainer from 'react-micro-container'; import React, { Component } from 'react'; export default class HogeContainer extends MicroContainer { constructor(props) { super(props); } ..... }
frontend/src/entry.js
import HogeContainer from './components/hoge-container'; window.HogeContainer = HogeContainer;
webpackので依存関係を解決したjsファイルを/app/assets/javascripts/
配下に配置します。
app/assets/javascripts/ ├── application.js ├── cable.js ├── channels └── entry.bundle.js
View内で react-rails
のヘルパーメソッド react_component
を使用してマウントします。
.... <%= react_component('HogeContainer') %> ....
Flux的なこと。
react-micro-containerを利用しています。
GitHub - hokaccha/react-micro-container: Micro framework for React
所感
RailsとReactの恩恵をどちらも受けれるので、フロント実装が多くないプロジェクトならやっていけるのではないかなと感じています。
部分的にReactを導入できるので今回のようにフロントエンジニア不在の環境下でも現実的な気がしています。