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でもっと良いの出てきてほしい。
コメント
コメントを投稿