2016年から始めるフロントサイド~環境構築編~

## Boilerplate一覧
https://github.com/mxstbr/react-boilerplate
https://github.com/chentsulin/electron-react-boilerplate
https://github.com/gaearon/react-hot-boilerplate
https://github.com/koichirola/react-boilerplate (私のなので上より参考にならない可能性あり)

## 環境構築
1. editor
1. nodejs
2. npm
* babel
* eslint
* webpack
* react,redux

### editor
* visual studio codeを使います。
* keybindingsとsettingsを少し変更します。
* sublime textの方がいいのでしょうか？良いのであれば購入を検討します！

```json:keybindings.json
[
    { "key": "shift+ctrl+k",               "command":
    "workbench.action.editor.changeLanguageMode" },
    { "key": "shift+ctrl+o",               "command":
    "workbench.action.showCommands" },
    { "key": "ctrl+j",                     "command":
    "deleteAllLeft"},
    { "key": "ctrl+i",                     "command":
    "expandLineSelection", "when": "editorTextFocus" }
]
```

```json:settings.json
{
    //-------- Editor configuration --------

    "editor.fontSize": 14,
    "editor.fontFamily": "monospace",
    "editor.renderWhitespace": true,
    "editor.glyphMargin": true,
    "editor.cursorStyle": "block",
    "editor.cursorBlinking": "visible",
    "editor.tabSize": 2,
    "editor.wrappingColumn": 80,

    //-------- Files configuration --------
    "files.autoSave": "afterDelay"
}
```

* 上のkeybindingだと`shift+ctrl+o`でコマンドパレットを表示します。
* Install Extensionを入力します。
* Javascriptを入力して検索します。
* 好きな拡張をインストールします。
* `shift+ctrl+o`でコマンドパレットを表示します。
* commandを入力します。
* Shell Commandで`code`でshellから起動できるようにします。

### nodejs
* nodebrewを使ってインストールします。

```bash:nodebrew
# ~/.bash_profileにPATHを追加するような表示が出るのでその通りにする
$ brew install nodebrew

# インストール出来るバージョンの表示
$ nodebrew ls-remote

$ nodebrew install-binary v5.7.0
$ nodebrew use v5.7.0
$ node -v
v5.7.0
$ npm -v
3.6.0
```

