Mundarija (34)
- Bu darsda
- 1. Nega bu kerak?
- 2. Linter va formatter
- 3. Stylelint'ni o'rnatish
- 3.1 Paketlar
- 3.2 Sozlama fayli
- 3.3 Birinchi tekshiruv
- 4. Qoidalarni sozlash
- 4.1 Qoida yoqish, o'chirish, sozlash
- 4.2 !important — jamoa qarori
- 4.3 BEM nom namunasi
- 4.4 Jismoniy xususiyatlar
- 4.5 Xususiyatlar tartibi — plagin
- 4.6 SCSS uchun
- 5. --fix va istisnolar
- 5.1 --fix: avtomatik tuzatish
- 5.2 Istisno: qoidani bir joyda o'chirish
- 6. Prettier va Stylelint birga
- 6.1 To'qnashuv bormi?
- 6.2 VS Code'da
- 6.3 Commit oldidan: lint-staged
- 7. Ko'p uchraydigan xatolar
- 7.1 Qo'shtirnoqsiz glob
- 7.2 To'plam o'rnatilmagan
- 7.3 Qoida — buyruq emas, savol
- 7.4 --fix kerakli narsani o'chirdi
- 8. Mashqlar
- 1-mashq (oson): xabarlarni o'qing
- 2-mashq (o'rta): jamoa qoidalari
- 3-mashq (qiyin): --fix nimani qiladi?
- 4-mashq: Portfolio qadami — npm run check ga Stylelint
- 9. Real ishda
- Xulosa
- Manbalar
Stylelint va Prettier: CSS kod sifati
Qisqacha: Stylelint — CSS uchun linter: brauzer jim tashlab ketadigan xatolarni (noma'lum xususiyat, noto'g'ri qiymat, takror) va jamoa qoidalarining buzilishini topadi. U
npm install --save-dev stylelint stylelint-config-standardbilan o'rnatiladi, qoidalari.stylelintrc.jsonda sozlanadi vanpx stylelint "**/*.css"bilan ishlaydi. Prettier kod ko'rinishini tekislaydi, Stylelint — ma'nosini tekshiradi; ikkalasi bittanpm run checkda birlashadi.
Bu darsda
- Linter va formatter farqini tushuntira olasiz.
- Stylelint'ni o'rnatib,
stylelint-config-standardbilan CSS'ni tekshirasiz va xabarlarini o'qiysiz. - Qoidalarni yoqasiz, o'chirasiz va sozlaysiz:
!important, BEM nom namunasi, jismoniy xususiyatlar, xususiyatlar tartibi. --fixni xavfsiz ishlatasiz va qoidani bitta qatorda asoslab o'chirasiz.- Portfolio'ning
npm run checkiga Stylelint'ni qo'shasiz.
Oldin bilishingiz kerak: HTML kod uslubi, PostCSS va Autoprefixer, Kaskad, Mantiqiy xususiyatlar.
1. Nega bu kerak?
CSS nima darsida brauzerning eng katta kamchiligini ko'rgan edik: xato qilsangiz, u sizga aytmaydi. Mana bitta qator:
<style>
.taom-karta {
padding: 1rem;
border: 2px solid #2f6b3;
font-family: system-ui, sans-serif;
}
.aksiya {
padding: 1rem;
border: 2px solid #b4461a;
font-family: system-ui, sans-serif;
}
</style>
<article class="taom-karta">
<h3>Osh</h3>
<p>35 000 so'm</p>
</article>
<p class="aksiya">Bugun ko'k choy — 5 000 so'm!</p>Nimaga qarang: aksiyada qizg'ish chegara bor, osh kartasida esa umuman yo'q. Rang kodida bitta belgi tushib qolgan: #2f6b3 — beshta belgi, hex rang esa 3, 4, 6 yoki 8 belgidan iborat bo'ladi. Brauzer butun border deklaratsiyasini jim tashladi. Chrome'da tekshirdik: konsolda hech qanday xabar yo'q.
Bunday xatoni ko'z bilan topish qiyin — ayniqsa 700 qatorli faylda. HTML kod uslubi darsida HTML uchun html-validate ishlatgan edik: u teglar va atributlarni tekshiradi. CSS uchun ham shunday "nazoratchi" bor — Stylelint.
O'xshatish: imtihon insholarini tekshiruvchi o'qituvchi. Imlo xatolarini, noto'g'ri so'zlarni, qoidalarga zid joylarni qizil ruchka bilan belgilaydi. U inshoni siz uchun qayta yozmaydi — faqat ko'rsatadi. Ba'zi mayda xatolarni esa o'zi tuzatib qo'yishi mumkin.
2. Linter va formatter
Ikki yangi so'z:
- Formatter (formatter) — kodning tashqi ko'rinishini (bo'sh joy, qator, chekinish) bir xil qiladigan dastur. Prettier aynan shunday — uni HTML kod uslubi darsida ishlatgan edik.
- Linter (linter) — kodni ishga tushirmasdan o'qib, xato va shubhali joylarni topadigan dastur. Nomi 1978-yildagi C tili vositasi
lintdan: kiyimdagi mayda tuklarni ("lint") terib oladigan cho'tka.
Bu ikki vosita turini adashtirmaslik muhim:
| Formatter (Prettier) | Linter (Stylelint) | |
|---|---|---|
| Nimaga qaraydi | Ko'rinish: bo'sh joy, qator, chekinish | Ma'no: xato, xavfli yozuv, jamoa qoidasi |
| Nima qiladi | Faylni o'zi qayta yozadi | Xabar beradi, ba'zisini tuzatadi |
| Savol | "Chiroyli yozilganmi?" | "To'g'ri yozilganmi?" |
Prettier CSS'ni ham tekislaydi. Tartibsiz yozilgan kod:
.narx{color:#B4461A;font-weight:bold}
.taom-karta .narx ,.aksiya{
padding:0 1rem;margin:0}npx prettier dan keyin (Prettier 3.9.9):
.narx {
color: #b4461a;
font-weight: bold;
}
.taom-karta .narx,
.aksiya {
padding: 0 1rem;
margin: 0;
}Har deklaratsiya — alohida qatorda, har selektor — alohida qatorda, hex kichik harfda. Lekin #2f6b3 ni Prettier "tuzatmaydi" — u faqat shaklga qaraydi. Ma'noni Stylelint tekshiradi.
3. Stylelint'ni o'rnatish
3.1 Paketlar
«Bahor» papkasida (package.json bor bo'lsa, npm init -y kerak emas):
npm install --save-dev stylelint stylelint-config-standard
npx stylelint --versionOxirgi buyruq javobi:
17.15.0Ikki paket:
stylelint— dasturning o'zi. Unda 100 dan ortiq qoida (rule) bor, lekin standart holatda hammasi o'chiq.stylelint-config-standard— tayyor sozlama to'plami (shareable config): tajribali dasturchilar tanlagan qoidalar ro'yxati. Biz uni 40.0.0 versiyada o'rnatdik.
3.2 Sozlama fayli
Loyiha ildizida .stylelintrc.json:
{
"extends": ["stylelint-config-standard"]
}extends — "shu to'plamdagi qoidalarni ol". html-validate'dagi extends bilan bir xil g'oya (HTML kod uslubi).
3.3 Birinchi tekshiruv
assets/css/asosiy.css ga ataylab xatolar qo'yamiz:
.taomKarta {
colr: #2f6b3a;
border: 2px solid #2f6b3;
}
.narx {
color: #b4461a;
color: #b4461a;
font-weight: bold !important;
}
.aksiya a:hover {
color: #1a5d1a;
}
a {
color: #2f6b3a;
}Tekshiruv — fayl yo'li qo'shtirnoqda, ** — "hamma ichki papkalar" (HTML kod uslubi darsidagi kabi):
npx stylelint "assets/css/**/*.css"assets/css/asosiy.css
1:1 ✖ Expected class selector ".taomKarta" to be kebab-case selector-class-pattern
2:3 ✖ Unknown property "colr" property-no-unknown
3:21 ✖ Unknown value "#2f6b3" for property "border" declaration-property-value-no-unknown
7:3 ✖ Duplicate property "color" declaration-block-no-duplicate-properties
16:1 ✖ Expected selector "a" to come before selector ".aksiya a:hover", at line 12 no-descending-specificity
✖ 5 problems (5 errors, 0 warnings)
1 error potentially fixable with the "--fix" option.Har qatorda: qator:ustun, ✖ belgisi, xabar va o'ng chetda qoida nomi. Qoida nomi eng foydali qism — uni qidiruvga yozsangiz, Stylelint saytida qoidaning to'liq tavsifi chiqadi. Xabarlar:
| Qoida | Tarjima va ma'no |
|---|---|
selector-class-pattern |
".taomKarta class selektori kebab-case bo'lishi kutilgan" |
property-no-unknown |
"Noma'lum xususiyat colr" |
declaration-property-value-no-unknown |
"border uchun noma'lum qiymat #2f6b3" |
declaration-block-no-duplicate-properties |
"color xususiyati takrorlangan" |
no-descending-specificity |
"a selektori .aksiya a:hover dan oldin kelishi kutilgan" |
Oxirgisi tushuntirishni talab qiladi. .aksiya a:hover ning og'irligi (0,2,1), a niki (0,0,1) (Specificity). Qoida shunday deydi: "og'irroq selektor yengilroqdan keyin tursin". Aks holda faylni o'qigan odam "pastdagi a yutadi" deb o'ylashi mumkin, aslida esa yuqoridagi og'ir selektor yutadi. Bu xato emas, o'qishni chalkashtiradigan joy haqida ogohlantirish.
Oxirgi qator: "1 ta xatoni --fix bilan tuzatish mumkin". !important esa hech narsa demadi — standart to'plamda u taqiqlanmagan. Buni o'zimiz yoqamiz.
Yana bir sinov. CSS nima darsida ko'rgan xatoni — // bilan yozilgan izohni — fayl boshiga qo'shamiz: // Menyu sahifasi. CSS'da izoh faqat /* */ bilan yoziladi. Stylelint Invalid double-slash CSS comment ("CSS'da qo'sh qiya chiziqli izoh yaroqsiz", qoida no-invalid-double-slash-comments) xatosini beradi. Qiziq joyi: .taomKarta haqidagi xato esa yo'qoladi. Nega? // izoh bo'lmagani uchun brauzer ham, Stylelint ham uni keyingi qator bilan birga bitta selektor deb o'qiydi: // Menyu sahifasi .taomKarta. Bu buzilgan selektor — unda .taomKarta class'i endi alohida ko'rinmaydi. Xulosa: xatolar qatlam-qatlam, birinchisini tuzatsangiz, ortidagisi chiqadi.
Tekshirib ko'ring: Brauzer
colr: #2f6b3ani nima qiladi va Stylelint nimasi bilan foydali?
Javob
Brauzer noma'lum xususiyatni jim tashlaydi — sahifa ochiladi, faqat matn rangi o'zgarmaydi. Hech qayerda xabar yo'q. Stylelint esa faylni saqlashdan oldin yoki npm run check da aniq qator va ustun bilan ko'rsatadi: 2:3 Unknown property "colr". Xato mehmonga yetib bormasdan ushlanadi.
4. Qoidalarni sozlash
4.1 Qoida yoqish, o'chirish, sozlash
.stylelintrc.json dagi rules bo'limi to'plamning ustidan yoziladi:
{
"extends": ["stylelint-config-standard"],
"rules": {
"declaration-no-important": true,
"no-descending-specificity": null
}
}true— qoidani yoqish.null— qoidani o'chirish.- Massiv — qoida va uning sozlamasi:
["qiymat", { qo'shimcha }].
4.2 !important — jamoa qarori
Kaskad darsida "jamoalarda CSS tekshiruvchi vosita !important ni taqiqlashi mumkin" degan edik. Mana u: declaration-no-important. Yuqoridagi faylda endi yangi xato:
9:21 ✖ Disallowed !important declaration-no-importantTarjimasi: "!important taqiqlangan." Lekin display va yashirish darsidagi [hidden] { display: none !important; } — asoslangan istisno edi. Qoidani bitta joyda o'chirish mumkin — buni «--fix va istisnolar» bo'limida ko'ramiz.
4.3 BEM nom namunasi
Standart to'plam class nomlarini kebab-case da talab qiladi — «Bahor» va portfolio nomlari (taom-karta, bron-havola) shunga mos. BEM ishlatadigan jamoa (CSS metodologiyalari) esa blok__element--modifikator ga ruxsat berishi kerak. Qoidaga o'z namunasini beramiz. Namuna — muntazam ifoda (regular expression): matn shaklini tasvirlaydigan maxsus yozuv. Uni o'qishni RegExp asoslari darsida o'rganamiz — hozir tayyorini ishlating:
{
"extends": ["stylelint-config-standard"],
"rules": {
"selector-class-pattern": [
"^[a-z0-9-]+(__[a-z0-9-]+)?(--[a-z0-9-]+)?$",
{ "message": "BEM nomi kutilgan: blok__element--modifikator" }
]
}
}Namunani so'zlar bilan o'qisak: "kichik harf, raqam va chiziqcha; keyin ixtiyoriy __element; keyin ixtiyoriy --modifikator". message — xato matnini o'zimiz yozamiz, o'zbekcha. Sinov uchun uchta class (namoyish nomlari, «Bahor»ga ko'chmaydi): .taom-karta__nomi--katta va .taom-karta--yangi o'tadi, .taomKarta esa:
m6/bem.css
9:1 ✖ BEM nomi kutilgan: blok__element--modifikator selector-class-pattern
✖ 1 problem (1 error, 0 warnings)4.4 Jismoniy xususiyatlar
Mantiqiy xususiyatlar darsida portfolio margin-left kabi jismoniy xususiyatlardan margin-inline-start kabi mantiqiylarga o'tgan edi va "Stylelint uchun bunday qoidalar bor" degan edik. Stylelint'ning o'zida ikki universal qoida bor — "shu xususiyatlar taqiqlangan" va "shu xususiyatning shu qiymatlari taqiqlangan":
{
"rules": {
"property-disallowed-list": [
"/^(margin|padding|border)-(top|right|bottom|left)/",
"/^(top|right|bottom|left)$/"
],
"declaration-property-value-disallowed-list": {
"text-align": ["left", "right"],
"float": ["left", "right"]
}
}
}/.../ ichidagi yozuv — yana muntazam ifoda: birinchisi "margin-, padding- yoki border- dan keyin tomon nomi", ikkinchisi — "aynan top, right, bottom yoki left". Endi margin-left: 1rem yozilsa, Stylelint uni to'xtatadi, margin-inline-start esa o'tadi. width va height ga tegmadik — ularning mantiqiy juftlari bor, lekin jismoniy o'lcham ko'p holatda to'g'ri tanlov.
4.5 Xususiyatlar tartibi — plagin
Deklaratsiyalar qaysi tartibda yozilishi haqida bahs ko'p. Stylelint'ning o'zida bunday qoida yo'q — uni plagin qo'shadi:
npm install --save-dev stylelint-order{
"extends": ["stylelint-config-standard"],
"plugins": ["stylelint-order"],
"rules": {
"order/properties-alphabetical-order": true
}
}plugins — qo'shimcha qoidalar manbai, qoida nomi plagin nomi bilan boshlanadi (order/). stylelint-order 8.1.1 bilan tekshirdik — fayl:
.narx {
font-weight: bold;
color: #b4461a;
}m7/a.css
3:3 ✖ Expected color to come before font-weight order/properties-alphabetical-order
✖ 1 problem (1 error, 0 warnings)
1 error potentially fixable with the "--fix" option.Tarjimasi: "color font-weight dan oldin kelishi kutilgan." Bu qoida --fix bilan o'zi tartiblaydi — color tepaga chiqdi. Alifbo tartibi — eng oddiy variant. Boshqa jamoalar "joylashuv → o'lcham → matn → rang" guruhlarini tanlaydi (order/properties-order). Qaysi biri — muhim emas, bir xillik muhim. «Bahor» va portfolio'da bu qoidani yoqmaymiz: mavjud fayllarning har bir qoidasini qayta tartiblash foydadan ko'ra ko'proq shovqin beradi.
4.6 SCSS uchun
Sass/SCSS 1 darsidagi fayllar uchun alohida to'plam bor: stylelint-config-standard-scss (17.0.0). U $o'zgaruvchi, @use va // izohni tushunadi va SCSS'ga xos qoidalar qo'shadi:
{
"extends": ["stylelint-config-standard-scss"]
}Sinov fayli:
@use "ranglar";
// Taom kartasi
$karta_padding: 1rem;
@mixin kartaSoyasi {
box-shadow: 0 1px 2px #0002;
}
.taom-karta {
padding: $karta_padding;
border: 2px solid ranglar.$asosiy;
@include kartaSoyasi;
}scss/_karta.scss
4:1 ✖ Expected variable name "karta_padding" to be kebab-case scss/dollar-variable-pattern
6:8 ✖ Expected mixin name "kartaSoyasi" to be kebab-case scss/at-mixin-pattern// izoh xato bo'lmadi — SCSS'da u to'g'ri. O'zgaruvchi va mixin nomlari esa class nomlaridek kebab-case bo'lishi kutiladi: $karta-padding, karta-soyasi.
5. --fix va istisnolar
5.1 --fix: avtomatik tuzatish
Ba'zi qoidalar xatoni o'zi tuzata oladi — xabar oxiridagi "potentially fixable" qatori shu haqda:
npx stylelint "assets/css/**/*.css" --fixStylelint tuzata olganini faylga yozadi va qolganini ko'rsatadi. Qulay — lekin ko'r-ko'rona ishlatmang. Keyinroq, portfolio qadamida, --fix iOS uchun kerakli qatorni buzib qo'yganini ko'rasiz.
Qoida: avval xabarlarni o'qing, qaror qabul qiling, keyin --fix. Va --fix dan keyin natijani ko'zdan kechiring.
5.2 Istisno: qoidani bir joyda o'chirish
Qoida umuman to'g'ri, lekin bitta joyda ataylab buziladi — shunda o'sha qatorning ustiga maxsus izoh:
button {
/* stylelint-disable-next-line property-no-vendor-prefix */
-webkit-user-select: none;
user-select: none;
}stylelint-disable-next-line— "keyingi qatorda o'chir".- Undan keyin — qaysi qoida. Qoida nomini yozmasangiz, hamma qoida o'chadi — bu xavfli.
Sababini ham yozing: -- dan keyin, masalan ... property-no-vendor-prefix -- Safari */. Olti oydan keyin kodni o'qigan odam (siz ham) nega shunday qilinganini biladi. Sabab bilan izoh uzun bo'lsa, ikkinchi shakl qulay — oraliq: stylelint-disable qoidani o'chiradi, stylelint-enable qayta yoqadi.
/* stylelint-disable declaration-no-important -- hidden himoyasi */
[hidden]:not([hidden="until-found"]) {
display: none !important;
}
/* stylelint-enable declaration-no-important */Ikkala faylni Stylelint va Prettier bilan tekshirdik — 0 xato. enable ni unutmang: usiz qoida fayl oxirigacha o'chiq qoladi.
Ro'yxatlar stili darsidagi html-validate izohini eslang — html-validate-disable-next no-redundant-role -- Safari. G'oya bir xil: istisno — bitta joyda, nomi va sababi bilan.
Tekshirib ko'ring: Hamkasbingiz faylning boshiga
/* stylelint-disable */yozdi va "endi xato yo'q" dedi. Nima deysiz?
Javob
Bu izoh butun fayl uchun hamma qoidani o'chiradi. Xatolar yo'qolmadi — ular endi ko'rinmaydi. Ertaga shu faylda colr yoki #2f6b3 yozilsa, hech kim bilmaydi. To'g'ri yo'l: har xatoni tuzatish, faqat asoslangan joyda — qoida nomi va sababi bilan, faqat kerakli qator yoki oraliqda.
6. Prettier va Stylelint birga
6.1 To'qnashuv bormi?
Ilgari Stylelint'da chekinish, bo'sh joy va qavslar joyi haqida ham qoidalar bor edi — ular Prettier bilan "janjallashardi": biri tekislagan joyni ikkinchisi xato derdi. Buni o'chirish uchun maxsus stylelint-config-prettier to'plami ishlatilardi.
Stylelint 16-versiyada bu formatlash qoidalari olib tashlangan — ular Prettier'ning ishi. Shuning uchun bugun ikkalasi ziddiyatsiz ishlaydi, qo'shimcha to'plam kerak emas. Standart to'plamda faqat bir nechta "bo'sh qator" qoidalari qolgan (comment-empty-line-before kabi) — Prettier mavjud bo'sh qatorlarni saqlaydi, shuning uchun ular ham to'qnashmaydi. Tekshirdik: stylelint --fix dan keyin prettier --check "All matched files use Prettier code style!" dedi.
Tartib: avval stylelint --fix, keyin prettier --write. Prettier oxirgi so'zni aytadi — fayl ko'rinishi har doim bir xil bo'ladi.
flowchart LR
A["CSS yozasiz"] --> B["VS Code:<br/>Stylelint chizig'i"]
B --> C["npm run format<br/>Prettier"]
C --> D["npm run check"]
D --> E{"Xato bormi?"}
E -->|Ha| A
E -->|Yo'q| F["Deploy"]Nimaga qarang: xato uch joyda ushlanadi — yozayotganda (VS Code), tekshiruvda (npm run check) va keyinroq, Git'ni o'rgangach, commit oldidan.
6.2 VS Code'da
VS Code kengaytmalar do'konida Stylelint (nashriyotchi: Stylelint, ID stylelint.vscode-stylelint) kengaytmasini o'rnating. U loyihadagi .stylelintrc.json ni o'qiydi va xatolarni yozayotgan paytingizdayoq to'lqinli chiziq bilan ko'rsatadi. VS Code sozlamalari (.vscode/settings.json, VS Code sozlamalari darsida ko'rgansiz):
{
"stylelint.validate": ["css", "scss"],
"css.validate": false,
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": "explicit"
}
}stylelint.validate— qaysi fayllarni tekshirsin.css.validate: false— VS Code'ning o'z CSS tekshiruvini o'chiradi, aks holda bitta xato ikki marta ko'rinadi.codeActionsOnSave— saqlaganda tuzatiladigan xatolarni tuzatadi. Yuqoridagi--fixogohlantirishini unutmang.
6.3 Commit oldidan: lint-staged
Katta jamoalarda tekshiruv kod saqlanishidan oldin avtomatik ishlaydi. lint-staged — faqat o'zgargan fayllarni tekshiradigan vosita. U Git bilan ishlaydi. Git — fayllar tarixini saqlaydigan dastur, commit esa shu tarixdagi bitta "saqlash nuqtasi" — o'yindagi saqlanish kabi. Git'ni 07-qismda o'rganasiz, commit oldidan tekshiruvni avtomatik ishga tushirishni esa Husky va lint-staged darsida — hozir bilish shart emas. Hozir faqat sozlamaning ko'rinishini tanib qo'ying — package.json da:
{
"lint-staged": {
"*.css": ["stylelint --fix", "prettier --write"]
}
}"O'zgargan har .css faylga avval Stylelint tuzatishi, keyin Prettier." Sinov repozitoriysida tekshirdik (lint-staged 16.4.0): .narx { color: #B4461A; font-weight:bold } kabi tartibsiz fayl ikki qadamdan keyin toza shaklga keldi.
7. Ko'p uchraydigan xatolar
7.1 Qo'shtirnoqsiz glob
npx stylelint g/**/*.css — qo'shtirnoqsiz. Git Bash namunani Stylelint'ga berishdan oldin o'zi ochadi, lekin ** ni oddiy * deb tushunadi — faqat bir pog'ona ichkaridagi fayllarni oladi. Tekshirdik: g/x.css, g/a/y.css va g/a/b/z.css dan faqat g/a/y.css tekshirildi, qolgan ikkitasi — jim o'tkazib yuborildi. Tuzatish: namunani qo'shtirnoqqa oling — "g/**/*.css". Shunda uni Stylelint o'zi ochadi va uchala faylni topadi.
Namuna umuman hech narsaga mos kelmasa, Stylelint aniq xabar beradi:
NoFilesFoundError: No files matching the pattern "yoq/**/*.css" were found.Tarjimasi: "Namunaga mos fayl topilmadi." Papka nomini tekshiring.
7.2 To'plam o'rnatilmagan
.stylelintrc.json da extends bor, lekin to'plam o'rnatilmagan (yoki nomida xato). Stylelint to'xtaydi — masalan, nomi noto'g'ri yozilgan to'plam uchun:
ConfigurationError: Could not find "stylelint-config-yoq". Do you need to install the package or use the "configBasedir" option?Tarjimasi: "stylelint-config-yoq topilmadi. Paketni o'rnatish kerakmi yoki configBasedir sozlamasini ishlatish kerakmi?" Xabar ostidagi at ... qatorlari — Stylelint'ning ichki yo'li, ularni o'qish shart emas. Tuzatish: npm install --save-dev stylelint-config-standard va nomni tekshiring.
7.3 Qoida — buyruq emas, savol
no-descending-specificity o'nlab xabar berdi va dasturchi ularni "tuzatish" uchun qoidalar tartibini aralashtirib yubordi — kaskad o'zgardi, sahifa buzildi. Tuzatish: har xabarni o'qing. Qoida sizning loyihangizga mos kelmasa, uni sozlamada o'chirish ham to'g'ri qaror. Asosiysi — qaror ongli bo'lsin.
7.4 --fix kerakli narsani o'chirdi
Prefiksli xususiyat, eski brauzer uchun zaxira — --fix ularni "ortiqcha" deb hisoblashi mumkin. Tuzatish: avval o'qing, istisnolarni stylelint-disable-next-line bilan belgilang, keyin --fix. Portfolio qadamida aynan shu holat bor.
8. Mashqlar
Mashqlar kurs/mashqlar/06/stylelint/ da: npm init -y, npm install --save-dev stylelint stylelint-config-standard va .stylelintrc.json.
1-mashq (oson): xabarlarni o'qing
.bron-havola {
background-color: #2f6b3a;
color: #fffaf0;
colour: #fffaf0;
padding: 8px 16px;
padding: 8px 16px;
}Stylelint'ni ishga tushiring. Nechta xato chiqadi? Har birining qoida nomini yozing va tuzating.
Ishora: colour — britancha yozilish (CSS nima darsidagi 3-mashqni eslang).
Yechim
Ikkita xato — tekshirdik (fayl m1/a.css da edi):
m1/a.css
4:3 ✖ Unknown property "colour" property-no-unknown
5:3 ✖ Duplicate property "padding" declaration-block-no-duplicate-properties
✖ 2 problems (2 errors, 0 warnings)
1 error potentially fixable with the "--fix" option.Takror haqidagi xabar birinchi padding qatoriga (5) qo'yilgan: "pastda uning nusxasi bor" degani. Tuzatilgani — colour va takror padding qatorlari o'chirildi:
.bron-havola {
background-color: #2f6b3a;
color: #fffaf0;
padding: 8px 16px;
}Brauzer ikkala xatoda ham jim qolardi: colour ni tashlab, padding ning ikkinchisini qo'llardi. Sahifa to'g'ri ko'rinardi — lekin fayl chalkash qolardi.
2-mashq (o'rta): jamoa qoidalari
«Bahor» jamoasi qaror qildi: !important taqiqlanadi, jismoniy margin-*/padding-* tomonlari taqiqlanadi. Shu ikki qoidani .stylelintrc.json ga qo'shing va quyidagi faylni tekshiring. So'ng xatolarni tuzating — [hidden] dagi !important bundan mustasno, uni asoslab qoldiring.
[hidden] {
display: none !important;
}
.aksiya {
margin-left: 1rem;
padding-top: 0.5rem;
color: #b4461a !important;
}Ishora: qoida nomlari — declaration-no-important va property-disallowed-list ("Jismoniy xususiyatlar" bo'limi). Mantiqiy juftlar: margin-inline-start, padding-block-start.
Yechim
.stylelintrc.json:
{
"extends": ["stylelint-config-standard"],
"rules": {
"declaration-no-important": true,
"property-disallowed-list": [
"/^(margin|padding|border)-(top|right|bottom|left)/",
"/^(top|right|bottom|left)$/"
]
}
}Birinchi tekshiruv to'rtta xato beradi: ikkita !important va ikkita jismoniy xususiyat. Tuzatilgan fayl:
/* stylelint-disable declaration-no-important -- hidden himoyasi */
[hidden] {
display: none !important;
}
/* stylelint-enable declaration-no-important */
.aksiya {
margin-inline-start: 1rem;
padding-block-start: 0.5rem;
color: #b4461a;
}Endi 0 xato — tekshirdik. .aksiya dagi !important shunchaki olib tashlandi: aksiya rangini boshqa qoida bosib o'tayotgan bo'lsa, sababini Kaskad va Specificity bilan toping, "bolg'a" bilan emas.
3-mashq (qiyin): --fix nimani qiladi?
Quyidagi fayl uchun avval --fix nimani o'zgartirishini va nimani qoldirishini yozib chiqing, keyin ishga tushirib, taxminingizni tekshiring (standart to'plam bilan):
:root {
--rang-asosiy: oklch(48.4% 0.097 158.9);
}
h1 {
font-family: "Bahor", serif;
text-decoration: underline currentColor;
}
button {
-webkit-user-select: none;
user-select: none;
}Ishora: portfolio xabarlaridagi qoidalar — hue-degree-notation, font-family-name-quotes, value-keyword-case, property-no-vendor-prefix.
Yechim
--fix dan keyin (tekshirdik):
:root {
--rang-asosiy: oklch(48.4% 0.097 158.9deg);
}
h1 {
font-family: Bahor, serif;
text-decoration: underline currentcolor;
}
button {
user-select: none;
user-select: none;
}158.9→158.9deg: rang tonini aniq birlik bilan yozish (ikkalasi ham to'g'ri CSS)."Bahor"→Bahor: bir so'zli shrift nomiga qo'shtirnoq kerak emas.currentColor→currentcolor: kalit so'zlar kichik harfda.- Xavfli joy:
-webkit-user-select—user-selectga aylandi, endi bir xil qator ikki marta. Safari display va yashirish darsidagi zaxirasini yo'qotdi — tugma matni belgilanadigan bo'lib qoldi. Oldindanstylelint-disable-next-line property-no-vendor-prefix -- Safariyozilishi kerak edi. Yoki prefiksni qo'lda yozmasdan, Autoprefixer'ga topshirish (PostCSS va Autoprefixer).
4-mashq: Portfolio qadami — npm run check ga Stylelint
Yakuniy loyiha: portfolio darsidan beri portfolio'ning npm run check i Prettier va html-validate'ni ishlatadi. Unga uchinchi tekshiruvchi — Stylelint qo'shiladi.
- O'rnating:
npm install --save-dev stylelint stylelint-config-standard. .stylelintrc.json— standart to'plam, ustidan to'rtta qaror:!importanttaqiqlansin, jismoniy tomonlar taqiqlansin (property-disallowed-listvatext-align/floatuchundeclaration-property-value-disallowed-list),no-descending-specificityo'chirilsin.package.jsongalint:cssskripti vacheckga uning chaqiruvi.npm run lint:cssni ishga tushiring.--fixdan oldin har xabarni o'qing va uch guruhga ajrating: yozuv shakli (--fixga), asoslangan istisno (izoh bilan), qo'lda tuzatiladigan.- Istisnolarni izoh bilan belgilang (sababi bilan — oraliq shaklida), keyin
npx stylelint "sayt/**/*.css" --fix, so'ngnpm run formatvanpm run check— 0 xato.
Ishora: CSS metodologiyalari darsidan keyin CSS yettita faylda — namuna "sayt/**/*.css" hammasini oladi. Dizayn tokenlari darsidagi --step--1 nomiga ham e'tibor bering: Stylelint unga nima deydi va nomni o'zgartirish kerakmi?
Yechim
.stylelintrc.json (to'rtta qaror):
{
"extends": ["stylelint-config-standard"],
"rules": {
"declaration-no-important": true,
"no-descending-specificity": null,
"property-disallowed-list": [
"/^(margin|padding|border)-(top|right|bottom|left)/",
"/^(top|right|bottom|left)$/"
],
"declaration-property-value-disallowed-list": {
"text-align": ["left", "right"],
"float": ["left", "right"]
}
}
}package.json skriptlariga bitta yangi qator:
{
"scripts": {
"lint:css": "stylelint \"sayt/**/*.css\""
}
}check skriptining oxiriga esa && npm run lint:css qo'shiladi — to'liq ko'rinishi pastdagi natijada bor.
Birinchi ishga tushirish. Namunaviy yechim — Dizayn tokenlari va Qorong'i rejim darslaridan keyingi yetti fayl, qatlamlari bilan. Faqat standart to'plam bilan u 39 ta xato berdi. Ulardan to'rttasi no-descending-specificity edi, masalan:
sayt/assets/css/komponentlar.css
254:1 ✖ Expected selector ".loyihalar ul" to come before selector "nav[aria-label="Asosiy menyu"] ul", at line 53 no-descending-specificity.loyihalar ul (0,1,1) va nav[aria-label="Asosiy menyu"] ul (0,1,2) — butunlay boshqa elementlarni tanlaydi: biri kartadagi ro'yxat, ikkinchisi menyu. Qoida ular "o'zaro raqobatlashadi" deb gumon qildi, lekin ikkalasiga mos element yo'q. Komponentlar tartibi (menyu, keyin kartalar) mantiqli, uni og'irlik uchun buzmaymiz. Bu qoida ko'p jamoalarda aynan shu sabab bilan o'chiriladi.
To'rtta qarordan keyin — 37 ta xato: to'rttasi ketdi, ikkita yangi !important qo'shildi. Ulardan 17 tasi bir turdagi — hue-degree-notation, rang tonidagi deg (tushirib qoldirdik). Qolganlari:
sayt/assets/css/asos.css
32:21 ✖ Disallowed !important declaration-no-important
sayt/assets/css/komponentlar.css
91:18 ✖ Expected custom property name "--step--1" to be kebab-case custom-property-pattern
127:3 ✖ Expected empty line before declaration declaration-empty-line-before
203:1 ✖ Expected empty line before rule rule-empty-line-before
206:1 ✖ Expected empty line before rule rule-empty-line-before
272:3 ✖ Expected empty line before declaration declaration-empty-line-before
334:18 ✖ Expected custom property name "--step--1" to be kebab-case custom-property-pattern
459:18 ✖ Expected custom property name "--step--1" to be kebab-case custom-property-pattern
487:1 ✖ Duplicate selector "[popover], dialog", first used at line 471 no-duplicate-selectors
sayt/assets/css/layout.css
36:33 ✖ Expected "currentColor" to be "currentcolor" value-keyword-case
45:18 ✖ Expected custom property name "--step--1" to be kebab-case custom-property-pattern
sayt/assets/css/reset.css
12:17 ✖ Disallowed !important declaration-no-important
17:3 ✖ Vendor-prefixed property "-webkit-text-size-adjust" property-no-vendor-prefix
sayt/assets/css/tokenlar.css
6:3 ✖ Expected empty line before custom property custom-property-empty-line-before
26:55 ✖ Expected "Menlo" to be "menlo" value-keyword-case
26:62 ✖ Expected "Consolas" to be "consolas" value-keyword-case
30:3 ✖ Expected custom property name "--step--1" to be kebab-case custom-property-pattern
57:5 ✖ Expected empty line before custom property custom-property-empty-line-before
91:16 ✖ Expected no quotes around "Sarlavha" font-family-name-quotes
sayt/assets/css/yordamchi.css
44:9 ✖ Expected "A4" to be "a4" value-keyword-case
✖ 37 problems (37 errors, 0 warnings)
29 errors potentially fixable with the "--fix" option.Keling, uch guruhga ajratamiz.
1-guruh: yozuv shakli — --fix ga. hue-degree-notation, font-family-name-quotes, value-keyword-case va bo'sh qator qoidalari. Ma'no o'zgarmaydi: 158.9 va 158.9deg, A4 va a4, Menlo va menlo — brauzer uchun bir xil (shrift nomlarida katta-kichik harf farq qilmaydi).
2-guruh: asoslangan istisno — izoh bilan.
-webkit-text-size-adjust(reset.css).text-size-adjustBaseline emas: iOS Safari uni faqat-webkit-bilan tushunadi. Prefiksni Mobil qurilma tuzoqlari darsida shu sabab bilan qo'shgan edik, PostCSS va Autoprefixer darsidagi audit ham u kerakligini tasdiqladi. Lekin--fixuni oddiytext-size-adjustga aylantirib yuboradi. Tekshirdik: izohsiz fixdan keyinhtmlqoidasida ikkita bir xiltext-size-adjust: 100%;qatori qoldi, iOS zaxirasi yo'qoldi.!important(reset.css) —[hidden]himoyasi (display va yashirish).!important(asos.css) — View Transitions darsidagi harakat taqiqi:prefers-reduced-motion: reduceda o'tish animatsiyasi hech qanday holatda o'ynamasin. (View Transitions — yangi Baseline, 2025-yil oktabr: eski brauzer bu qoidani shunchaki tashlab ketadi.)
3-guruh: qo'lda tuzatiladi yoki qoida sozlanadi.
custom-property-pattern— beshta xabar, hammasi bitta nom:--step--1. Kebab-case'da qo'sh chiziqcha yo'q, lekin bu nom Dizayn tokenlari darsida ataylab tanlangan: "--step-0dan bir pog'ona past". Tokenlar landing'da ham ishlatiladi — nomni o'zgartirmaymiz, qoidani sozlaymiz. Bu beshinchi qaror.no-duplicate-selectors—[popover], dialogikki marta. Top layer darsida uni ikki qoidaga bo'lib yozgan edik: biri ko'rinish, biri shaffoflik. Brauzer uchun xato emas, lekin o'quvchi birinchisini ko'rib, ikkinchisini topmay qolishi mumkin. Birlashtiramiz.
Beshinchi qaror — .stylelintrc.json ning rules bo'limiga:
"custom-property-pattern": [
"^_?([a-z][a-z0-9]*)(--?[a-z0-9]+)*$",
{ "message": "Nom: kichik harf, raqam, chiziqcha" }
]So'z bilan: "boshida ixtiyoriy pastki chiziq, keyin kichik harf; bo'laklar orasida bitta yoki ikkita chiziqcha". Kebab-case'ning o'zi, faqat qo'sh chiziqchaga ham ruxsat. _? — komponent ichidagi o'zgaruvchilar uchun (--_fon, --_matn, CSS o'zgaruvchilari 2): portfolio'da ular hozircha yo'q, lekin «Bahor» komponentlarida ko'p. Shu sozlama keyin yakuniy loyihaga ham ko'chadi — qoida ularni oldindan tanisin. --rangAsosiy yoki --_Fon kabi nom baribir to'xtatiladi — tekshirdik.
reset.css da ikkala istisno:
/* stylelint-disable declaration-no-important -- hidden himoyasi */
[hidden]:not([hidden="until-found"]) {
display: none !important;
}
/* stylelint-enable declaration-no-important */
/* iPhone shriftni kattalashtirmasin (Mobil tuzoqlar darsi) */
html {
/* stylelint-disable property-no-vendor-prefix -- iOS Safari */
-webkit-text-size-adjust: 100%;
/* stylelint-enable property-no-vendor-prefix */
text-size-adjust: 100%;
}asos.css da, harakat taqiqi blokida:
@media (prefers-reduced-motion: reduce) {
::view-transition-group(*),
::view-transition-old(*),
::view-transition-new(*) {
/* stylelint-disable declaration-no-important -- harakat taqiqi */
animation: none !important;
/* stylelint-enable declaration-no-important */
}
}komponentlar.css da ikkinchi [popover], dialog qoidasidagi to'rt qator birinchisining oxiriga ko'chadi, ikkinchi qoida o'chiriladi:
[popover],
dialog {
/* ... ko'rinish qatorlari o'zgarishsiz ... */
/* Ochilish va yopilish — faqat shaffoflik (harakat emas) */
opacity: 0;
transition:
opacity 0.2s,
display 0.2s allow-discrete,
overlay 0.2s allow-discrete;
}dialog::backdrop qoidasi endi birlashgan qoidadan keyin turadi. Kaskad o'zgarmadi: ikkala qoida bir xil og'irlikda edi va orasida ularni bosib o'tadigan qoida yo'q edi.
Keyin:
npx stylelint "sayt/**/*.css" --fix
npm run format
npm run checknpm run check natijasi (tekshirdik):
> portfolio@1.0.0 check
> prettier --check sayt && npm run lint && npm run lint:css
Checking formatting...
All matched files use Prettier code style!
> portfolio@1.0.0 lint
> html-validate "sayt/**/*.html"
> portfolio@1.0.0 lint:css
> stylelint "sayt/**/*.css"
Uchala tekshiruv jim — 0 xato. --fix qo'shgan deg ni, olib tashlagan qo'shtirnoqni va kichik harflarni Live Server'da tekshiring: sahifa 360 va 1280 pikselda oldingidek, qorong'i rejimda ham. Endi portfolio'ga qo'shilgan har CSS qatori uch nazoratchidan o'tadi.
Sizning fayllaringiz 06-qismdagi oldingi qadamlardan biroz boshqacha bo'lsa, xatolar soni farq qiladi. Qarorlar tamoyili esa bir xil: shakl — --fix ga, ma'no — o'zingizga.
9. Real ishda
- Deyarli har professional frontend loyihada linter bor: JavaScript uchun ESLint (ESLint I), CSS uchun Stylelint. Yangi loyihaga kelganda
.stylelintrc.*ni o'qish — jamoa qoidalarini bilishning eng tez yo'li. - CI — kod GitHub'ga yuborilganda
npm run checko'zi ishga tushadi va xato bo'lsa, kodni qabul qilmaydi (HTML kod uslubi darsida aytgan edik). Stylelint shu zanjirning bir halqasi. - Katta kompaniyalar o'z to'plamlarini chiqaradi:
stylelint-config-...paketlari. Siz bugun o'z beshta qaroringiz bilan xuddi shunday ish qildingiz. - Intervyuda: "Linter va formatter farqi?", "Nega Prettier bor bo'lsa ham Stylelint kerak?", "Qoidani qachon o'chirish mumkin?"
Xulosa
- Prettier — ko'rinish (formatter), Stylelint — ma'no va jamoa qoidalari (linter). Brauzer jim tashlaydigan xatolarni Stylelint ko'rsatadi.
- O'rnatish:
stylelint+stylelint-config-standard, sozlama —.stylelintrc.json, ishga tushirish —npx stylelint "**/*.css". rules:true— yoqish,null— o'chirish, massiv — sozlash; plaginlar (stylelint-order) va SCSS to'plami qo'shimcha qoidalar beradi.--fixdan oldin xabarlarni o'qing; istisno —stylelint-disable-next-lineyokidisable/enableoralig'i, qoida nomi va sababi bilan.- Stylelint 16 dan beri formatlash qoidalari yo'q — Prettier bilan to'qnashuv yo'q; tartib:
stylelint --fix, keyinprettier.
Keyingi dars: CSS Modules: komponentga lokal class'lar — class nomlarini avtomatik noyob qilib, komponent stillarini bir-biridan ajratish.
Manbalar
- Stylelint: "Getting started", "Rules", "Configuration", "Ignoring code" — stylelint.io
- stylelint-config-standard — github.com/stylelint/stylelint-config-standard
- stylelint-order — github.com/hudochenkov/stylelint-order
- Stylelint 16 migratsiya qo'llanmasi (formatlash qoidalari olib tashlangani) — stylelint.io/migration-guide/to-16
- Prettier: "Prettier vs. Linters" — prettier.io/docs/comparison
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!