Closed6

ESLint + Prettier 自分用初期設定カンペ

torchibatorchiba

https://roadmap.sh/frontend の 「Linters formatters」の項を一巡し、公式マニュアルにもおおよそ目を通せたと思うので、今後自分が個人開発などでササッと導入するためのカンペを作っておこうと思った。
実際にページを読みながらメモ取っていた時は Notion を使ってたけど、自分以外の人にも何かしら勉強していることがわかるようにしたいと Zenn の Scraps にもメモすることにした。
(Scraps、公開するためのハードルが低くて良いですね)

参考ページは以下:
https://www.testim.io/blog/what-is-a-linter-heres-a-definition-and-quick-start-guide/
最初にがっつり読んだ 概要や設定などわかりやすかった
このあとESLint公式も読んだけど自分が何かしら作る時はこの設定使えばいいんじゃないかと思った

torchibatorchiba

動作環境 2022.06現在

npm -v
8.11.0

node -v
v18.3.0

ESLint

インストール

# 作業ディレクトリの作成
cd /Users/user-name/Public/workspace/
mkdir eslint-sample-app

# npm設定作成(デフォルト)
npm init -y

# ESLintをプロジェクトに追加
npm i -D eslint

初期化+設定

# 何をしたいか尋ねる
npx eslint --init

すると、以下のような質問をされる
ので、「❯」がついている選択肢を選んでいく
案件や選定技術によっては該当箇所を変更していく

OK to proceed?
続けてよろしいですか?

How would you like use ESLint?
to check syntax only.
to check syntax and find problems.
❯  to check syntax, find problems, and enforce code style
--
ESLintをどのように使いたいですか?
構文チェックのみ行いたい
構文をチェックし、問題を発見する
❯ 構文をチェックし、問題を発見し、コードスタイルを強制する

What type of modules does your project use?
❯ JavaScript modules
CommonJS
None of these
--
あなたのプロジェクトでは、どのような種類のモジュールを使用していますか?
❯ JavaScript モジュール
CommonJS
なし

Which framework does your project use?  
React
Vue.js
❯ None of these
--
あなたのプロジェクトでは、どのフレームワークを使用していますか?... 
React
Vue.js
❯ どれも使っていない

Does your project use TypeScript? › No / Yes
--
あなたのプロジェクトはTypeScriptを使用していますか? ❯ いいえ / はい

? Where does your code run? 
  (Press <space> to select, <a> to toggle all, <i> to invert selection)
✔ Browser
✔ Node
--
あなたのコードはどこで実行されますか?
(<スペース>で選択、<a>で全選択、<i>で反転します。)
✔ Browser
✔ Node

? How would you like to define a style for your project? 
❯ Use a popular style guide
  Answer questions about your style
--
プロジェクトのスタイルをどのように定義しますか?
❯ 一般的なスタイルガイドを使用する
  スタイルに関する質問に答える

? Which style guide do you want to follow? … 
  Airbnb: https://github.com/airbnb/javascript
  Standard: https://github.com/standard/standard
❯ Google: https://github.com/google/eslint-config-google
  XO: https://github.com/xojs/eslint-config-xo
--
どのスタイルガイドに従いますか?
  エアビーアンドビー: https://github.com/airbnb/javascript
  スタンダード: https://github.com/standard/standard
❯ Google: https://github.com/google/eslint-config-google
  XO:https://github.com/xojs/eslint-config-xo

? What format do you want your config file to be in? 
  JavaScript
❯ YAML
  JSON
--
? 設定ファイルはどのような形式で作成しますか?
  JavaScript
❯ YAML
  JSON


eslint-config-google@latest eslint@>=5.16.0
? Would you like to install them now? › No / ❯ Yes
--
今すぐインストールしますか?' いいえ / ❯はい

? Which package manager do you want to use? 
❯ npm
  yarn
  pnpm
--
どのパッケージマネージャを使用しますか?
❯ npm
  yarn
  pnpm

