VSCodeでJavaScriptの環境作り（Prettier/ESLint編）

## 概要

基本の組み合わせですよねってことでそれぞれを軽く触りつつ整理していく。

## 前提

1. VSCodeインストール済み
2. Node.jsインストール済み

VSCode, Node.jsについての説明は基本的に割愛します。  
これを書いている環境は以下の通りです。

* Windows 10
* VSCode v1.38.1
* Node.js v12.4.0

WSL/WSL2便利すぎてWindowsで作業することが最近多い...あと半年ぐらいしたらWSL2に完全移行しても良いと思う。

## Prettier

Prettier is コードフォーマッター。

### VSCodeの機能で整形してみる

VSCodeを開いて適当なディレクトリに`index.js`を作成し以下のコードを書いておく。あえてフォーマットはごちゃごちゃ。

```js
const hoge=()=>{
        return"hoge"}
console.log(`Hello ${hoge()}!`)
```

コンソールでindex.jsがあるディレクトリに移動して（VSCodeでディレクトリを開いていればそのままTerminalが使えるはず）、`node index.js`を実行すると`Hello hoge!`と表示されます。とりあえず動いてはいますね。  
コマンドパレット（Cmd+Shift+P）を開いて、Format Documentを選択して見てください（またはShift+Alt+Fでもできます）。以下のように綺麗に整形されると思います。

```js
const hoge = () => {
    return "hoge"
}
console.log(`Hello ${hoge()}!`)
```

あれ？フォーマッターいらなくね？？？って思いますね。  
VSCodeはデフォルトの状態でも対応言語のフォーマッターを持っており、それに準じて自動でフォーマットをかけてくれます。デフォルトはPreferencesから色々と変更可能です。User設定とWorkspace設定を使えるので、これで事足りる場合は無理にPrettierを使う必要は無いかもしれません。
とは言えPrettierを使うとより細かい設定（特にLintとの兼ね合い）ができるので、使うことをおすすめします。

### Prettierを使って整形する

