コピペでできるTypescriptを使わないNuxtのLinterとFormatter(ESLint、StyleLint、Prettier)の設定 (in 2021/04)

NuxtアプリにLinter, Formatterを設定しようと思って調べました。
<strong>今回はTypescriptは使いません。</strong>

<strong>Typescriptも含めた設定が多いですが、まだTypescriptを触ったことがない人(自分)にとっては必要ないですし、
`nuxt + ESlint + Stylelint + Prettier`の設定をまとめる必要があると思いました。</strong>

また、自分の場合は上記の設定をプロジェクト作成時に設定していなかったので、後から設定する必要がありました。

設定(導入)するパッケージはESLint、StyleLint、Prettierがメインです。
一応sass-loaderも使ってます(sass,scssが使えるようになります)。

`npx nuxt-create-app`コマンドで最初からESLint、Stylelint、Prettierをチェックして導入しているのであれば設定ファイルをコピペするだけでいけるはずです。


細かい説明などは当記事の各リンクを参考にしてください。

## 目次
|||
|:----:|:----:|
|1|動作環境|
|2|注意点|
|3|ターゲット|
|4|TL;DR|
|5|【本題】完成形までの手順(数分でできるはず)|
||アプリを作成|
||パッケージをインストール|
||VSCodeの拡張機能をインストール|
||設定ファイルを追加、編集|
|6|【余談】ESLint、Stylelint、Prettierについて学ぶ|
|7|Thank you very much!!|

## 動作環境(2021/04時点)
|||
|:----:|:----:|
|MacOS|Catalina(10.15.7)|
|VSCode|1.55.0|
|Nuxt.js|2.15.4|
|yarn|1.22.10|
yarnはnpmに置き換えてもらっても問題ありません。
むしろnpmの方がいいかも?

## 注意点
自分なりに調べて正常に動作し、内容をまとめた記事です。
うまく動作しない場合は当記事のリンクを参考にして修正するなどして対応していただきますようお願いいたします。


## ターゲット
この記事のターゲットは

- これからNuxt.jsを使う人
  - Linter, Formatterがあると生産性が上がるから必須(らしい)
- Linter, Formatterの設定がわからない人、少しでも理解したい人
  - `ESLint、Stylelint、Prettierについて学ぶ`の節のリンクである程度理解できると思います。
- Linter, Formatterの設定を調べるのに疲れた人
  - とりあえず脳死で下記のファイル設定をしておけばうまく動作してくれる(はず)

といった感じです。
僕自身がこの設定をするのに1日以上かかったのでそうならずに早く開発を進められるように記事化しました。
早ければ数分で設定ができます。