選んだ選択肢はこのページの「Installing ESLint」をベースに自分用にちょっといじっている:
https://www.testim.io/blog/what-is-a-linter-heres-a-definition-and-quick-start-guide/

torchibatorchiba

Prettier

インストール

# prettier のインストール
npm i -D --save-exact prettier

# 空の設定ファイル .prettierrc.jsonを追加して、Prettierを使用していることをエディタに知らせる。
echo {}> .prettierrc.json

# .prettierignore を追加して、除外ファイルを記載する
echo {}> .prettierignore
.prettierignore
# Ignore artifacts:
build
coverage

試運転

実行コマンド

# prettier の全ファイル実行
npx prettier --write .

# 例:app内のtest.jsにのみ適用
npx prettier --write "app/**/*.test.js"

該当ファイルがPrettier処理済みかどうか確認(Prettir処理自体は行わない)

# 全ファイルチェック
npx prettier --check .

# 処理済なら以下のように出る
Checking formatting...
All matched files use Prettier code style!
torchibatorchiba

ESLint と Prettier を併用するための設定

eslint-config-prettier インストール

https://github.com/prettier/eslint-config-prettier

npm i -D eslint-config-prettier

ESLintインストール直後、 npx eslint --init を使って設定ファイルを作った時に .eslintrc.* (私の場合は .eslintrc.yml )がディレクトリ内に作られているので、そのファイルを開くとこうなっている:

.eslintrc.yml
env:
  browser: true
  es2021: true
extends:
  - google
parserOptions:
  ecmaVersion: latest
  sourceType: module
rules: {}

extends:必ず一番最後prettier を追記する

他の設定を上書きしてしまうので、必ず最後に追加してください。
GitHub - prettier/eslint-config-prettier

.eslintrc.yml
env:
  browser: true
  es2021: true
extends:
  - google
+ - prettier
parserOptions:
  ecmaVersion: latest
  sourceType: module
rules: {}

ESLintとPrettierで競合しているルールが無いかをチェックする

npx eslint-config-prettier path/to/main.js

競合ルールが含まれていた場合、コマンド結果にこう出力されるので、この注意文がでなくなるように対応する

The following rules are unnecessary or might conflict with Prettier:
(以下のルールは不要、またはPrettierと競合する可能性があります。)

  • indent
torchibatorchiba

Pre-commit Hook 設定

https://prettier.io/docs/en/precommit.html

Prettierは、プリコミットツールと一緒に使うことができます。これは、コミットする前に git add で "staged" とマークされたファイルを再フォーマットすることができます。
Pre-commit Hook · Prettier

その1. lint-staged + husky

使用例: Prettierと一緒に他のコード品質ツール(ESLintやStylelintなど)を使いたい場合や、部分的にステージングされたファイル(git add --patch)のサポートが必要な場合に便利です。

先に進む前に、Prettierがインストールされ、devDependenciesに含まれていることを確認してください。

  • git add したファイルに対して自動的にフォーマットを適用させるのが lint-staged
  • コミット時にコマンドを自動実行できる(手動でlintコマンド打つ必要が無い)ようにするのが husky

インストール

https://prettier.io/docs/en/install.html#git-hooks

# インストール
npm i -D husky lint-staged
npx husky install

# package.json > prepare script を追記
npm pkg set scripts.prepare="husky install"

実行すると package.json に以下記述が追加される:

package.json
"scripts": {
  "prepare": "husky install"
},

lint-staged の設定

なぜ(lint-stagedが必要なのか)

Lintingは、コードをコミットする前に実行するとより効果的です。そうすることで、リポジトリにエラーを残さないようにすることができ、コードスタイルを強制することができます。しかし、プロジェクト全体でlint処理を実行するのは時間がかかりますし、lint処理の結果が無意味になる可能性もあります。最終的には、コミットされる予定のファイルだけをlintするのがよいでしょう。

GitHub - okonet/lint-staged: 🚫💩 — Run linters on git staged files

husky と一緒に lint-staged もインストールしてあるので(していなければ  npm i -D lint-staged でインストールする)