### npm
* 開発用のプロジェクトを作成します。
* 必要なコマンドラインをインストールします。
* [公式サイト](https://docs.npmjs.com/files/package.json)

```
# プロジェクト作成
$ cd /path/to/project

# プロンプトにしたがって色々入力
$ npm init

# 必要なコマンドラインをインストール
# npm runを使う場合は特に必要なさそうです(2016/3/8 追記)
$ npm install -g webpack browserify babel-cli mocha eslint cross-env
```

### babel
* npmを使ってインストールします。
* babelはプラグインの種類が多いので、お気に入りのプロジェクトを真似するか。適当に良さそうなものを入れていきます。
* とりあえずパッケージ化は考えないのでdevDependenciesに放り込みます。
* [公式サイト](https://babeljs.io/)

```bash:babel
$ npm install --save-dev babel-cli babel-core babel-eslint babel-loader \
babel-plugin-transform-es2015-literals babel-plugin-transform-es2015-modules-commonjs \
babel-plugin-transform-es2015-object-super babel-plugin-transform-es2015-parameters \
babel-plugin-transform-es2015-shorthand-properties babel-plugin-transform-es2015-spread \
babel-plugin-transform-es2015-template-literals babel-plugin-transform-es2015-for-of \
babel-plugin-transform-es2015-destructuring babel-plugin-transform-es2015-computed-properties \
babel-plugin-transform-es2015-classes babel-plugin-transform-es2015-block-scoping \
babel-plugin-transform-es2015-block-scoped-functions babel-plugin-transform-es2015-arrow-functions \
babel-plugin-syntax-trailing-function-commas babel-plugin-check-es2015-constants \
babel-preset-react babel-plugin-transform-es2015-modules-commonjs
```

.babelrcを編集します。(ほぼReduxの構成のパクリです)

```json:babelrc
{
  "presets": ["es2015", "react"],
  "plugins": [
    "transform-es2015-template-literals",
    "transform-es2015-literals",
    "transform-es2015-arrow-functions",
    "transform-es2015-block-scoped-functions",
    ["transform-es2015-classes", { "loose": true }],
    "transform-es2015-object-super",
    "transform-es2015-shorthand-properties",
    "transform-es2015-computed-properties",
    "transform-es2015-for-of",
    "check-es2015-constants",
    ["transform-es2015-spread", { "loose": true }],
    "transform-es2015-parameters",
    ["transform-es2015-destructuring", { "loose": true }],
    "transform-es2015-block-scoping",
    "transform-es2015-modules-commonjs"
  ],
  // process.env.BABEL_ENVに設定されてると反映される
  // この場合はBABEL_ENV=common jsとすることで反映
  "env": {
    "commonjs": {
      ["transform-es2015-modules-commonjs", { "loose": true }]
    }
  }
}
```

### eslint
* npmを使ってインストールします。
* [公式サイト](http://eslint.org/)
* .eslintrcを作成します。(2.0.0だとeslint --initが上手く動かないようだ。。)

```bash:eslint
# reactの設定テンプレートとプラグインをインストールします
npm install --save-dev eslint-config-rackt eslint-plugin-react

# 2016/3/13追記
# eslint-config-racktはもう使えないようなのでairbnbのものをインストールします
npm install --save-dev eslint-config-airbnb

# 2016/3/8 追記
# 最新のeslint2.3.0だと
# https://github.com/eslint/eslint/issues/5476
# のissueにある通りエラーがでるので2.2.0をインストールします
npm install --save-dev eslint@2.2.0
```

```json:eslintrc
{
  "parserOptions": {
    "ecmaVeriosn": 6,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  },
  // eslint-config-racktの設定を取り込む
  // 2016/3/13追記
  // racktはもう古いらしいのでairbnbに変更
  // "extends": "rackt", 
  "extends": "airbnb",
  // eslint-plugin-reactで定義されているルールを取り込む
  "plugins": [
    "react"
  ],
  // 2016/3/8 追記
  // eslintかけるとERRORがでる対処
  "rules": {
    "semi": 0,
    "no-var": 0,
    "no-unused-vars": 0,
    "react/jsx-uses-react": 1,
    "react/jsx-no-undef": 2,
    "react/wrap-multilines": 2
  }
}
```

### webpack
* [公式サイト](http://webpack.github.io/docs/)
* webpack.config.jsを作成します。
* babel-loaderの公式サイトではqueryプロパティを設定しているサンプルがあるが、どうやら上手く動かないようだ。。

```javascript:webpack.config.js
'use strict';

var webpack = require('webparck');
var path = require('path');

var env = process.env.NODE_ENV;
var config = {
  module: {
    loaders: [
      { 
        test: /\.js$/,
        // Arrayの場合はloaders, 文字列だけの場合はloader
        loaders: ['babel-loader?presets[]=react&presets[]=es2015&cacheDirectory'],
        exclude: /node_modules/
      }
    ]
  },
  entry: {
    'build': path.join(__dirname, 'src')
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].[hash].js'
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(env)
    }),
    new webpack.optimize.OccurrenceOrderPlugin()
  ],
  resolve: {
    extensions: ['', '.json', '.js', '.jsx'],
  }
};

module.exports = config;
```

これでsrcに何かコードを置いて`webpack`するとdistに出力されます。

### react,redux

* npmを使ってインストールします。

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

# 2016/3/8 追記
# react-routerもインストール
$ npm install --save-dev react-router
```

## まとめ
最終的にpackage.jsonは下記のようになりました。

```json:package.json
{
  "name": "reactex",
  "version": "1.0.0",
  "description": "this is react and flux example",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "koichirola",
  "license": "MIT",
  "devDependencies": {
    "babel-cli": "^6.6.5",
    "babel-core": "^6.6.5",
    "babel-eslint": "^5.0.0",
    "babel-loader": "^6.2.4",
    "babel-plugin-check-es2015-constants": "^6.6.5",
    "babel-plugin-syntax-trailing-function-commas": "^6.5.0",
    "babel-plugin-transform-es2015-arrow-functions": "^6.5.2",
    "babel-plugin-transform-es2015-block-scoped-functions": "^6.6.5",
    "babel-plugin-transform-es2015-block-scoping": "^6.6.5",
    "babel-plugin-transform-es2015-classes": "^6.6.5",
    "babel-plugin-transform-es2015-computed-properties": "^6.6.5",
    "babel-plugin-transform-es2015-destructuring": "^6.6.5",
    "babel-plugin-transform-es2015-for-of": "^6.6.0",
    "babel-plugin-transform-es2015-literals": "^6.5.0",
    "babel-plugin-transform-es2015-modules-commonjs": "^6.6.5",
    "babel-plugin-transform-es2015-object-super": "^6.6.5",
    "babel-plugin-transform-es2015-parameters": "^6.6.5",
    "babel-plugin-transform-es2015-shorthand-properties": "^6.5.0",
    "babel-plugin-transform-es2015-spread": "^6.6.5",
    "babel-plugin-transform-es2015-template-literals": "^6.6.5",
    "babel-preset-es2015": "^6.6.0",
    "babel-preset-react": "^6.5.0",
    "babel-register": "^6.6.5",
    "cross-env": "^1.0.7",
    // 2016/3/8 修正
    "eslint": "^2.2.0",
    // 2016/3/13 追記
    // racktは古いのでairbnbにします
    // "eslint-config-rackt": "^1.1.1",
    "eslint-config-airbnb": "^6.1.0",
    "eslint-plugin-react": "^4.2.0",
    "mocha": "^2.4.5",
    "react": "^0.14.7",
    "react-dom": "^0.14.7",
    "react-redux": "^4.4.0",
    // 2016/3/8 追記
    "react-router": "^2.0.0",
    "redux-devtools": "^3.1.1",
    "webpack": "^1.12.14"
  },
  "browserify": {
    "transform": [
      "loose-envify"
    ]
  },
  "repository": {
    "type": "git",
    "url": ""
  }
}
```

実装・テスト編に続く・・・（完）