RailsにReactを導入する

現状: Rails4.x以上でサービスを稼働している。 フロントエンドは.erbで記述している。JSはassets/javascriptという普通の構成

開発リソース: 1人
目的: 既存のUI資産を残しつつ、ECMAScript6 + React + Reduxに置き換える
前提: react-router,react-railsを使う

React(ES6)をbabelでコンパイルする必要があるので、frontend/src/javascript 以下にjsxを書いていく。 gulpfileはこんな感じ

var gulp = require("gulp");
var browserify = require("browserify");
var babelify = require("babelify");
var source = require("vinyl-source-stream");
var concat = require("gulp-concat");


gulp.task('compile-es6',
  function() {
    browserify('./frontend/src/javaxcript/**/*.jsx', { debug: true })
      .transform(babelify)
      .bundle()
      .pipe(source('bundle.js'))
      .pipe(gulp.dest('app/assets/javascripts/components'))
  });

gulp.task('watch',
  function() {
    gulp.watch(__dirname + '/frontend/src/javascript/**/*.{js,jsx}', ['compile-es6'])
  });

コントローラー毎にレイアウトファイルを振り分ける作業があるんだけど、とりあえずHelloReactとか表示する。

// frontend/src/javascript/hello-react.jsx

import React from 'react'
export default class HelloReact extends React.Component{
  render() {
    return(
      <div>
        <h2>Hello React!</h2>
      </div>
    );
  }
}

class HelloReactController < ApplicationController
  def index
  end
end
# app/views/hello_react/index.html.slim
= react_component 'HelloReact'

react_component はreact-railsに用意されているhelperメソッド。複数のComponentを表示すると react_component 'header' react_component 'main' react_component 'footer' みたいになっていく。

適当にrouteを設定し、urlを叩くと、ヘッダーとフッター部分が.erbで、Hello Reactの部分がjsxで書いたviewが混在したものが表示される。