ESLint + Prettier 自分用初期設定カンペ
https://roadmap.sh/frontend の 「Linters formatters」の項を一巡し、公式マニュアルにもおおよそ目を通せたと思うので、今後自分が個人開発などでササッと導入するためのカンペを作っておこうと思った。
実際にページを読みながらメモ取っていた時は Notion を使ってたけど、自分以外の人にも何かしら勉強していることがわかるようにしたいと Zenn の Scraps にもメモすることにした。
(Scraps、公開するためのハードルが低くて良いですね)
参考ページは以下:
このあとESLint公式も読んだけど自分が何かしら作る時はこの設定使えばいいんじゃないかと思った
動作環境 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」をベースに自分用にちょっといじっている:
Prettier
インストール
# prettier のインストール
npm i -D --save-exact prettier
# 空の設定ファイル .prettierrc.jsonを追加して、Prettierを使用していることをエディタに知らせる。
echo {}> .prettierrc.json
# .prettierignore を追加して、除外ファイルを記載する
echo {}> .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!
ESLint と Prettier を併用するための設定
eslint-config-prettier インストール
npm i -D eslint-config-prettier
ESLintインストール直後、 npx eslint --init
を使って設定ファイルを作った時に .eslintrc.*
(私の場合は .eslintrc.yml
)がディレクトリ内に作られているので、そのファイルを開くとこうなっている:
env:
browser: true
es2021: true
extends:
- google
parserOptions:
ecmaVersion: latest
sourceType: module
rules: {}
extends:
の必ず一番最後 に prettier
を追記する
他の設定を上書きしてしまうので、必ず最後に追加してください。
GitHub - prettier/eslint-config-prettier
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
Pre-commit Hook 設定
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
インストール
# インストール
npm i -D husky lint-staged
npx husky install
# package.json > prepare script を追記
npm pkg set scripts.prepare="husky install"
実行すると 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
以下は設定例 使うやつだけ使う
# コードスタイルを自動的に修正し、コミットに追加する。
# これにより、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 に以下記述が追加される:
{
"lint-staged": {
"**/*": "prettier --write --ignore-unknown"
}
}
これらの設定を行うことで、git add
⇒ git 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
いったんこの設定で導入し、必要に応じてカスタムしていく。
それまでクローズ。