npx mrm@2 lint-staged

実行後
Running lint-staged...
husky - Git hooks installed
husky - updated .husky/pre-commit

これは husky と lint-staged をインストールし、プロジェクトの package.json に設定を追加して、対応するファイルを pre-commit フックで自動的にフォーマットするようにするものです。
Pre-commit Hook · Prettier

以下は設定例 使うやつだけ使う

package.json
# コードスタイルを自動的に修正し、コミットに追加する。
# これにより、eslint --fix が実行され、自動的にコミットに変更が加えられます。
"lint-staged": {
  "*.js": "eslint --fix"
}

# PrettierがサポートするあらゆるフォーマットのコードスタイルをPrettierで自動的に修正する
"lint-staged": {
  "**/*": "prettier --write --ignore-unknown"
}

# JavaScript、TypeScript、Markdown、HTML、CSSのprettierでコードスタイルを自動的に修正
"lint-staged": {
  "*.{js,jsx,ts,tsx,md,html,css}": "prettier --write"
}

ここでは2つ目を使うことにする:

# .husky/pre-commit ファイルに対して npx lint-staged を追記
npx husky add .husky/pre-commit "npx lint-staged"

# package.json > lint-staged script を追記
npm pkg set lint-staged."**/*"="prettier --write --ignore-unknown"

実行すると package.json に以下記述が追加される:

package.json
{
  "lint-staged": {
    "**/*": "prettier --write --ignore-unknown"
  }
}

これらの設定を行うことで、git addgit commit した際に、上記のlint-stagedの設定が走ることになる

このときにエラーが出てしまうとコミットが完了しない(エラーを完全に治す必要がある)
$ git commit
⚠ Skipping backup because there’s no initial commit yet.

✔ Preparing lint-staged...
❯ Running tasks for staged files...
  ❯ package.json — 9 files
    ✔ **/* — 9 files
    ❯ *.js — 2 files
      ✖ eslint --cache --fix [FAILED]
    ✔ *.{js,css,md}2 files
✔ Applying modifications from tasks...

✖ eslint --cache --fix:

/Users/user-name/Public/workspace/eslint-sample-app/test.js
   2:3  error  Missing JSDoc comment  require-jsdoc
  15:4  error  Unexpected 'this'      no-invalid-this

✖ 4 problems (4 errors, 0 warnings)
全部直したあとにコミットするとコミットが通る:
$ git commit
⚠ Skipping backup because there’s no initial commit yet.

✔ Preparing lint-staged...
✔ Running tasks for staged files...
✔ Applying modifications from tasks...
[master (root-commit) c7ae21e] [add] eslint, prettier, lint-staged
 8 files changed, 7199 insertions(+)
 create mode 100644 .eslintrc.yml
 create mode 100644 .husky/.gitignore
 create mode 100755 .husky/pre-commit
 create mode 100644 .prettierignore
 create mode 100644 .prettierrc.json
 create mode 100644 test.js
 create mode 100644 package-lock.json
 create mode 100644 package.json

その2. pretty-quick

使用例: 変更されたファイルやステージングされたファイルに対して、ファイル全体のフォーマットを行いたい場合に最適です。
huskyと一緒にインストールしてください。

# インストール
npm i -D husky-init pretty-quick
# 設定追加
npx husky set .husky/pre-commit "npx pretty-quick --staged"

その3. pre-commit

使用例多言語のプロジェクトに最適です。

以下の設定を .pre-commit-config.yaml ファイルにコピーしてください。

これまでの作業の中で .pre-commit-config.yaml ファイル は存在していないので、touch .pre-commit-config.yaml でファイルを作って以下コピペ

- repo: https://github.com/pre-commit/mirrors-prettier
  rev: "" # Use the sha or tag you want to point at
  hooks:
    - id: prettier
torchibatorchiba

いったんこの設定で導入し、必要に応じてカスタムしていく。
それまでクローズ。

このスクラップは2022/06/21にクローズされました