ESLint の Plugin と Extend の違い
これがわかりやすいが、読むだけだと理解しきれないかも
合わせてnextとかの例を見るとmiyamonz.iconは理解できた
miyamonz.iconの解釈も交えてまとめ直す
pluginとextend(で指定するsharable config)は、相互依存っぽい感じになってて分かりにくい
pluginは
ルールの追加とかする
Plugins can also provide additional environments, custom processors, and configurations.
sharable configは
Shareable configs are simply npm packages that export a configuration object.
extendsに書くことで、configのobjectをObject.assign的にマージできるやつ
pluginとrulesの設定をしたものをマージすれば、自由に設定を追加できる
じゃあぜんぶsharable configでいいじゃん、というのはそのとおりなのだが、
pluginの定義の中にsharable configを入れておくこともできる、というのがややこしい
これは"plugin:eslint-hoge"みたいな接頭詞を使う
利用者の選択肢
npm packageとして提供されてるsharable configをextendsする
npm package として提供されてるpluginの内側に入ってるsharable conifgを使う
npm packageとして提供されてるpluginを読み込み、自分でルール毎の設定を行う
どう提供されてるのかは、ライブラリ提供者の都合なので、利用者はそれに合わせないといけない
ルールを共有したいならplugin
ただし、ルールを提供するライブラリが、recommendedのようにconfigを共有したい場合もある
設定を共有したいならsharable config
ルールを提供したいが、ついでにconfigも提供したい場合は、pluginの中にconfigを書くというケースが有る、と考えていいだろう
---- 以下メモ
Pluginフィールド
独自ルールの追加などができる
sharable config
eslintの設定を共有できる単位
オブジェクトのマージって感じで合体できる
deepにObject.assignする感じ?
試してないから想像で言ってます
extendsに指定してマージできる
特定のpluginを指定するような設定を作ることで、pluginを入れるsharable configを作れる
extendsフィールド
sharable configを指定できる
実は、pluginの内側にsharable configを定義できる
設定する際は、plugin:hogeという指定で、plugin内のsharable configをextendできる
PluginとExtend(すなわちsharable config)は、どっちからどっちでも呼び出したりできるのでややこしい
利用者側のエントリーポイントがeslint全体で統一されておらず、サードパーティの設定やプラグイン提供者に委ねられる
extendsから諸々が入れられる以上、これを使うのがいいが
hogeなのかplugin:hogeで指定するのかは、提供者側が定めるのでそれに従う
プラグイン提供者側の視点
configのみだと独自のルールが追加できない
であってる?
んなこたないのでは
ルールを定義する必要があるなら、pluginを作らないといけない
eslint-plugin-hoge, eslint-config-hogeを両方提供するのがだるい場合
plugin内にconfigを書くのが楽
monorepoスタイルで両方持つのもあり
nextがこれをやっている
eslint-config-next
eslint-plugin-next
これは、nextのpluginの前にreactのpluginなども継承したものとしてconfigを提供したいため
すなわち、自分自身の設定だけじゃなくて外部のものも混ざるときによさそう
もちろん、pluginに全部入れるのでもできるかもしれんが、nextのpluginと、全体の設定という異なるスコープなので別パッケージに分けるメリットはありそう
configを提供して、pluginをextendしてる場合は、eslint-config-hogeがeslint-plugin-hogeをnpm packageとして依存させておくとよい
ユーザがいちいちpluginのnpm installをしなくてよくて、configのnpm installで済むため
prettierは現在このスタイル
ややこしさの原因として考えられるもの
追加という動詞
ルールセットへの追加と
プロジェクトへの追加
プロジェクトに追加するときは、ルールセットへの追加と、その追加したルールへの設定指定をする
設定という名詞と動詞
プロジェクト全体のeslintrcという設定と
個別ルールへの設定