ここからはnpmを使っていきます。  
先程とは異なるディレクトリを用意してそのディレクトリで`npm init -y`を実行します。先程の`index.js`も作成しておきます。`npm i prettier`でprettierをインストールします（実際の開発であれば-Dしておいてくださいね）。Terminalで`npx prettier .\index.js`を実行します。Terminal上に整形後のコードが表示されればOKです。`--write`オプションを付けるとコードを整形して保存してくれます。ここまでが基本になります。現状ではPrettierのデフォルト設定でフォーマットされている状態になります。  
Prettierの設定は色々な書き方ができます。詳細は[Configuration File · Prettier](https://prettier.io/docs/en/configuration.html)を参照してみてください。今回はルートディレクトリに`.prettierrc`ファイルを作成していきます。内容は以下の通りです。

```json
{
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": false,
  "singleQuote": true
}
```

ファイルを用意したら再度`npx prettier --write .\index.js`を実行してみましょう。設定通りにフォーマットされていればOKです。ウオッチしてファイルに変更があったら整形して保存とかもできますが、今回の目標はVSCodeでの環境作りなのでこの辺にして次に進みましょう。

### VSCodeでPrettierを使う

本題の1つ目ですね。  
VSCodeプラグインの[Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)をインストールします。次にコマンドパレットに`preference workspace`と入力してVSCodeの設定画面を開き`formatsave`で検索し、`Editor: Format On Save`を`On(True)`にします。その後、VSCodeを再起動しておきます。  
後は適当にフォーマットを崩して上書き保存してみてください。自動的にフォーマットが適用されて保存されていると思います。VSCodeでPrettierを使うために必要なことは以下の通りです。

1. [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)をインストール
2. Preferencesの`Editor: Format On Save`を`On(True)`にする
3. プロジェクトルートに`.prettierrc`を作成し設定を書く
4. VSCodeを再起動

まとめると簡単ですね。細かい設定は[Options · Prettier](https://prettier.io/docs/en/options.html)で調べてみてください。この辺りの内容はES6もTSも然程変わらない内容かなと思います。

## ESLint

ESLint is 静的コード解析（ES用）。コードフォーマットもできるっちゃできます。

### VSCodeの機能で静的コード解析をしてみる

VSCode上で適当にjsファイルを作成してファイルの内容を`const hoge =`としてみてください。赤い波線で警告が表示されると思います。ま、よくあるIDE標準のコード解析ですね。最低限のコード解析で問題無ければ標準でも事足りるかもしれません。とは言えコーディング規約の適用コストを下げるのであればFormatter/Lintの導入は必須とも思えます。

### ESLintを使ってコード解析をしてみる

適当なディレクトリで`npm init -y`してeslintをインストール（`npm i eslint`）します。インストール後、ルートディレクトリに`.eslintrc.json`というファイルを作成します。これがESLintのルールファイルになります。`.eslintrc.json`の内容を以下の通りに設定しましょう（一旦ね）。

```json
{
  "extends": [
    "eslint:recommended"
  ],
  "plugins": [],
  "parserOptions": {},
  "env": {
    "es6": true
  },
  "globals": {},
  "rules": {
    "semi": [
      "error",
      "never"
    ]
  }
}
```

内容としてはES6で書かれたコードを解析する＆推奨されているチェック仕様に準じると設定しており、個別の設定でセミコロンの仕様を禁止するルールにしています。ルールの詳細は「eslint rules」で検索すると色々出てきます。推奨されているチェック内容は[Possible Errors](https://eslint.org/docs/rules/#possible-errors)で確認できます。推奨を使わずに全てrulesに書くのはあまり賢い方法とは言えないです。  
`npx eslint --init`で初期化してしまっても良いですね。

次にindex.jsの内容を以下のように書き換えます。

```js
const hello = name => `Hello ${name}!`;
const hello2 = name => `Hello ${namae}!`
```

Terminal上で`npx eslint .\index.js`を実行します。おそらく以下のようなメッセージが表示されると思います。

```bash
C:\Users\userName\...\sample\index.js
  1:7   error  'hello' is assigned a value but never used   no-unused-vars
  1:39  error  Extra semicolon                              semi
  2:7   error  'hello2' is assigned a value but never used  no-unused-vars
  2:16  error  'name' is defined but never used             no-unused-vars
  2:33  error  'namae' is not defined                       no-undef
```

これがESLintがコード解析をした結果になります。後はエラーを潰していくだけで一定の品質やコーディング規約に準じたコードができ上がります。なんと素晴らしいことでしょうか。

### VSCode上でESLintを動かす

Terminalから動かせばVSCode上でも動かせるわけですが、どうせなら自動で更にはリアルタイムで解析してもらいたいですよね。ってことでVSCodeのプラグイン`ESLint`をインストールします。インストールが終わったらindex.jsを開いてみましょう。`npx eslint ...`とコマンドを実行しなくてもLintが走ってますね。非常に簡単です。  
.eslintrc.jsonのセミコロンのルールを削除してjsファイルを参照してみましょう。セミコロンの部分で発生していたエラーが無くなっているはずです。何をしなくとも.eslintrc.jsonを更新すればルールは適用されます。

## VSCodeでPrettierとESLintを組み合わせて使う

ここからが本番と言っても過言じゃないですね。PrettierとESLintを組み合わせて使えば誰が書いてもコーディング規約はある程度守られてフォーマットのズレは無いという状態になります。最高ですね、ってことでやっていきましょう。

と、始める前に最終目標だけ整理しておきましょう。最終的に「ファイル保存時に自動的にフォーマットされる（VSCodeの設定 + Prettier）」「リアルタイムで静的コード解析が実行される（ESLint）」状態にしていきます。


### npm関連

`npm init -y`をしてeslintをインストールしておきます。

### プラグインのインストール

PrettierとESLintをインストールしておきます。

### 設定ファイルの用意

VSCodeのSettingsでEditor: Format On SaveをTrueにして、`.prettierrc`と`.eslintrc.json`を用意して以下の内容で記述しておきます。

```json
// .prettierrc
{
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": false,
  "singleQuote": true
}
```

```json
// .eslintrc.json
{
  "extends": [
    "eslint:recommended"
  ],
  "plugins": [],
  "parserOptions": {},
  "env": {
    "es6": true
  },
  "globals": {},
  "rules": {
    "semi": [
      "error",
      "never"
    ]
  }
}
```

この時点で保存するとFormatはかかるかと思います。

### JavaScriptファイルで確認する

```js
// index.js
const hello = name => `Hello ${name}!`;
const hello2 = name => `Hello ${namae}!`
```

上のjsファイルを作成して保存すると保存時にセミコロンはPrettierの設定により削除されてESLintが走ってエラーが表示されます。

後はチームでどのようなルールを作り適用させるかを検討すればOKです！

## 最後に

まとめて一気にやろうとすると難しく感じると思いますが、1つ1つ理解していくとそこまで難しい内容ではありませんね。Vue.jsやReactを使う時はもうちょっと面倒な感じになると思いますが、基本的なところを把握していれば対応はできると思います。

TypeScript（ESLintの代わりにTSLintを利用）でも同じように環境は作れます。便利なものは使って楽をしましょう。