たった3コマンドを叩くだけ！Atomで始めるReact(JSX)を静的コード解析するESLint簡単導入手順

# はじめに
ESLintとはJavaScriptのための静的検証ツールの一種で、カッコやセミコロンの忘れや推奨されるコードの書き方などをプログラムを実行することなくチェックしてくれるものです。**ESLintを導入することでコーディングのスタイルを保つことができたり、ベストプラクティスな書き方を学べたりします。**
今回はAtomエディタでESLintによるコードチェックが有効化されたReactの開発環境を構築していきます。
Webpack+Babel+Reactが動く開発環境がすでに構築されている前提で話を進めますので、もし開発環境の準備ができていない場合は[用語解説から丁寧に。yarnでwebpack-dev-server+Babel+React(JSX)な開発環境構築手順](https://qiita.com/nishina555/items/b2aac6326d6a8ed6753f)を参考に環境構築を進めてください。

なお先に言ってしまうとタイトルにある3コマンドとは以下です。

```bash
# Atom用のパッケージインストール
$ apm install linter linter-eslint

# ESLintをプロジェクトにインストール
$ yarn add --dev eslint

# ESLintの初期設定
$ ./node_modules/.bin/eslint --init
```

では具体的に説明をしていきます。


# 前提

今回は以下のようなディレクトリ構造を持つ開発環境にESLintを導入していきます。

```
├── dist
│   ├── bundle.js
│   └── index.html
├── node_modules
├── package.json
├── src
│   ├── Hello.jsx
│   └── index.jsx
├── webpack.config.js
├── yarn-error.log
└── yarn.lock

```



# Atomにパッケージをインストールする
静的コード解析用パッケージのlinterとlinter-eslintをインストールします。これでプロジェクト内にESLintがインストールされて入ればAtom上からESLintの警告を確認することができます。

```bash
$ apm install linter linter-eslint
```

なお、linter-eslintのセッティングに「Fix errors on save」という項目があるので、そこにチェックをつけておくとファイル保存時にESLintでエラーが出た部分を自動で修正してくれるようになります。
![スクリーンショット 2017-10-22 3.36.32.png](https://qiita-image-store.s3.amazonaws.com/0/140792/30b8c1e7-459c-60c7-8e71-ee66b9bb2f89.png)


# プロジェクトにESLintをインストールする

プロジェクトのホームディレクトリに移動し、ESLintをインストールします。なお、`yarn add --dev`は`npm install --save-dev`と同意です。

```bash
$ yarn add --dev eslint
```

package.jsonを調べると`devDependencies`に`eslint`が追加されたことがわかります。

```diff:package.json
{
  "name": "react-webpack-sample",
  "version": "1.0.0",
  "description": "sample application for react with webpack",
  "main": "index.jsx",
  "author": "nishina555",
  "license": "MIT",
  "dependencies": {
    "react": "^16.0.0",
    "react-dom": "^16.0.0"
  },
  "scripts": {
    "start": "webpack-dev-server"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
+   "eslint": "^4.9.0",
    "webpack": "^3.7.1",
    "webpack-dev-server": "^2.9.1"
  }
}
```


# ESLint初期設定

ESLintの初期設定を行います。初期設定は`eslint --init`コマンドで行います。コマンドを実行するといくつか質問を聞かれるので回答していきます。
なお、今回airbnbのスタイルガイドを適用することにします。ESLintでは他の人が作成したスタイルガイドの設定を共有することができるため、既存のスタイルガイドを適用することが可能になっています。airbnbのスタイルガイドは様々なプロジェクトで採用されている有名なガイドラインであるため、**特にこだわりがなければairbnbのスタイルガイドを採用することをオススメします。**
package.jsonを確認するとスタイルガイドとしてairbnbを選択したため、airbnbのスタイルガイドを適用させるために必要なパッケージがまとめてインストールされていることがわかります。
他の記事ですとairbnbのスタイルガイドを適用するために色々とパッケージを手動でインストールしている手順書がありますが、**eslint --initでairbnbを選択すれば依存するパッケージもまとめてインストールしてくれるので依存パッケージを別途yarnコマンドでインストールする必要はないです。**

```bash
$ ./node_modules/.bin/eslint --init

? How would you like to configure ESLint? -> Use a popular style guide
? Which style guide do you want to follow? -> Airbnb
? Do you use React? -> y
? What format do you want your config file to be in? -> JSON
```

上記の初期設定を行うとpackage.jsonに必要なパッケージがインストールされていることがわかります。

```diff:package.json
{
  "name": "react-webpack-sample",
  "version": "1.0.0",
  "description": "sample application for react with webpack",
  "main": "index.jsx",
  "author": "nishina555",
  "license": "MIT",
  "dependencies": {
    "react": "^16.0.0",
    "react-dom": "^16.0.0"
  },
  "scripts": {
    "start": "webpack-dev-server"
  },
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "eslint": "^4.9.0",
+   "eslint-config-airbnb": "^16.0.0",
+   "eslint-plugin-import": "^2.7.0",
+   "eslint-plugin-jsx-a11y": "^6.0.2",
+   "eslint-plugin-react": "^7.4.0",
    "webpack": "^3.7.1",
    "webpack-dev-server": "^2.9.1"
  }
}
```


`.eslintrc.json`が作成され以下のようになっていればairbnbのスタイルが適用されているということになります。この`.eslintrc.json`に様々なプラグインや設定を記述することで自分用にカスタマイズされたコーディングルールを作成することができます。

```json:.eslintrc.json
{
  "extends": "airbnb"
}
```



# チェック対象外のファイル一覧の作成

もしESLintのチェック対象外にしておきたいファイルがある場合は`.eslintrc`ファイルと同じ階層に`.eslintignore`というファイルを作成し、そこに無視したいファイル名を記述していきます。gitでいうgitignoreと同じです。
node_modulesディレクトリにはたくさんのファイルがあるため、無視したほうがいいのですが、[公式ページ](https://eslint.org/docs/user-guide/configuring) によると**現在ESLintではnode_modulesとbower_componentsディレクトリ以下に関しては常にコードチェックの適用範囲外となる**ため、他の記事では`./node_modules/*`を記述してnode_modulesディレクトリにあるファイルを無視するような設定を行う手順がありますが、それらのディレクトリに関してはignoreファイルに記述する必要はないです。


# 動作検証

ここまでできたらAtomでReactのソースコードを開いて実際にESLintによるチェックが入るか確認していきましょう。以下のようなエラーが出ていればOKです。
(もし`node_modules/eslint-config-airbnb-base/rules/best-practices.js:.`のようなエラーが出ていた場合は`yarn`を実行(パッケージの再インストール)してください。)

![スクリーンショット 2017-10-20 3.31.48.png](https://qiita-image-store.s3.amazonaws.com/0/140792/cb678baf-1169-c7c0-c465-8e85bc3f38fb.png)

参考までに、ESLintの警告に従いコードを修正したサンプルコードの修正前と修正後を掲載しておきます。

**修正前**

```javascript:index.jsx
import React from 'react'
import ReactDOM from 'react-dom'
import {Hello} from './Hello'

ReactDOM.render(
  <Hello />,
  document.getElementById('root'))

```

```javascript:Hello.jsx
import React from 'react'
export class Hello extends React.Component {
  render (){
    return <h1>Hello!</h1>
  }
}
```

**修正後**

```javascript:index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import Hello from './Hello';

ReactDOM.render(
  <Hello />,
  document.getElementById('root'),
);

```

```javascript:Hello.jsx
import React from 'react';

const Hello = () => (
  <h1>Hello!</h1>
);

export default Hello;
```

# (補足) eslintrcのカスタマイズ

サンプルコードを修正すると最後に`document`の部分にESLintのチェックが残っていると思います。`document`についてはグローバル変数ですのでESLintのチェックの対象外にします。そのためにはeslintrcに以下のようなコードを追加します。コードを追加後Atomをリロードすると`document`部分のエラーが消えていることがわかります。

```diff:.eslintrc.json
{
    "extends": "airbnb",
+   "globals": {
+     "document": true
+   }
}

```

もしくはブラウザのグローバル変数(docment, window)などを全てESLintのチェックから除外する場合はenvオプションを作成し、条件を記述します。

```
{
  "env": {
    "browser": true
  }
}
```

eslintrcにはその他にも色々とオプションがあるので興味がある方は調べてみてください。

# 終わりに
今回はAtomエディタでESLintによるコードチェックが有効化されたReactの開発環境を構築しました。
ESLintは導入したての時は毎回警告が出てきてどのように直せばいいのか色々調べて作業効率が悪くなるような気がするかもしれません。しかし、良いとされているコーディングスタイルを身に付けることは重要だと思いますし、もし共同で開発しているのであれば静的解析はESLintに任せることでレビュアーのチェックする負担も減ります。また、プロジェクトが大きくなり過ぎてからESLintを導入すると既存のコードがエラーだらけになって対応が大変になるので、できるだけプロジェクトの初期段階でESLintを導入するのが好ましいです。
もしESLintを導入していないのであれば是非とも導入してみてください。


# 参考
- [eslint-config-airbnb](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb)
- [ESLintでReactとES2015の構文チェック](http://dackdive.hateblo.jp/entry/2016/05/13/094000)
- [Atomにreact+es6対応したeslintの環境を構築する](https://joppot.info/2017/04/21/3839)
- [ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)