ReactとReduxを使ったアプリを試すための環境作る


ReactとReduxを書くための環境を作ってみました。まだまだ駆け出しなので、いろんな便利なライブラリを入れるというところはないですが、シンプルなのでこれから始める人には良いかもしれないです。JavaScript、React、Redux初心者向けの記事になっていると思います。

## オンラインで簡単に試せる方法

[作者がReduxを紹介してくれている動画](https://egghead.io/series/getting-started-with-redux)で使われていた[JS Bin](https://jsbin.com/?html,output)というJavaScriptをオンラインで試せるサービスが良さそうです。他の似たようなサービスもいくつか試してみましたが、ES2015で自然に書けるし、Outputやログが見やすいのでこれが良さそうです。

- [JS Bin - Collaborative JavaScript Debugging](https://jsbin.com/?html,output)

htmlを下記のように書くことで、環境が作れます。

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.0.4/redux.js"></script>
  <script src="https://fb.me/react-0.14.0.js"></script>
  <script src="https://fb.me/react-dom-0.14.0.js"></script>
</head>
<body>
  <div id='root'></div>
</body>
</html>
```

cdnでreactとreduxの最も基本的なライブラリを読み込んでいます。

![JS_Bin_-_Collaborative_JavaScript_Debugging.png](https://qiita-image-store.s3.amazonaws.com/0/24041/892ab9f5-0cc7-2fc9-a71a-4874b9fb0385.png "JS_Bin_-_Collaborative_JavaScript_Debugging.png")

[これ](https://jsbin.com/kakulen/3/edit?html,js,output)は、僕が動画を見ながら作ってみた簡単なカウンターアプリです。JS Binの使ってReact+Reduxをとりあえず動かしてみるというときには良いかもしれないです。

## ローカルにReactの環境を作る

本題です。ローカルにReduxが動かせる環境を作っていきます。

### npm

まず、npmの準備をします。

```bash
$ npm init
$ npm install lite-server concurrently --save-dev
```

`npm init`で、 *package.json* というファイルが作られますが、このscript部分を下記のように書き換えます。

```
"scripts": {
  "webpack": "webpack -w",
  "lite": "lite-server --verbose --open dist",
  "start": "concurrently \"npm run webpack\" \"npm run lite\""
},
```

これを書くことで、`npm start` をするとJavaScriptなどに加えた変更がライブでブラウザに反映されます。

### React

```bash
$ npm init
$ npm install --save react react-dom
```

Reactのライブラリを用意します。

### ESLint

ESLintはコードの静的検証をしてくれます。Editorで書いていると、書いているそばから、warningやerrorを出してくれます。

僕は[Atom](https://atom.io/)で書いているのですが、[linter](https://atom.io/packages/linter)と、[linter-eslint](https://atom.io/packages/linter-eslint)を入れておくとエディタで教えてくれるようです。

```bash
$ npm install eslint --save-dev
$ npm install eslint-plugin-jsx-a11y --save-dev
$ eslint --init
```

`eslint --init` をすると対話的に、設定ファイルを作ってくれます。僕は下記のようにやっています。

- Use a popular style guide
- AirBnb
- JSON

するとこのようなファイルが生成されます。

```json:.eslintrc.json
{
    "extends": "airbnb",
    "plugins": [
        "react"
    ]
}
```

AirBnbを選択した理由は、[AirBnbのスタイルガイド](https://github.com/airbnb/javascript/tree/master/react)がとてもわかりやすく優れていると感じたのと、知り合いのReactが得意な人にAirBnbのスタイルガイドがいいと言われたからです。

ただ、これだと結構厳しいので、一つルールを緩和しています。

```json:.eslintrc.json
{
    "extends": "airbnb",
    "plugins": [
        "react"
    ],
    "rules": {
      "arrow-body-style": "off"
    }
}
```

=>の関数が1行で終わるときに改行しないというようなルールだと思うのですが、これがあると1行で終わるときと終わらない時で書き方が変わってしまうので緩和しました。

### Webpack

ES6やReactで書いたJavaScriptを現状ブラウザで動く形に変更してくれるやつです。

```bash
$ npm install --save-dev babel-core babel-preset-react babel-preset-es2015
$ npm install --save-dev webpack babel-loader url-loader css-loader style-loader file-loader
```

とりあえず、このようにしてインストールしています。Webpackを動かすためには設定ファイルが必要なので作ります。これは、どういう風にビルドするかを指示しているものです。いろいろな書き方があるとは思いますが、比較的シンプルになっていると思います（難しいことをやっていないというだけですが＞＜）。

```javascript:webpack.config.js
module.exports = {
  entry: `${__dirname}/src/Index.js`,
  output: {
    path: `${__dirname}/dist`,
    filename: 'bundle.js',
    publicPath: '/dist/',
  },
  module: {
    loaders: [
      {
        test: /\.js[x]?$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
          presets: ['react', 'es2015'],
        },
      },
      { test: /\.css$/, loader: 'style-loader!css-loader' },
      { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file' },
      { test: /\.(woff|woff2)$/, loader: 'url?prefix=font/&limit=5000' },
      {
        test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
        loader: 'url?limit=10000&mimetype=application/octet-stream',
      },
      { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=image/svg+xml' },
    ],
  },
  resolve: {
    extensions: ['', '.js', '.jsx'],
  },
};
```

### 表示してみる

Reactをかける環境が整ったので、一旦表示してみます。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
  </head>
  <body>
    <div id="root"></div>
    <script type="text/javascript" src="dist/bundle.js"></script>
  </body>
</html>
```

```javascript:src/Index.js
import React from 'react';
import { render } from 'react-dom';
import App from './components/App';

const rootEl = document.getElementById('root');

render(
  <Provider store={store}>
    <App />
  </Provider>,
  rootEl
);
```

```javascript:App.js
import React from 'react';

const App = () => (
  <div>
    hello, world
  </div>
);

export default App;
```

これで、 `npm start` をすると、hello, worldが表示されたと思います。

## さらにReduxを入れていきます

```bash
$ npm install --save redux
$ npm install --save react-redux
$ npm install --save-dev redux-devtools
```

[作者がReduxを紹介してくれている動画](https://egghead.io/series/getting-started-with-redux)の範囲内でライブラリをインストールします。

`Index.js` を下記のように書き換えます。

```javascript:Index.js
import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import stopwatchApp from './reducers/Stopwatch';
import App from './components/App';

let store = createStore(stopwatchApp);

const rootEl = document.getElementById('root');

render(
  <Provider store={store}>
    <App />
  </Provider>,
  rootEl
);
```

ここまでで作者が動画で紹介してくれているところまで環境の構築ができました。