## TL;DR
- [WebエンジニアためのNuxt.jsのオススメLint設定まとめ – ブログの設置](https://flex-box.net/nuxt-lint/)の記事をベースにして[eslint-plugin-prettier を ESLint から 分離するサンプル – Intellij IDEA の設定変更も | DevelopersIO](https://dev.classmethod.jp/articles/eslint-and-prettier/)の設定を参考に修正すればできた
- `ESLint`、`Stylelint`、`Prettier`、`TypeScriptなし`の記事を整理して探すのは超大変だった





## 完成形までの手順
### アプリを作成
`npx nuxt-create-app`コマンドでアプリを作成する場合はESLint、Stylelint、Prettierにチェックを入れて作成します。
後から導入することも可能ですがまぁまぁ時間がかかります。
後から導入する場合は作成したアプリのルートディレクトリで下記を実行します

```bash:terminal
touch .eslintrc.js
touch .prettierrc
touch .stylelint.config.js
yarn add -D eslint stylelint prettier eslint-config-prettier stylelint-config-prettier
```


### パッケージをインストール
scssを使う場合は下記パッケージをインストールします。

```bash:terminal
yarn add -D node-sass sass-loader stylelint-config-standard-scss stylelint-order stylelint-scss
```

### VSCodeの拡張機能をインストール
下記の3つをインストールすれば特に問題なく使えると思います。
CLIコマンドに関しては今回は設定しません。

- [ESLint - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
- [stylelint - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint)
- [Prettier - Code formatter - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

### 設定ファイルを追加、編集


#### .eslintrc.js
```js:.eslintrc.js
module.exports = {
  root: true,
  env: {
    browser: true,
    node: true,
  },
  parserOptions: {
    parser: "babel-eslint",
  },
  extends: ["@nuxtjs", "prettier", "plugin:nuxt/recommended"],
  plugins: [],
  rules: {},
}
```

#### .prettierrc
```json:.prettierrc
{
  "semi": false,
  "singleQuote": false
}
```


#### .stylelint.config.js
```js:.stylelint.config.js
module.exports = {
  plugins:[
    "stylelint-order",
    "stylelint-scss"
  ],
  extends: [
    'stylelint-config-recommended',
    'stylelint-config-standard',
    'stylelint-config-prettier',
    'stylelint-config-standard-scss',
  ],
  rules: {
    "order/properties-alphabetical-order": true, // アルファベット順に
    "block-no-empty": null, // 空のクラスをエラー判定するかどうか
    "at-rule-no-unknown": [true, // @include, @mixin, @each, @extendをエラー判定しない
      {"ignoreAtRules": ["include","mixin","each","extend"]}],
    "rule-empty-line-before": null, // 各クラスごとに空行を入れるかどうか
    "at-rule-empty-line-before": null, // @の前に空行を入れるかどうか
  }

}

```

#### .vscode/settings.json
```jsonc:.vscode/settings.json
{
  // ESLint
  "eslint.workingDirectories": ["./"],
  "eslint.options": {
    "configFile": "./.eslintrc.js"
  },
  "eslint.validate": [
    "javascript"
  ],
  // stylelint
  "stylelint.enable": true,
  "stylelint.configBasedir": ".",
  "stylelint.validate": ["css"],
  "css.validate": false,
  "scss.validate": false,
  // Lint On Save
  "editor.formatOnSave": false,
  "editor.codeActionsOnSave": {
    "source.organizeImports": true,
    "source.fixAll.eslint": true,
    "source.fixAll.stylelint": true
  },
  // prettier
  "[json]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[vue]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
    "editor.formatOnSave": true
  },
  "editor.defaultFormatter": "esbenp.prettier-vscode",
}

```

これらの設定を保存したら、各ファイルでコードを少し崩したり、エラーを発生させてみてください。
エラーが表示されたり、コードのインデントを修正してくれれば見事完成です。




 


## 【余談】ESLint、Stylelint、Prettierについて学ぶ
ESLint、Stylelint、Prettierに関して詳しくない場合はまずこれらが何なのか知る必要があります。
良さげなリンクで学習します。
分かる人は飛ばしてください。

下記の記事はESLint、Stylelint、Prettierはどういうものか、違い、併用する理由をさくっと解説してくれています。
[VS CodeにPrettier・ESLint・Stylelintを導入してファイル保存時にコードを自動整形させる方法 | WEMO](https://wemo.tech/3307#index_id2)

### ESLintをもうちょっと深堀り
下記のリンクに詳しい説明があるので詳しく知りたい方はこちらがおすすめです。
[ESLint 最初の一歩 - Qiita](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)

ESLintの設定について自分で設定したい場合は下記を読んでから考えた方がよいと思います。
[ESLintのルールを全部手動で設定するのは大変だからやめておけ - Qiita](https://qiita.com/khsk/items/0f200fc3a4a3542efa90)

##### その他リンク
公式: [ESLint - Pluggable JavaScript linter](https://eslint.org/)
Qiitaのタグ検索: [「tag:ESLint」の検索結果 - Qiita](https://qiita.com/search?q=tag%3AESLint&sort=like)

### StyleLintをもうちょっと深堀り
下記リンクはすごく読みやすいです。数分でスラスラ読めます。
[ここがすごいぞ！ stylelint！ - Qiita](https://qiita.com/terrierscript/items/ff4f6972c988afbec3a8)

これはちょっと応用的な気がするのですが、とても使えそう。
時間があれば使ってみたい。
[コミット前に Lint を強制するなら lint-staged が便利 - Qiita](https://qiita.com/ybiquitous/items/553479cfcb2cee124ae0)

##### その他リンク
公式: [A mighty, modern style linter · stylelint](https://stylelint.io/)
Qiitaのタグ検索: [「tag:stylelint」の検索結果 - Qiita](https://qiita.com/search?q=tag%3Astylelint&sort=like)



### Prettierをもうちょっと深堀り
下記リンクは量は多いけどとてもわかりやすい。
ESLintとの比較、併用の仕方も書いてある。
[Prettier 入門 ～ESLintとの違いを理解して併用する～ - Qiita](https://qiita.com/soarflat/items/06377f3b96964964a65d)

ちょっと応用編も入ってるやつ
[prettierの使い方 - Qiita](https://qiita.com/kiida/items/405bb07c4b52bfee0219)

##### その他リンク
公式: [Prettier · Opinionated Code Formatter](https://prettier.io/)
Qiitaのタグ検索: [「tag:Prettier」の検索結果 - Qiita](https://qiita.com/search?q=tag%3APrettier)








## Thank you very much!!
下記の記事がなければ今回の記事を作成することができていませんでした。
ありがとうございます!!

Nuxt.jsを書くときのLinter,Formatterの参考リンク。VSCodeを使うための設定も入っている。
[WebエンジニアためのNuxt.jsのオススメLint設定まとめ – ブログの設置](https://flex-box.net/nuxt-lint/)

`elint-plugin-prettier`が非推奨になったことを知った記事。
設定の参考にもしてます。

- [ESLintとstylelintをpluginなしでprettierと共存させるvscode設定について | きむそん.dev](https://kimuson.dev/blog/vscode/eslint_stylelint_prettier_vscode_onsave/)
- [ESLint, Prettier, VS Code, npm scripts の設定: 2021春](https://zenn.dev/teppeis/articles/2021-02-eslint-prettier-vscode)
- [eslint-plugin-prettier を ESLint から 分離するサンプル – Intellij IDEA の設定変更も | DevelopersIO](https://dev.classmethod.jp/articles/eslint-and-prettier/)
- [いつのまにかeslint-plugin-prettierが推奨されないものになってた | K note](https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/)

下記のリンクを読むと`.eslintrc.js`の設定をどうすればいいのかのヒントになります。
[@nuxtjs/eslint-config-typescript が有効にするESLintのルール | Yurikago Blog](https://www.yurikago-blog.com/articles/19)
[決定版！イマドキの ESLint 設定！ | DevelopersIO](https://dev.classmethod.jp/articles/eslint-configurations-2020/)

こちらとらゼミさんのYouTube動画です。
ESLintとPrettierだけならこちらの方が分かりやすいと思います。
[【日本一わかりやすいTypeScript入門】ESLintとPrettierでコードの品質を高めよう - YouTube](https://www.youtube.com/watch?v=R35LJL6a-p0)