ESLintとPrettierを併用するときの設定(eslint-plugin-prettier, eslint-config-prettier)
今さらだけどメモ。
ESLint を使っているプロジェクトに Prettier を導入するときの設定方法。
結論としては、公式のこのページに全部まとまってた。
なお、 prettier-eslint というのもあるようだが調べていない。
先にまとめ
eslint-plugin-prettier
: ESLint と一緒に Prettier のチェックをしたい場合に導入するeslint-config-prettier
: Prettier とバッティングする、ESLint のフォーマット関係のルールを無効化する- 1, 2 両方やりたい場合、両方インストールして ESLint の設定に
"extends": ["plugin:prettier/recommended"]
と書けば OK
eslint-plugin-prettier
も eslint-config-prettier
も公式のパッケージ。
- https://github.com/prettier/eslint-plugin-prettier
- https://github.com/prettier/eslint-config-prettier
1. eslint-plugin-prettier
: ESLint と一緒に Prettier のチェックをしたい場合に導入する
eslint
と prettier
コマンドを別々に実行するのではなく、ESLint で Prettier のチェックも同時にしたい場合に導入する。
$ yarn add --dev prettier eslint-plugin-prettier
ESLint の設定 ( .eslintrc.json
) には以下のように書く。
{ "plugins": ["prettier"], "rules": { "prettier/prettier": "error" } }
例
// main.js const a = 1 var b = "foo"; let c = function() {}; console.log(b);
結果
# eslint-config-standard を extends してるとする $ ./node_modules/.bin/eslint main.js /Users/yamazaki/workspace/eslint-prettier-playground/main.js 1:7 error 'a' is assigned a value but never used no-unused-vars 1:12 error Insert `;` prettier/prettier 2:9 error Strings must use singlequote quotes 2:14 error Extra semicolon semi 3:5 error 'c' is assigned a value but never used no-unused-vars 3:5 error 'c' is never reassigned. Use 'const' instead prefer-const 3:17 error Missing space before function parentheses space-before-function-paren 3:22 error Extra semicolon semi 3:23 error Delete `⏎` prettier/prettier 4:1 error More than 1 blank line not allowed no-multiple-empty-lines 6:15 error Extra semicolon semi
Prettier でフォーマットされる箇所が ESLint の1ルールとして検出されている。
また
https://github.com/prettier/eslint-plugin-prettier
The rule is autofixable -- if you run
eslint
with the--fix
flag, your code will be formatted according toprettier
style.
なので、--fix
オプションつきで実行することによりフォーマットしてファイルを上書きすることも可能。
2. eslint-config-prettier
: Prettier とバッティングする、ESLint のフォーマット関係のルールを無効化する
先の例で、セミコロンの有り無しは eslint-config-standard の設定と Prettier のデフォルト設定がコンフリクトしている。
このように ESLint のフォーマット系ルールは Prettier とコンフリクトする可能性があるので、それらのルールを無効化するために導入するのが eslint-config-prettier
$ yarn add --dev eslint-config-prettier
ESLint の設定 ( .eslintrc.json
) には以下のように書く。
{ "extends": ["prettier"] }
なお、
https://github.com/prettier/eslint-config-prettier#installation
Then, add eslint-config-prettier to the "extends" array in your
.eslintrc.*
file. Make sure to put it last, so it gets the chance to override other configs.
とあるので、extends
に複数の config を指定する場合は一番最後に設定する。
例
// .eslintrc.json { "extends": ["standard", "prettier"] }
先ほどの main.js に対して
$ ./node_modules/.bin/eslint main.js /Users/yamazaki/workspace/eslint-prettier-playground/main.js 1:7 error 'a' is assigned a value but never used no-unused-vars 3:5 error 'c' is assigned a value but never used no-unused-vars
フォーマット系のエラーは出なくなった。
ただし、全部無効化しているだけで Prettier のチェックもしていないので、 --fix
オプションをつけただけでは何も起きない。
(別途 prettier --write
をすればフォーマットされる)
注意 (2019/03/16追記)
https://github.com/prettier/eslint-config-prettier#special-rules によると、いくつか理由があって無効にしているルールがあるらしく、必要なオプション含めて各自判断しながら有効化しないといけないものがあるらしい。
注意2 (2019/03/17追記)
https://github.com/prettier/eslint-config-prettier#installation
をちゃんと読むと、
If you extend a config which uses a plugin, it is recommended to add
"prettier/that-plugin"
(if available). For example, eslint-config-airbnb enables eslint-plugin-react rules, so"prettier/react"
is needed:
とあるので、 eslint-plugin-xxx
を入れている場合は (あれば) 対応する prettier/xxx
も extends
に追加すると
そのプラグインに含まれるフォーマット系のルールを無効化してくれる。
{ "extends": [ "airbnb", "prettier", "prettier/react" ] }
3. 1, 2 両方やりたい場合
Use Both セクションに書かれている通りだが、1, 2どちらも有効にしたい場合は
それぞれの設定を書く必要はなく、 "extends": ["plugin:prettier/recommended"]
と書けば OK。
// .eslintrc.json { "extends": ["plugin:prettier/recommended"] }
eslint-plugin-prettier
, eslint-config-prettier
どちらも npm install / yarn add しておく必要があることに注意。
注意 (2019/03/17追記)
eslint-config-prettier
のところで書いた、eslint-plugin-xxx
に対応する prettier/xxx
については
// .eslintrc.json { "extends": [ "plugin:prettier/recommended", "prettier/react" ] }
というように書くとうまく効いてるように見えた。
(動作確認したが公式ドキュメントからは見つからず)
その他
これらの設定をしても、 rules: { ... }
のところに個別にフォーマット系ルールを設定していた場合はそっちが勝つので注意。当たり前だけど。