ESLint - Prettier連携のやり方と仕組み
ESLint - Prettier連携のやり方と仕組み:
メモ代わりに関係ない情報も色々含めた。
JSのLinter。めっちゃカスタマイズできる。
JSのフォーマッター。
具体例で言うと、「1行80字超えのコードを適切に改行してくれる」らしい。
やたらこの例を推してくる。他の例を知りたい。
Linterのルールには2種類ある。
ESLintほど充実していない。
よりカスタマイズできる版を提供しようっていうフォークプロジェクトがあるぐらい。
応援したい。でも開発止まってるっぽい。
Yes, I am.
個人的にはそれで良いのか感がすごい。
Prettier流のフォーマットがどれだけ上書きされてるのか知りたい。
やはりPrettierの優位な点をリストアップした資料とかが欲しい。
「80字超え対処」しか強みがないならこれで良いと思う。
prettier/eslint-config-prettier
prettier/eslint-plugin-prettier
この辺を組み込む。すると、
以下、この辺の仕組みの解説。
ソース内コメントや設定ファイルによって色々カスタマイズできる。
設定ファイルは、
高い順に
オブジェクト指向的にいえば、設定をどんどんオーバーライドしていってる感じ。
また、ホームディレクトリに
上記の3つが全部無かった時のみここの設定が反映される。
他には、環境(ECMAいくつか、nodeかbrowserか、jQuery使ってるか、etc...)、グローバル変数の設定など。
例えば、
ただし、記述するだけでなくnpmで自分で落としてこないといけない。
ESLintを入れた場所がプロジェクトローカルならプロジェクトローカルに、グローバルならグローバルに。同じレベルに落とさないと使えない。
複数の設定を取り込むこともできる。
後のやつが前の設定をどんどんオーバーライドしていく。
取り込んだ後、更に自分で
ルールを増やしたりできる。共有設定を含めることもできる。
例えば、
プラグイン内のルールは以下のように指定する。
プラグイン内の共有設定は以下のように取り込む。
ということは、ESLintの組み込みルールを全部無効にし、Prettierのプラグインルールに差し替えまくればいいことになる。
上の方で、ルールには2種類あると書いた。
なので、前者に関するESLintの組み込みルールを全部オフにする。
共有設定
これを取り込むことで、Prettierのルールが代わりに追加される。されるのだが...。
なんと、
Prettierが扱う全ルールが、この1つにまとめられている。
つまり、ルール毎にON/OFFを細かく設定できない。
全部offか、全部warningか、全部errorかしかない。
しかし、全くカスタマイズが効かないというわけではない。
例えば、ESLint組み込みの
同じノリで、
無理やり感がすごい。
ちなみに
なお、このプラグインには共有設定
上記により、下記と同じ効果が得られる。
逆にいうとそれだけ。
Prettier本体は雰囲気で入れてるけど、本当に必要なのかは未検証。
他に取り込みたい共有設定があれば、
JavaScript Standard Styleに合わせたいのだが、Prettierに
メモ代わりに関係ない情報も色々含めた。
これまでのあらすじ
ESLint is 何
JSのLinter。めっちゃカスタマイズできる。eslint --fix
コマンドでフォーマットもできる。
Prettier is 何
JSのフォーマッター。eslint --fix
よりも強いらしい。具体例で言うと、「1行80字超えのコードを適切に改行してくれる」らしい。
やたらこの例を推してくる。他の例を知りたい。
Prettier only ダメ is なぜ
フォーマットしかできない
Linterのルールには2種類ある。- フォーマットに関するルール
- コードの品質に関するルール
カスタマイズ性に乏しい
ESLintほど充実していない。よりカスタマイズできる版を提供しようっていうフォークプロジェクトがあるぐらい。
応援したい。でも開発止まってるっぽい。
Why don't you ESLintとPrettierを併用?
Yes, I am.
併用 is どうやる
prettierをかましてからeslint --fix
をかます。
Code ➡️ prettier ➡️ eslint --fix ➡️ Formatted Code ✨公式リポジトリにそういうプロジェクトがあるぐらいなので、アリっぽい。
prettier/prettier-eslint
個人的にはそれで良いのか感がすごい。
Prettier流のフォーマットがどれだけ上書きされてるのか知りたい。
やはりPrettierの優位な点をリストアップした資料とかが欲しい。
「80字超え対処」しか強みがないならこれで良いと思う。
ESlintをカスタマイズしてPrettierと連携させる。
prettier/eslint-config-prettierprettier/eslint-plugin-prettier
この辺を組み込む。すると、
eslint --fix
をした時にprettier準拠でフォーマットがされることになる。以下、この辺の仕組みの解説。
本題
ESLintの設定について
概要
ソース内コメントや設定ファイルによって色々カスタマイズできる。設定ファイルは、
package.json
内にeslintConfig
フィールドを設けて記述するパターンと、.eslintrc.{js|json|yaml}
ファイルを作るパターンがある。
設定の優先順位
高い順に- コメント
- CLIコマンドのオプション
- 設定ファイル
-
.eslintrc.*
を置いたフォルダの子フォルダに更に.eslintrc.*
を置いたりできる。
- チェックするjsファイルについて、近い階層に置いてある
.eslintrc.*
の設定ほど優先して採用される。 -
.eslintrc.*
内でroot: true
を指定すると、それより親フォルダの.eslintc.*
は無視される。
- チェックするjsファイルについて、近い階層に置いてある
-
.eslintrc.*
とeslintConfig
を記載したpackage.json
の両方が同じ階層にある場合、eslintConfig
は無視される。
-
オブジェクト指向的にいえば、設定をどんどんオーバーライドしていってる感じ。
また、ホームディレクトリに
.eslintrc.*
があるとフォールバックとして働く。上記の3つが全部無かった時のみここの設定が反映される。
設定できることの一例:ルールのON/OFF
eslintrc.js
module.exports = { "rules": { // ==を使おうが===を使おうが気にしない。 "eqeqeq": "off", // if文などで{}を略したらwarning。 "curly": "warn", // ダブルクォートを使う。シングルクォートを使ってたらLinterエラー。 "quotes": ["error", "double"] // セミコロンは必須。無かったらLinterエラー。 "semi": ["error", "always"] } }
設定の共有
eslint-config-*
という名前でnpmモジュールとして設定を共有できる。例えば、
eslint-config-standard
は以下の記述で取り込むことができる。eslintrc.json
{ "extends": "standard" }
ESLintを入れた場所がプロジェクトローカルならプロジェクトローカルに、グローバルならグローバルに。同じレベルに落とさないと使えない。
複数の設定を取り込むこともできる。
eslintrc.json
{ "extends": [ "eslint:recommended", "standard" ] }
取り込んだ後、更に自分で
rules
とか設定しだすのもオーバーライドになる。
設定のプラグイン
eslint-plugin-*
という名前でnpmモジュールとしてプラグインを作成できる。ルールを増やしたりできる。共有設定を含めることもできる。
例えば、
eslint-plugin-react
は以下の記述で取り込むことができる。eslintrc.json
{ "plugins": ["react"] }
eslintrc.json
{ "plugins": ["react"], "rules": { "react/no-set-state": "error" } }
eslintrc.json
{ "plugins": ["react"], "extends": ["plugin:react/recommended"] }
Prettier連携
方針
eslint --fix
の仕様についてはちゃんと調べていないが、おそらく「ルール」の中には「どう直すか」も含まれている。ということは、ESLintの組み込みルールを全部無効にし、Prettierのプラグインルールに差し替えまくればいいことになる。
上の方で、ルールには2種類あると書いた。
- フォーマットに関するルール
- コードの品質に関するルール
なので、前者に関するESLintの組み込みルールを全部オフにする。
eslint-config-prettier
の使い方
共有設定prettier
を取り込むことで、Prettierと競合しそうなESLintの組み込みルールを全部OFFにしてくれる。react
プラグインの分をOFFにする共有設定prettier/react
等、細かい追加分もある。
eslint-config-plugin
の使い方
これを取り込むことで、Prettierのルールが代わりに追加される。されるのだが...。なんと、
eslintrc.json
{ "plugins": ["prettier"], "rules": { "prettier/prettier": "error" } }
prettier
というルール1つしか追加されない。Prettierが扱う全ルールが、この1つにまとめられている。
つまり、ルール毎にON/OFFを細かく設定できない。
全部offか、全部warningか、全部errorかしかない。
しかし、全くカスタマイズが効かないというわけではない。
例えば、ESLint組み込みの
indent
ルールは、ルールのON/OFFだけでなくインデント幅のルールも設定できる。eslintrc.js
module.exports = { "rules": { // インデント幅が2でなければLinterエラー。 "indent": ["error", 2] } }
prettier
ルールもオブジェクトを使って色々ルールを設定できる。eslintrc.js
module.exports = { "plugins": ["prettier"], "rules": { // シングルクォートを使う。セミコロンは無し。 "prettier/prettier": ["error", {"singleQuote": true, "semi": false}] } }
ちなみに
.prettierrc
ってファイルで設定する方法もあるらしい。なお、このプラグインには共有設定
recommended
も含まれている。eslintrc.json
{ "extends": ["plugin:prettier/recommended"] }
eslintrc.json
{ "extends": ["prettier"], "plugins": ["prettier"], "rules": { "prettier/prettier": "error" } }
手順まとめ
shell.sh
npm install --save-dev eslint npm install --save-dev eslint-config-prettier npm install --save-dev eslint-plugin-prettier npm install --save-dev prettier
eslintrc.js
module.exports = { "extends": ["prettier"], "plugins": ["prettier"], "rules": { "prettier/prettier": [ "error", { // 各種設定 } ] } }
prettier
より前にextendする。(prettier
でルールOFFにする方が優先順位が高いので。)
愚痴
JavaScript Standard Styleに合わせたいのだが、PrettierにspaceBeforeFunctionParen
オプション(関数名と引数名の間にスペースを空ける。ex. function name (arg) { ... }
)が無いため合わせられない。- フォークプロジェクト頑張ってほしい。
- というか普通にPrettierがカスタマイズ性上げてほしい。
- というかStandard Styleはこの仕様だけマイナーなのでやめてほしい。
- というかセミコロン無しのStyleでもっと良いの出てきてほしい。
コメント
コメントを投稿