Իսկ ի՞նչ կապ ունի դա փաթեթների կառավարիչների և հասակակիցների կախվածության հետ:
Սկզբնապես հրապարակվել է https://zaicevas.com կայքում
TLDR.փլագինները որոնվում են վերջնական օգտվողի նախագծի համեմատ,մինչդեռ համօգտագործվող կոնֆիգուրացիաները որոնվում են կոնֆիգուրացիայի ֆայլի համեմատ, որտեղ նրանք հայտնվում են:
Եթե դուք օգտագործել եք eslint-config-airbnb
(ամենատարածված ESLint-ի համօգտագործվող կոնֆիգուրացիաներից մեկը), կարող եք մտածել, ինչու՞ պետք է տեղադրեք այսքան շատ գործընկերային կախվածություններ՝ eslint-plugin-import
, eslint-plugin-jsx-a11y
, eslint-plugin-react
, eslint-plugin-react-hooks
: Չե՞ք կարող eslint-config-airbnb
բերել այդ կախվածությունները:
Որպես այլընտրանք, եթե երբևէ ստեղծել եք ESLint հավելված կամ համօգտագործվող կոնֆիգուր, դուք, ամենայն հավանականությամբ, բախվել եք ինչպես է ESLint-ը լուծում պլագինները և համօգտագործվող կազմաձևերը:
Սա այն է, ինչ ես կպատասխանեմ այս բլոգի գրառմանը: Մարդկանց մեծամասնության համար դա կարևոր չէ հասկանալ: Այնուամենայնիվ, այն չափազանց օգտակար է դառնում, երբ դուք կառուցում եք ձեր սեփական ESLint փլագինը կամ համօգտագործվող կոնֆիգուրը: Աա և դա նաև կարկանդակ է հետաքրքրասեր մտքերի համար 😏
Փլագիններ ընդդեմ համօգտագործվող կազմաձևերի
Նախևառաջ, ESLint-ն ունի պլագիններ և ունի համօգտագործվող կոնֆիգուրացիաներ: Սրանք երկու տարբեր բաներ են.
- Համօգտագործելի կազմաձևում — պահպանում է բազմակի օգտագործման կոնֆիգուրացիա (կարծեք այն որպես կանոնների հավաքածու): Օրինակ՝
eslint-config-airbnb
- Plugin — կարող է անել այն ամենը, ինչ անում է համօգտագործվող կազմաձևը + կարող է ներառել հատուկ կանոններ: Օրինակ՝
eslint-plugin-jest
Ավելի գործնական օրինակների համար https://prateeksurana.me/blog/difference-between-eslint-extends-and-plugins/-ը պարզ և թեթև ընթերցում է:
Նշում. ես կօգտագործեմ config և shareable config փոխադարձաբար:
Փլագիններն ու կոնֆիգուրները տարբեր կերպ են լուծվում
Զարմանալիորեն, երբ ESLint-ը որոնում է պլագիններ և կազմաձևեր, այն նայում է տարբեր ուղիների: Այն նկարագրված է ESLint փաստաթղթերում.
Հարաբերական ուղիները և համօգտագործվող կոնֆիգուրացիայի անունները
extends
հատկության մեջ լուծվում են կազմաձևման ֆայլի գտնվելու վայրից, որտեղ նրանք հայտնվում են:
Աղբյուր՝ https://eslint.org/docs/user-guide/configuring/configuration-files#extending-configuration-files
Հիմնական կազմաձևման հավելումները (բեռնված
extends
կարգավորումով) հարաբերական են ստացված կազմաձևման ֆայլին:
Աղբյուր՝ https://eslint.org/docs/user-guide/configuring/plugins#configuring-plugins
Ստեղծված կազմաձևման ֆայլ նշանակում է սպառողական նախագծի կազմաձևման ֆայլ, ինչպիսին է your-project/.eslintrc.js
Այնուամենայնիվ, դա կարող է դեռ գաղտնի թվալ: Թույլ տվեք պարզեցնել դա ձեզ համար.
- Կարգավորել. եթե երկարացնեք
eslint-config-airbnb
, իսկeslint-config-airbnb
_________, ESLint-ը որոնում էyour-project/node_modules/eslint-config-airbnb/node_modules/eslint-config-prettier
- Փլագին — եթե երկարացնեք
eslint-config-airbnb
-ը ևeslint-config-airbnb
ը երկարացնեքeslint-plugin-react
, ESLint-ը որոնում էyour-project/node_modules/eslint-plugin-react
Այլ կերպ ասած, ESLint-ը ցանկանում է, որ բոլոր համօգտագործվող կոնֆիգուրայի սպառողները տեղադրեն բոլոր հավելումները:
Ահա թե ինչու eslint-config-airbnb
ներառում է պլագինները որպես գործընկերների կախվածություն:
ESLint փաստաթղթերում նաև նշված է.
Եթե ձեր համօգտագործվող կազմաձևը կախված է փլագինից, դուք պետք է նաև նշեք այն որպես
peerDependency
(պլագինները կբեռնվեն վերջնական օգտագործողի նախագծի համեմատ, ուստի վերջնական օգտագործողը պետք է տեղադրի իրեն անհրաժեշտ պլագինները): Այնուամենայնիվ, եթե ձեր համօգտագործվող կազմաձևը կախված է երրորդ կողմի վերլուծիչից կամ մեկ այլ համօգտագործվող կազմաձևից, կարող եք նշված փաթեթները նշել որպեսdependencies
:
Աղբյուր՝ https://eslint.org/docs/developer-guide/shareable-configs#publishing-a-shareable-config
Ինքնուրույն ESLint հավելված/կոնֆիգուր
Եթե ձեզ հետաքրքրում է, թե ինչու ESLint-ը չի կարող կսմթել այս վարքագիծը և թույլ տալ, որ ESLint պլագինները/կազմաձևերը լինեն ինքնուրույն (բերեք այլ պլագիններ որպես կախվածություն), ապա դուք միայնակ չեք:
Գոյություն ունի GitHub-ի խնդիր, որը թվագրվում է 2015 թվականից. Աջակցել փլագիններին որպես կախվածություն համօգտագործվող կազմաձևում: Կա նաև բավականին դրամա: Եվ նույնիսկ կա ESLint patch, որն օգնում է հասնել դրան: Թեև անձամբ ես կվարանեի օգտագործել այն, քանի որ այն պահանջում է, որ բոլոր սպառողական նախագծերը բացահայտորեն օգտագործեն այն կազմաձևման ֆայլերում:
ESLint թիմն արդեն աշխատում է Flat Config-ի ներդրման վրա, ինչը նշանակում է, որ ESLint-ը օգտատերերին կթողնի զանգահարել require()
-ին և լուծել փլագինները/կոնֆիգուրացիաները:
Այնուամենայնիվ, ինքնամփոփ plugin/config արդեն հնարավոր է 😈
Հենց այստեղ են պատկերվում տարբերփաթեթների կառավարիչների նրբությունները:
Տեսեք, փաթեթների կառավարիչները node_modules
-ի վարպետներն են: Եթե փաթեթի կառավարիչը կարողանում է անցումային կախվածությունները (օրինակ՝ eslint-config-airbnb
-ի կախվածությունները) դնել your-project/node_modules
-ի մեջ, դրանք կարող են լուծվել ESLint-ի միջոցով:
Փաթեթի տարբեր կառավարիչներ node_modules
-ի կառավարման տարբեր եղանակներ ունեն.
npm
v3 և ավելի ուշ — հարթnode_modules
✅yarn
v1— բնակարանnode_modules
✅yarn
v2 — Plug’n’Play ❌pnpm
— hoists ESLint plugins/configs ✅
Ինչպես տեսնում եք,yarn
v2-ը տարօրինակն է: npm
-ը և pnpm
-ն արդեն դրել են ESLint անցումային կախվածությունները անմիջապես your-project/node_modules
-ի մեջ:
Այլ կերպ ասած, եթե տեղադրեք eslint-config-airbnb
-ը և այն բերի eslint-plugin-import
-ը որպես կախվածություն, այն կտեղակայվի your-project/node_modules/eslint-plugin-import
-ում, այլ ոչ թե your-project/node_modules/eslint-config-airbnb/node_modules/eslint-plugin-import
-ում կամ այլ տեղ:
Այսպիսով, եթե ESLint փլագինը/կազմաձևը կարող է իրեն թույլ տալ ՉԻ աջակցել yarn
-ին, ESLint-ի այլ պլագինները dependencies
-ում տեղադրելը հեշտացնում է ինքնուրույն փլագին/կոնֆիգուրացիա ձեռք բերելը: Նշանակում է, որ սպառողական նախագծերի համար անհրաժեշտ չէ տեղադրել պլագիններ որպես գործընկերների կախվածություն:
Այնուամենայնիվ, պարզապես կրկնելու համար, դա չի աշխատի yarn
v2-ի հետ, այնպես որ ես չեմ զարմանում, որ eslint-config-airbnb
-ը չի ներառում հավելումները որպես dependencies
:
Ամփոփում
Հուսով եմ, որ այս բլոգի գրառումն օգտակար է ձեզ համար: Ամփոփեմ.
- ESLint պլագինները և համօգտագործվող կազմաձևերը երկու տարբեր բաներ են
- ESLint-ը լուծում է պլագիններն ու կազմաձևերը այլ կերպ
- Փլագինները որոնվում են վերջնական օգտվողի նախագծի համեմատ (
your-project/node_modules/eslint-plugin-foo
) - Կազմաձևերը որոնվում են կոնֆիգուրացիայի ֆայլի համեմատ, որտեղ նրանք հայտնվում են
- Քանի որ հավելումները որոնվում են վերջնական օգտագործողի նախագծի համեմատ, խորհուրդ է տրվում դրանք տեղադրել որպես
peerDependencies
ESLint կոնֆիգուրացիա/պլագինում, այսինքն՝ սպառողական նախագծերը պետք է տեղադրեն դրանք: - Փլագինները և կազմաձևերը կարող են այլ պլագիններ բերել որպես
dependencies
, ի տարբերությունpeerDependencies
-ի: Սա համատեղելի էnpm
ևpnpm
✅-ի հետ, բայց ոչyarn
v2 ❌