WEB+DB PRESS Vol.92にReact + Reduxのページがあってちょっと触ってみようかなと思ってから随分時間が経ってしまったけど、とりあえず環境だけできたので書いておきます。
React + Reduxだけではなく、せっかくなのでRails5でReact + Reduxな環境を作ってredux/examples/todosを動かしてみました。
参考
以下を参考にしています。
- http://qiita.com/suzan2go/items/24ef3320e04b8a84597f
- https://github.com/reactjs/redux/tree/master/examples/todos
環境
- CentOS Linux release 7.2.1511 (Core)
- node v0.12.15
- Rails 5.0.0
- react 15.2.1
- redux 3.5.2
必要なモノをインストール
nodeとrailsをインストールします。
node.js
$ git clone https://github.com/creationix/nvm.git ~/.nvm |
ruby
rbenv使ったほうが楽だけどソースからインストールします。root$ yum groupinstall "development tools"
root$ yum install zlib-devel openssl-devel gdbm-devel readline-devel ncurses-devel libffi-devel libxml2-devel libxslt-devel libcurl-devel libicu-devel libyaml-devel
root$ cd /tmp
root$ wget http://ftp.ruby-lang.org/pub/ruby/ruby-2.3.1.tar.gz
root$ tar zxvf ruby-2.3.1.tar.gz
root$ cd ruby-2.3.1
root$ ./configure
root$ make && make install
root$ ruby -v
ruby 2.3.1p112
Rails
Railsインストール。
root$ gem install rails |
方針
react, redux, babelはnpmでインストールしたものを利用します。JavascriptのES6からES5へのトランスパイルはbrowserify-railsからBabelを呼び出して行います。
browserify-railsのコマンドラインオプションにbabelの設定をすることでトランスパイルされたJavascriptがAsset Pipelineに流れる様になります。react_railsでRailsのViewからReactComponentのHelperを使って呼び出します。
よく出来過ぎてる。
Rails側の準備
適当なプロジェクトを作っておきます。
root$ yum install sqlite-devel |
rails側で利用するパッケージを追加を追加します。
+ # gem 'therubyracer', platforms: :ruby |
$ bundle install |
browserifyからトランスパイラを呼び出す設定を追加。
browserifyは何って読むのでしょうか。ぶらうざりふぁい?
config.browserify_rails.commandline_options = '-t babelify' |
react-railsをインストールします。
$ rails g react:install |
components以外のReduxで使うディレクトリは後ほど作ります。
//= require jquery |
reactはnpmで入れたreactを使うので//= require react
は消し、sprocketsの機能を使ってrequireしないので//= require_tree .
も消します。
Node側の準備
browserify, babel周りのパッケージをインストールします。
$ npm init |
railsのアプリケーションルートに.babelrcを追加します。
{ |
次にReact, Reduxのパッケージをインストールします。
$ npm install --save react react-dom react-redux redux redux-thunk |
npmでインストールされたパッケージは以下の様になっています。
... |
Reduxのtodosアプリを追加
Reduxのディレクトリを作ります。$ cd app/assets/javascripts/
$ mkdir actions containers reducers
react, react-domをrequireし、3行目で読み込むtodos.jsでreact_componemtから呼べる様にする(?)。この部分が実はよくわかっていない。
window.React = require('react'); |
ここを参考にactions, components, containers, reducersのファイルをapp/assets/javascripts以下にコピペします。
index.jsは以下の様に書き換えました。
import React, { Component } from 'react' |
Viewを追加してreact_componentを使ってみます。$ rails g controller todos index
helperからreactのコンポーネントを呼びます。
<%= react_component('Todos') %> |
ここで、/todos/index
に接続すると以下の様に表示されることが確認できます。
サーバサイドレンダリングしたい場合は{prerender: true}
を渡すとサーバサードレンダリングができます。ブラウザ側のJavascriptを無効にして再読み込みするとレンダリングされることが確認できると思います。
まとめ
browserify_railsのビルドが遅いので他の方法を探す必要がありそうです。とりあえずReact + Reduxの環境ができたので時間があるときにさわってみようかと思っています。React-Bootstrapまでやろうと思ったけど時間が無いのでまたの機会に。
おわり。