15.3-bob: ESLint, Prettier, Husky va lint-staged
15-QISM — Kasbiy ko'nikmalar · 3-mavzu
1. Kirish va motivatsiya
15.1 va 15.2-boblarda toza kod va code review'ni o'rgandik. Lekin ikki savol qoldi: (1) kod uslubini (format, qoidalar) qo'lda izchil tutib bo'lmaydi (har dasturchi boshqacha yozadi — bo'shliq, qator, tirnoq — chalkash); (2) code review'da odam format/uslubga vaqt sarflamasligi kerak (15.2: 2.7 — mashina qiladi). Yechim — avtomatlashtirish: bu bobda kod sifatini avtomatik, izchil qiladigan to'rt vositani ko'ramiz: ESLint (kod sifati/xatolar — statik tahlil), Prettier (avtomatik format), Husky (git hooks — commit'dan oldin tekshiruv), lint-staged (faqat o'zgargan fayllar — tez).
Bu vositalar professional standart (deyarli har zamonaviy JS/TS loyihada). Ular nima beradi: (1) izchil format (Prettier — har fayl bir xil — bo'shliq/qator munozarasi yo'q); (2) xato/yomon naqsh oldini (ESLint — == o'rniga ===, ishlatilmagan o'zgaruvchi, xavfli kod — kod yozish paytida ogohlantiradi); (3) avtomatik tekshiruv (Husky — har commit'dan oldin lint/format — buzuq kod git'ga ketmaydi); (4) tezlik (lint-staged — faqat o'zgargan fayllarni tekshir — butun loyiha emas). Natijada: kod sifati avtomatik (qo'lda emas), izchil (har dasturchi bir xil), va review format munozarasidan ozod (odam mantiqqa — 15.2). Bu bob ularni sozlash va ishlatishni ko'rsatadi.
Bu bob to'rt vositani to'liq ochadi: nega avtomatlashtirish, ESLint (kod sifati — qoidalar, flat config, plaginlar, sozlash), Prettier (format — sozlash, .prettierignore, ESLint bilan integratsiya), TypeScript type-check (tsc --noEmit), Husky (git hooks — pre-commit/pre-push/commit-msg), lint-staged (faqat o'zgargan fayllar), commitlint (conventional commits), CI'da (PR'da lint/format/type/test), editor integratsiyasi (VS Code), jamoa uchun umumiy konfiguratsiya (shared config paket), performans (kesh) va qachon qaysi qoida (Airbnb/Standard/o'z).
O'xshatish: Bu vositalar — bu imlo tekshiruvchi va avtomatik formatlovchi (matn muharririda). Yozayotganingizda imlo tekshiruvchi (ESLint) xato so'zni qizil chizadi ("bu noto'g'ri — tuzat"), avtomatik formatlovchi (Prettier) matnni bir xil ko'rinishga keltiradi (sarlavhalar, abzaslar — izchil). Husky — bu "chop etishdan oldin tekshir" qoidasi (hujjatni saqlashdan oldin imlo/format avtomatik tekshiriladi — xato bilan saqlanmaydi). lint-staged — faqat o'zgartirgan abzaslarni tekshir (butun kitobni emas — tez). Bularsiz — har yozuvchi boshqacha formatda yozadi (chalkash), imlo xatolar o'tib ketadi; bular bilan — hamma matn izchil, toza, xatosiz (avtomatik — yozuvchi o'ylamaydi). Kod ham shunday: bu vositalar kod uslubini avtomatik izchil va toza qiladi (dasturchi format haqida o'ylamaydi — vositalar qiladi).
Nega muhim?
- Izchillik — Prettier har faylni bir xil (bo'shliq/qator munozarasi yo'q — vaqt tejash).
- Xato oldini — ESLint xato/yomon naqshni yozish paytida topadi (production'dan oldin).
- Avtomatik — Husky har commit'da tekshir (qo'lda emas — unutilmaydi).
- Review tejash — format avtomatik odam mantiqqa (15.2: 2.7).
2. Nazariya — chuqur tushuntirish
2.1. Nega avtomatlashtirish (vositalar roli)
TO'RT VOSITA — har biri o'z vazifasi (birga — kod sifati avtomatik):
┌──────────────┬────────────────────────────────────────────┐
│ ESLint │ Kod SIFATI/XATO (statik tahlil — qoidalar) │
│ │ ==/===, ishlatilmagan, xavfli, naqsh │
├──────────────┼────────────────────────────────────────────┤
│ Prettier │ Kod FORMAT (avtomatik — bo'shliq/qator) │
│ │ izchil ko'rinish (uslub munozarasiz) │
├──────────────┼────────────────────────────────────────────┤
│ Husky │ GIT HOOKS (commit/push'dan oldin tekshir) │
│ │ buzuq kod git'ga ketmaydi │
├──────────────┼────────────────────────────────────────────┤
│ lint-staged │ Faqat O'ZGARGAN fayllar (tez) │
│ │ butun loyiha emas — staged fayllar │
└──────────────┴────────────────────────────────────────────┘
ESLint vs Prettier (chalkashtirma):
ESLint — KOD MANTIQ/SIFAT (xato, yomon naqsh — "=== ishlat")
Prettier — FORMAT (ko'rinish — "4 bo'shliq, qator uzunligi")
ESLint (sifat/xato) + Prettier (format) + Husky (git hook) + lint-staged (tez)
Birga — kod sifati AVTOMATIK, izchil (qo'lda emas — vositalar qiladi)Nega avtomatlashtirish (vositalar roli) — to'rt vosita va ularning vazifalari. Kod sifatini avtomatik, izchil qilish uchun to'rt vosita (har biri o'z vazifasi): (1) ESLint — kod sifati/xato (statik tahlil — kodni ishga tushirmasdan tekshiradi — qoidalar bo'yicha:
==o'rniga===ishlat, ishlatilmagan o'zgaruvchi, xavfli kod, yomon naqsh); (2) Prettier — kod format (avtomatik — bo'shliq, qator uzunligi, tirnoq, vergul — izchil ko'rinish — uslub munozarasiz); (3) Husky — git hooks (git hodisalarida — commit/push'dan oldin — avtomatik tekshiruv ishga tushadi — buzuq kod git'ga ketmaydi); (4) lint-staged — faqat o'zgargan (staged) fayllarni tekshir (butun loyiha emas — tez — faqat commit qilinayotgan fayllar). ESLint vs Prettier (ko'p chalkashtiriladi): ESLint — kod mantiq/sifat (xato, yomon naqsh — "===ishlat", "bu o'zgaruvchi ishlatilmaydi"); Prettier — format (faqat ko'rinish — "4 bo'shliq, qator uzunligi 80" — mantiqga aralashmaydi). Ya'ni ESLint nima yomon (sifat), Prettier qanday ko'rinadi (format). Ikki nuqta: (1) ESLint (sifat/xato) + Prettier (format) + Husky (git hook) + lint-staged (tez) — har biri o'z vazifasi; (2) birga — kod sifati avtomatik, izchil (qo'lda emas — vositalar qiladi — dasturchi format/uslub haqida o'ylamaydi). Bu to'rt vosita — zamonaviy JS/TS loyiha standarti (deyarli har loyihada —create-next-appham ESLint bilan keladi). Ularni tushunish va sozlash — professional dasturchining asosiy ko'nikmasi (kod sifatini avtomatlashtirish — qo'lda izchillikni tutib bo'lmaydi — vositalar kerak). Bu — 15.2: 2.7 (review avtomatlashtirish)ning amaliy qismi.
2.2. ESLint (kod sifati)
ESLint — kodni STATIK tahlil qilib, XATO/yomon naqshni topadi:
NIMA TOPADI:
Potensial xato (ishlatilmagan o'zgaruvchi, yetib bo'lmaydigan kod)
Yomon naqsh (== o'rniga ===, var o'rniga let/const)
Xavfsizlik (eval, dangerouslySetInnerHTML — 14.2)
Loyiha qoidalari (maxsus — masalan console.log taqiq)
SOZLASH (eslint.config.js — flat config — yangi):
import js from "@eslint/js";
import tseslint from "typescript-eslint";
export default [
js.configs.recommended, // standart qoidalar
...tseslint.configs.recommended, // TypeScript qoidalari
{
rules: {
"no-console": "warn", // console.log — ogohlantirish
"no-unused-vars": "error", // ishlatilmagan — xato
"eqeqeq": "error", // === majburiy
},
},
];
ISHLATISH:
npx eslint . // tekshir
npx eslint . --fix // avtomatik tuzatiladiganni tuzat
ESLint — kod sifati/xato (statik tahlil — ===, ishlatilmagan, xavfli)
Qoidalar sozlanadi (recommended + loyiha); --fix avtomatik tuzatadiESLint (kod sifati) — kodni statik tahlil qilib xato/yomon naqshni topish. ESLint — kodni statik (ishga tushirmasdan) tahlil qilib, muammolarni topadi. Nima topadi: (1) potensial xato (ishlatilmagan o'zgaruvchi —
const x = 5lekinxhech qaerda ishlatilmaydi — ehtimol unutilgan; yetib bo'lmaydigan kod —returndan keyin kod); (2) yomon naqsh (==o'rniga===— 2-QISM — tip xavfi;varo'rnigalet/const); (3) xavfsizlik (eval,dangerouslySetInnerHTML— 14.2 — ogohlantiradi); (4) loyiha qoidalari (maxsus — masalanconsole.logtaqiq — production'da qolmasin). Sozlash (eslint.config.js— flat config — yangi format):js.configs.recommended(standart qoidalar — eng keng) +tseslint.configs.recommended(TypeScript qoidalari — 7-QISM) + maxsusrules(no-console: "warn"— console ogohlantirish,no-unused-vars: "error"— ishlatilmagan xato,eqeqeq: "error"—===majburiy). Qoidalar darajalari:"off"(o'chiq),"warn"(ogohlantirish — sariq),"error"(xato — qizil — CI'ni yiqitadi). Ishlatish:npx eslint .(loyiha tekshir),npx eslint . --fix(avtomatik tuzatiladiganlarni tuzat — masalan===). Ikki nuqta: (1) ESLint — kod sifati/xato (statik tahlil —===, ishlatilmagan, xavfli kod, yomon naqsh); (2) qoidalar sozlanadi (recommended+ loyiha maxsus),--fixavtomatik tuzatadi. ESLint — kod sifatining "qorovuli" (yomon naqsh, potensial xatoni yozish paytida — IDE'da qizil chiziq — ogohlantiradi — production'dan oldin). U mantiq/sifat (Prettier — format — 2.3). Editor (VS Code ESLint plugin) — yozayotganda real vaqtda ko'rsatadi (xato darrov ko'rinadi).recommendedqoidalar — yaxshi boshlanish (keng tarqalgan muammolar), keyin loyihaga moslash (maxsus qoidalar). ESLint — har JS/TS loyihaning asosiy sifat vositasi.
2.2.1. Flat config (eslint.config.js) vs eski (.eslintrc)
ESLint sozlashning ikki formati bor va ularni ajratish muhim, chunki eski loyihalarda hali eski format uchraydi:
ESKI FORMAT (.eslintrc.json / .eslintrc.js — ESLint 8 va oldin):
{
"env": { "browser": true, "es2021": true, "node": true },
"parser": "@typescript-eslint/parser",
"parserOptions": { "ecmaVersion": "latest", "sourceType": "module" },
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
"plugins": ["@typescript-eslint", "react", "import"],
"rules": { "eqeqeq": "error" },
"overrides": [ { "files": ["*.test.ts"], "rules": { "no-console": "off" } } ]
}
alohida "env"/"extends"/"plugins"/"parser" maydonlari, "overrides" massivi
YANGI FORMAT (eslint.config.js — flat config — ESLint 9 default):
export default [
{ ...konfiguratsiya obyektlari massivi... }
]
oddiy JS massiv; "extends" o'rniga import + spread (...);
"env" o'rniga languageOptions.globals; "parser" languageOptions.parser;
"overrides" o'rniga alohida massiv elementi (files bilan filtrlash);
plaginlar import qilinadi (obyekt sifatida), string nomi emasNima farqi bor? Eski format (
.eslintrc.*) — deklarativ maydonlar:env(global o'zgaruvchilar to'plami —browser,node),parser(kodni tahlil qiluvchi — TS uchun@typescript-eslint/parser),parserOptions,extends(tayyor konfiguratsiya ro'yxati — string),plugins(string nomlar),overrides(ma'lum fayllarga boshqa qoidalar). Yangi flat config (eslint.config.js) — bularning barchasi oddiy JS massiviga aylanadi:extendso'rniga siz konfiguratsiyaniimportqilib massivga qo'shasiz (...tseslint.configs.recommended),envo'rnigalanguageOptions.globals,parsero'rnigalanguageOptions.parser,overrideso'rniga faqatfilesmaydoni bo'lgan alohida massiv elementi. Flat config afzalligi: aniqroq (JS — kalkulyatsiya, funksiya ishlatish mumkin), qatlamlanish tushunarli (massiv tartibi — keyingisi oldingisini ustidan yozadi). ESLint 9'dan boshlab flat config — standart; yangi loyihalarda faqat shuni ishlating, eski loyihada.eslintrcuchrasa migratsiya (ESLint migration guide) qiling.
2.2.2. Plaginlar — ekotizim qoidalari
ESLint yadrosida faqat umumiy JS qoidalari bor. Freymvork va texnologiya qoidalari plaginlar orqali keladi. Eng keng ishlatiladiganlar:
KENG PLAGINLAR:
@typescript-eslint TypeScript qoidalari (any, unused, tip xavfsizligi — 7-QISM)
eslint-plugin-react + react-hooks React qoidalari (hook qoidalari,
useEffect bog'liqlik massivi — 11-QISM)
eslint-plugin-jsx-a11y JSX qulaylik (a11y — alt matn, aria — 13-QISM)
eslint-plugin-import import tartibi, mavjud bo'lmagan import, davriy importPlaginlar — ESLint qoidalar to'plamini kengaytiradi (har texnologiyaning o'z qoidalari):
@typescript-eslint— TypeScript qoidalari (no-explicit-any,no-floating-promises— kutilmaganawaityo'qligi, tip xavfsizligi);eslint-plugin-react+eslint-plugin-react-hooks— React qoidalari (eng muhimireact-hooks/rules-of-hooks— hook faqat komponent tepasida — 11-QISM — vareact-hooks/exhaustive-deps—useEffectbog'liqlik massivi to'liqmi);eslint-plugin-jsx-a11y— JSX qulaylik (imgdaalt,buttonda matn — nogironlar uchun — 13-QISM);eslint-plugin-import— import bilan bog'liq (import tartibi, mavjud bo'lmagan modul importi, davriy bog'liqlik). Plagin o'rnatiladi (npm i -D eslint-plugin-react) va konfiguratsiyaga qo'shiladi. Flat config'da plagin import qilinib,pluginsobyektiga va kerakli qoidalarrulesga qo'yiladi (Misol 6 — quyida). Plaginlar tanlovi loyiha stack'iga bog'liq: React loyiha react + react-hooks + jsx-a11y; hamma joyda import + @typescript-eslint.
2.3. Prettier (format)
PRETTIER — kodni AVTOMATIK formatlaydi (izchil ko'rinish — munozarasiz):
NIMA QILADI (faqat KO'RINISH — mantiqqa tegmaydi):
bo'shliq (indent), qator uzunligi, tirnoq (' yoki "), vergul, qavs
"fikrsiz" (opinionated) — bitta to'g'ri usul (munozarani tugatadi)
OLDIN (har xil): KEYIN (Prettier — izchil):
const x={a:1,b:2} const x = { a: 1, b: 2 };
function f( a,b ){return a} function f(a, b) {
return a;
}
SOZLASH (.prettierrc — kam sozlash — default yaxshi):
{ "semi": true, "singleQuote": false, "printWidth": 80, "tabWidth": 2 }
ISHLATISH:
npx prettier --write . // barcha faylni formatla
// editor: "format on save" (saqlaganda avtomatik)
ESLINT + PRETTIER (birga):
ESLint — sifat (mantiq); Prettier — format (ko'rinish)
eslint-config-prettier (ESLint format qoidalarini o'chir — Prettier qiladi)
Prettier — avtomatik format (bo'shliq/qator/tirnoq — izchil, munozarasiz)
ESLint (sifat) + Prettier (format) — alohida vazifa; eslint-config-prettier (mojaroni hal)Prettier (format) — kodni avtomatik formatlash. Prettier — kodni avtomatik formatlaydigan vosita (faqat ko'rinish — mantiqqa tegmaydi). Nima qiladi: bo'shliq (indent — 2 yoki 4), qator uzunligi (uzun qatorni bo'lish), tirnoq (
'yoki"), vergul (trailing comma), qavs joylashuvi — izchil ko'rinish. Prettier "fikrsiz" (opinionated) — bitta "to'g'ri" usul (kam sozlama — munozarani tugatadi — "tab yoki bo'shliq?", "tirnoq qaysi?" — Prettier hal qiladi — jamoa bahslashmaydi). Oldin (har dasturchi har xil —const x={a:1,b:2},function f( a,b ){...}) keyin (Prettier — izchil —const x = { a: 1, b: 2 };, to'g'ri bo'shliq). Sozlash (.prettierrc— kam sozlash — default yaxshi):semi(nuqta-vergul),singleQuote(tirnoq turi),printWidth(qator uzunligi — 80),tabWidth(indent — 2). Ishlatish:npx prettier --write .(barcha faylni formatla), editor "format on save" (saqlaganda avtomatik — eng qulay — yozasiz, saqlaysiz, formatlanadi). ESLint + Prettier (birga ishlatish): ESLint — sifat (mantiq), Prettier — format (ko'rinish) — alohida vazifa; lekin ESLint'da ham format qoidalari bor (eski) — mojaro bo'lmasin uchuneslint-config-prettier(ESLint'ning format qoidalarini o'chiradi — Prettier qiladi — har biri o'z ishini). Ikki nuqta: (1) Prettier — avtomatik format (bo'shliq/qator/tirnoq — izchil, munozarasiz — "fikrsiz" — bitta usul); (2) ESLint (sifat) + Prettier (format) — alohida vazifa;eslint-config-prettier(mojaroni hal — ESLint format qoidalarini o'chir). Prettier — format munozarasini tugatadi (jamoa "tab yoki bo'shliq" bahslashmaydi — Prettier hal qiladi — vaqt tejash, izchillik). "Format on save" — eng qulay (yozasiz, formatlanadi — o'ylamaysiz). Bu 15.2: 2.7 (review — format avtomatik)ning asosi (Prettier — format izchil — review'da munozara yo'q). Har zamonaviy loyihada Prettier (izchil format — qo'lda emas).
2.3.1. .prettierignore va editor sozlamalari
Prettier hamma faylni formatlamasligi kerak (build natijalari, avtomatik generatsiya qilingan fayllar). Buning uchun .prettierignore fayli — .gitignore bilan bir xil sintaksis:
.prettierignore (formatlanmaydigan fayllar):
node_modules
dist
build
coverage
.next
package-lock.json # avtomatik — qo'l tegmasin
*.min.js # minifikatsiya qilingan — formatlamaslik
.prettierignore— Prettier tegmasligi kerak bo'lgan yo'llar: build chiqishi (dist,build,.next), bog'liqliklar (node_modules), avtomatik fayllar (package-lock.json— qo'lda o'zgartirilmaydi), minifikatsiya qilingan fayllar (*.min.js— allaqachon siqilgan). Sintaksis.gitignorebilan bir xil. Buni qo'ymasa, Prettier keraksiz fayllarni ham qayta formatlaydi (sekin, keraksiz o'zgarishlar). Editor integratsiyasi ("format on save") — eng qulay ishlatish usuli: VS Code'da Prettier kengaytmasi (esbenp.prettier-vscode) o'rnatiladi va sozlamada saqlashda avtomatik formatlash yoqiladi:
// .vscode/settings.json — loyiha bilan git'ga qo'shiladi (jamoada izchil):
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit" // saqlashda ESLint --fix ham ishlaydi
},
"eslint.useFlatConfig": true // flat config (2.2.1) uchun
}
.vscode/settings.json— loyiha bilan birga git'ga qo'shiladi (.gitignorega kirmaydi), shunda butun jamoa bir xil sozlamada ishlaydi (yangi a'zo klonlaydi — darrov "format on save" ishlaydi).editor.formatOnSave— saqlaganda Prettier formatlaydi;editor.codeActionsOnSavebilansource.fixAll.eslint— saqlaganda ESLint tuzatiladiganlarni ham tuzatadi. Bu tavsiya qilingan kengaytmalarni ham (.vscode/extensions.json) qo'shsangiz, yangi a'zoga VS Code ularni o'rnatishni taklif qiladi.
2.4. Husky (git hooks)
HUSKY — GIT HOOKS (git hodisalarda avtomatik skript — commit'dan oldin tekshir):
GIT HOOKS — git hodisalarida ishlaydigan skriptlar:
pre-commit — COMMIT'dan oldin (lint/format tekshir — buzuq kod ketmasin)
commit-msg — commit xabari tekshir (conventional commits — 4.5)
pre-push — PUSH'dan oldin (test — buzuq kod push bo'lmasin)
HUSKY — git hooks'ni OSON sozlash (qo'lda .git/hooks murakkab):
npm install -D husky
npx husky init // husky o'rnatish
.husky/pre-commit (fayl):
npx lint-staged // o'zgargan fayllarni tekshir 2.5-bob
NATIJA:
$ git commit -m "yangi xususiyat"
pre-commit ishlaydi: ESLint + Prettier (o'zgargan fayllar)
xato bo'lsa — commit TO'XTAYDI (tuzat, keyin commit)
toza bo'lsa — commit o'tadi
Husky — git hooks (commit/push'dan oldin avtomatik tekshir — buzuq kod ketmaydi)
pre-commit (lint/format) — eng keng (har commit toza kod kafolati)Husky (git hooks) — git hodisalarida avtomatik tekshiruv. Git hooks — git hodisalarida (commit, push) avtomatik ishlaydigan skriptlar: (1) pre-commit — commit'dan oldin (eng keng — lint/format tekshir — buzuq/iflos kod git'ga ketmasin); (2) commit-msg — commit xabarini tekshir (conventional commits —
feat:,fix:— 4.5); (3) pre-push — push'dan oldin (test — buzuq kod push bo'lmasin). Husky — git hooks'ni oson sozlaydigan vosita (qo'lda.git/hooksmurakkab, git'ga commit qilinmaydi — Husky boshqaradi):npm install -D husky,npx husky init(o'rnatish —.husky/papka yaratadi)..husky/pre-commitfaylda:npx lint-staged(o'zgargan fayllarni tekshir — 2.5). Natija:git commitqilinganda — pre-commit avtomatik ishlaydi (ESLint + Prettier o'zgargan fayllarga): agar xato bo'lsa (lint xatosi, format xato) — commit to'xtaydi (dasturchi tuzatsin, keyin commit); agar toza — commit o'tadi. Ikki nuqta: (1) Husky — git hooks (commit/push'dan oldin avtomatik tekshir — buzuq kod ketmaydi — kafolat); (2) pre-commit (lint/format) — eng keng (har commit toza kod kafolati — dasturchi unutsa ham hook tekshiradi). Husky — kod sifatini kafolatlaydi (CI'dan ham erta — local'da, commit paytida — git'ga umuman iflos kod ketmaydi). Bu 14.9: Misol 3 (pre-commit secret scan)ning umumiy versiyasi (pre-commit — lint, format, secret, test — har xil tekshiruv). Nega Husky (qo'lda git hooks o'rniga): qo'lda.git/hooksgit'ga commit qilinmaydi (har dasturchi o'zi o'rnatishi kerak — unutiladi); Huskypackage.jsonda (git'da — har dasturchinpm installda avtomatik o'rnatadi — izchil). Pre-commit hook — "darvoza" (iflos kod o'tmaydi). Husky — git workflow'ni kod sifati bilan bog'laydi (commit = toza kod). Defense in depth — pre-commit (local) + CI (PR — 2.6) — ikki qatlam.
2.5. lint-staged (faqat o'zgargan)
lint-staged — faqat O'ZGARGAN (staged) fayllarni tekshir/formatla (TEZ):
MUAMMO: har commit'da BUTUN loyihani lint/format — SEKIN (minglab fayl)
YECHIM: faqat COMMIT qilinayotgan (staged) fayllar — tez (5-10 fayl)
SOZLASH (package.json yoki .lintstagedrc):
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"eslint --fix", // o'zgargan JS/TS — lint + tuzat
"prettier --write" // format
],
"*.{css,md,json}": "prettier --write" // boshqa fayllar — faqat format
}
OQIM (pre-commit'da — 2.4):
git commit Husky pre-commit lint-staged
faqat staged fayllar: eslint --fix + prettier --write
tuzatilgan fayllarni qayta stage commit
lint-staged — faqat o'zgargan (staged) fayllar (tez — butun loyiha emas)
Husky (pre-commit) + lint-staged (o'zgargan) — birga: tez, avtomatik tekshirlint-staged (faqat o'zgargan) — faqat o'zgargan fayllarni tekshirish. Muammo: har commit'da butun loyihani lint/format qilish sekin (minglab fayl — har commit 30 soniya — noqulay). Yechim — lint-staged: faqat commit qilinayotgan (staged —
git addqilingan) fayllarni tekshir (odatda 5-10 fayl — tez — 2-3 soniya). Sozlash (package.jsonyoki.lintstagedrc):"lint-staged": { "*.{ts,tsx,js,jsx}": ["eslint --fix", "prettier --write"], "*.{css,md,json}": "prettier --write" }— JS/TS fayllarga ESLint (lint + tuzat) + Prettier (format), boshqa fayllarga (CSS, markdown) faqat Prettier (format). Oqim (pre-commit'da — 2.4):git commitHusky pre-commit lint-staged faqat staged fayllargaeslint --fix+prettier --writetuzatilgan fayllarni qayta stage commit (toza kod bilan). Ikki nuqta: (1) lint-staged — faqat o'zgargan (staged) fayllar (tez — butun loyihani emas — commit tez); (2) Husky (pre-commit) + lint-staged (o'zgargan) — birga: tez, avtomatik tekshir (Husky — qachon — pre-commit; lint-staged — nimani — faqat o'zgargan). Bu kombinatsiya (Husky + lint-staged) — standart (har commit'da avtomatik, lekin tez — faqat o'zgargan fayllar). Nega faqat o'zgargan: (1) tez (5 fayl vs minglab — commit tez, noqulaylik yo'q); (2) mantiqli (faqat siz o'zgartirgan fayllar — eski fayllar (siz tegmagan) lint xatosi commit'ingizni bloklamasin — adolatli).--fix/--write— avtomatik tuzatadi (format, ba'zi lint — siz qo'lda tuzatmaysiz — vosita qiladi, qayta stage). Bu — kod sifatini silliq avtomatlashtirish (har commit toza, lekin tez — sezilmas). Husky + lint-staged — zamonaviy loyiha standarti (commit = toza, tez). Bu to'rt vosita (ESLint + Prettier + Husky + lint-staged) — birga kod sifatini to'liq avtomatlashtiradi.
2.5.1. commitlint — commit xabar standarti (commit-msg hook)
Kod sifati bilan bir qatorda commit xabar sifati ham muhim (o'qiladigan tarix, avtomatik changelog, semantik versiya). Conventional Commits — standart format: tur(qamrov): tavsif, masalan feat(auth): login qo'shildi, fix: null xatoni tuzatish. commitlint bu formatni commit-msg hook'da tekshiradi:
CONVENTIONAL COMMITS FORMATI:
<tur>[(qamrov)][!]: <tavsif>
tur: feat | fix | docs | refactor | test | chore | ci | perf ...
feat = yangi xususiyat, fix = xato tuzatish (SemVer: feat=minor, fix=patch)
"!" yoki "BREAKING CHANGE:" = major (buzuvchi o'zgarish)
feat(cart): savatga mahsulot qo'shish
fix: sahifa yuklanmayotgan xatoni tuzatish
"narsalarni tuzatdim" commitlint rad etadi (tur yo'q)
"WIP" rad etadi# O'rnatish va commit-msg hook (Husky bilan):
npm install -D @commitlint/cli @commitlint/config-conventional
echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js
# .husky/commit-msg (fayl ichi):
npx --no -- commitlint --edit "$1"commitlint — commit xabarini
commit-msggit hook'da tekshiradi (Husky orqali).@commitlint/config-conventional— Conventional Commits qoidalarini beradi. Xabar formatga mos bo'lmasa (feat:,fix:prefiksi yo'q, yoki bo'sh) — commit to'xtaydi. Nega bu foydali: (1) tarix o'qiladigan (git log— nima o'zgarganini ko'rasiz); (2) avtomatik changelog (feat/fixdan generatsiya); (3) semantik versiya (featminor,fixpatch,BREAKING CHANGEmajor — avtomatik).commit-msg— Husky boshqaradigan uchinchi keng hook (pre-commit lint, pre-push test bilan bir qatorda).
2.5.2. TypeScript type-check (tsc --noEmit)
ESLint tip xatolarini to'liq tutmaydi (u statik naqsh tahlili qiladi, tip tizimini emas). Haqiqiy tip tekshiruvi — TypeScript kompilyatorining o'zi:
tsc --noEmit kodni KOMPILYATSIYA qiladi (tip tekshiradi), lekin
.js FAYL CHIQARMAYDI (--noEmit) — faqat tip xatolarini topadi
package.json:
"scripts": { "type-check": "tsc --noEmit" }
xato: "Type 'string' is not assignable to type 'number'" — CI'ni yiqitadi
tsc --noEmit— TypeScript kompilyatori kodni tekshiradi (tip xatolari, mavjud bo'lmagan xususiyat, noto'g'ri argument), lekin.jsfayl chiqarmaydi (--noEmit— faqat tekshirish maqsadi). Nega ESLint yetarli emas: ESLint har fayldagi naqshni ko'radi, lekin butun loyiha bo'ylab tip oqimini (bir fayldagi funksiya boshqa faylda noto'g'ri chaqirilishi) tutmaydi — buni faqat kompilyator biladi. Shuning uchuntype-checkalohida qadam (CI'da — 2.6). Odatda pre-commit'datscishlatilmaydi (sekin — butun loyihani kompilyatsiya qiladi, lint-staged bilan bir fayl tekshirib bo'lmaydi), lekin CI'da va pre-push'da albatta bo'lishi kerak. Uchta mustaqil tekshiruv birga: ESLint (naqsh/sifat) + Prettier (format) +tsc(tip) — hech biri qolganini almashtirmaydi.
2.6. CI'da va to'liq sozlash
CI'DA — PR'da yana tekshir (local hook o'tkazilsa ham — qatlam):
# .github/workflows/ci.yml 10.9-bob:
- run: npm run lint # ESLint (xato bo'lsa CI qizil)
- run: npx prettier --check . # format tekshir (formatlanmaganni topadi)
- run: npm run type-check # TypeScript (tsc --noEmit)
- run: npm test # test
NEGA CI HAM (Husky bor-ku):
Husky local (dasturchi --no-verify bilan o'tkazib yuborishi mumkin)
CI — markaziy, majburiy (PR yashil bo'lmasa merge yo'q — 15.2)
TO'LIQ SOZLASH OQIMI:
1. ESLint + Prettier o'rnat + sozla (eslint.config.js, .prettierrc)
2. eslint-config-prettier (mojaro hal — 2.3)
3. Husky + lint-staged (pre-commit — 2.4, 2.5)
4. CI (PR'da lint/format/test — qatlam)
5. Editor (VS Code — format on save, ESLint plugin)
CI'da ham lint/format (local hook --no-verify bilan o'tkazilsa — markaziy qatlam)
To'liq oqim — ESLint+Prettier (sozla) Husky+lint-staged (commit) CI (PR) editorCI'da va to'liq sozlash — to'liq avtomatlashtirish oqimi. CI'da (PR'da — 10.9) yana tekshirish:
npm run lint(ESLint — xato bo'lsa CI qizil),prettier --check .(format tekshir —--checkformatlanmaganni topadi —--writeemas — CI faqat tekshiradi, tuzatmaydi),type-check(TypeScript),test. Nega CI ham (Husky bor-ku — pre-commit): Husky local (dasturchi mashinasida —git commit --no-verifybilan o'tkazib yuborishi mumkin — hook ishlamaydi); CI — markaziy, majburiy (PR yashil bo'lmasa merge yo'q — 15.2: 2.6 — server'da — chetlab o'tib bo'lmaydi). Demak: Husky — local, tez, qulay (commit paytida); CI — markaziy, majburiy (kafolat — local chetlab o'tilsa). Defense in depth (editor pre-commit CI). To'liq sozlash oqimi: (1) ESLint + Prettier o'rnat + sozla (eslint.config.js,.prettierrc); (2)eslint-config-prettier(mojaro hal — 2.3); (3) Husky + lint-staged (pre-commit — 2.4, 2.5); (4) CI (PR'da lint/format/test — qatlam); (5) editor (VS Code — "format on save", ESLint plugin — real vaqt). Ikki nuqta: (1) CI'da ham lint/format (local hook--no-verifybilan o'tkazilsa — markaziy qatlam — majburiy); (2) to'liq oqim — ESLint+Prettier (sozla) Husky+lint-staged (commit) CI (PR) editor (real vaqt). Bu to'liq oqim — kod sifatini har bosqichda (yozish — editor; commit — Husky; PR — CI) avtomatik tekshiradi (shift left — 14.9: 2.3 — erta, ko'p qatlam). Har qatlam o'z roli: editor (darrov — yozish paytida), pre-commit (commit — local kafolat), CI (PR — markaziy kafolat). Bu — professional loyihaning kod sifati infratuzilmasi (qo'lda emas — avtomatik, izchil, ko'p qatlamli). Bir marta sozlansa (boshida) — keyin avtomatik (har dasturchi, har commit, har PR — izchil sifat). Bu — 15.1 (toza kod) + 15.2 (review)ni avtomatlashtirish (vositalar — qo'lda mehnatni kamaytiradi).
2.7. Best practices va keng muammolar
BEST PRACTICES va KENG MUAMMOLAR:
BEST PRACTICES:
Prettier — format (ESLint format qoidalarini o'chir — eslint-config-prettier)
ESLint — sifat/xato (recommended + loyiha qoidalari)
Husky + lint-staged (commit — tez, avtomatik)
CI (markaziy — majburiy qatlam)
Editor (format on save — eng qulay)
Jamoa kelishuvi (qoidalar — birga; har kim emas)
KENG MUAMMOLAR:
ESLint vs Prettier mojaro (ikkalasi format) eslint-config-prettier
Juda ko'p qoida (har narsani error — demotivatsiya) muhimlarini
Qoidalar kelishilmagan (har kim boshqacha) jamoa standarti
Hook sekin (butun loyiha) lint-staged (faqat o'zgargan)
Qoidalarni o'chirib tashlash (eslint-disable hamma joyda) sababli faqat
Best — Prettier (format) + ESLint (sifat) + Husky/lint-staged (commit) + CI + editor
Muammolar — mojaro (eslint-config-prettier), ko'p qoida, sekin (lint-staged)Best practices va keng muammolar — vositalarni to'g'ri ishlatish. Best practices: (1) Prettier — format (ESLint'ning format qoidalarini o'chir —
eslint-config-prettier— mojaroni oldini oladi — 2.3); (2) ESLint — sifat/xato (recommended+ loyiha maxsus qoidalari — 2.2); (3) Husky + lint-staged (commit — tez, avtomatik — 2.4, 2.5); (4) CI (markaziy — majburiy qatlam — 2.6); (5) editor (format on save — eng qulay — yozasiz, formatlanadi); (6) jamoa kelishuvi (qoidalar — jamoa birga kelishadi — har kim o'zicha emas — izchillik). Keng muammolar: (1) ESLint vs Prettier mojaro (ikkalasi format qoidalariga ega — bir-biriga zid — masalan ESLint "bo'shliq", Prettier "boshqacha" — kurashadi)eslint-config-prettier(ESLint format qoidalarni o'chir — Prettier qiladi); (2) juda ko'p qoida (har narsanierror— har kichik narsaga qizil — demotivatsiya, ish sekinlashadi) faqat muhimlarinierror, qolganiniwarnyokioff; (3) qoidalar kelishilmagan (har dasturchi boshqacha sozlama — chalkash) jamoa standarti (bir konfiguratsiya — hamma uchun); (4) hook sekin (butun loyihani tekshir — commit sekin) lint-staged (faqat o'zgargan — 2.5); (5) qoidalarni o'chirib tashlash (eslint-disablehamma joyda — qoidalarni chetlab o'tish — vosita foydasiz) sababli faqat (eslint-disablefaqat haqiqiy sabab bilan — kommentariya bilan — har joyda emas). Ikki nuqta: (1) best — Prettier (format) + ESLint (sifat) + Husky/lint-staged (commit) + CI + editor (to'liq oqim — 2.6); (2) muammolar — mojaro (eslint-config-prettier), ko'p qoida (muhimlarini), sekin (lint-staged), o'chirib tashlash (sababli faqat). Bu vositalar — yordamchi (dushman emas) — to'g'ri sozlansa (kelishilgan qoida, mojarosiz, tez) — kod sifatini silliq avtomatlashtiradi; noto'g'ri (ko'p qoida, mojaro, sekin) — to'siq (demotivatsiya, ish sekin). Balans (15.1: 2.8 kabi) — yetarli qoida (muhimlari —error), tez (lint-staged), izchil (jamoa standarti). Zamonaviy loyihada bu sozlash bir marta (boshida — yokicreate-next-appkeladi) — keyin avtomatik foyda. Bu — professional kod sifati infratuzilmasini sozlash ko'nikmasi.
2.8. Performans (kesh), jamoa uchun umumiy konfiguratsiya va monorepo
Bir marta sozlagach, uch amaliy masala qoladi: linter tez ishlashi, jamoa/loyihalar bo'ylab bir xil qoida, va ko'p paketli (monorepo) loyihada boshqarish.
PERFORMANS (kesh):
eslint . --cache o'zgarmagan fayllar qayta tekshirilmaydi (.eslintcache)
CI'da ham keshni saqlash (actions/cache) — takroriy ishlash tez
UMUMIY KONFIGURATSIYA (shared config paket):
@kompaniya/eslint-config bir paket, hamma loyiha shuni import qiladi
eslint.config.js: import base from "@kompaniya/eslint-config";
export default [...base, { /* loyiha maxsus */ }];
izchillik: qoida bir joyda yangilanadi hamma loyiha oladi
MONOREPO (15.4 cross-ref):
ildizda umumiy eslint.config.js + prettier config (barcha paket meros oladi)
Turborepo: "lint" taskni keshlash (o'zgarmagan paket qayta lint qilinmaydi)Performans (kesh) — katta loyihada
eslint .sekin bo'lishi mumkin.--cachebayrog'i natijani.eslintcachefayliga saqlaydi va keyingi safar faqat o'zgargan fayllarni tekshiradi (o'zgarmaganlar o'tkazib yuboriladi). Buni.gitignorega qo'ying. CI'da keshni saqlab qolish (masalanactions/cachebilan.eslintcache) takroriy ishlashni tezlashtiradi. Prettier'da ham--cachebor. Kesh — lint-staged'dan (faqat staged fayl) mustaqil to'ldiruvchi optimizatsiya (butun loyihani lint qilganda foydali).
Umumiy konfiguratsiya (shared config) — ko'p loyiha yoki katta jamoada har birida qoidalarni takrorlash — ziddiyat va ko'chirish xatosi manbai. Yechim — qoidalarni alohida npm paketga chiqarish (
@kompaniya/eslint-config,@kompaniya/prettier-config) va har loyihada import qilish:import base from "@kompaniya/eslint-config"; export default [...base, { /* loyiha maxsus qo'shimchalar */ }];. Bir joyda yangilaysiz — barcha loyiha yangilanadi (izchillik, markazlashgan boshqaruv). Ochiq misollar:eslint-config-airbnb,eslint-config-next(Next.js bilan keladi) — bular ham aslida umumiy config paketlar. Prettier uchunpackage.jsonda"prettier": "@kompaniya/prettier-config"bilan ulanadi.
Monorepo (bir repozitoriyda ko'p paket — 15.4-bob) — kod sifati bir necha paketga tarqaladi. Amaliyot: ildizda (root) umumiy
eslint.config.jsva Prettier konfiguratsiyasi qo'yiladi, paketlar shuni meros oladi (yoki ildizdan--configbilan ishlatiladi) — bitta manba, izchil qoida. Husky ildizda bir marta o'rnatiladi (butun monorepo uchun bitta.husky/). Turborepo/Nx (15.4)lint/type-checktasklarni keshlaydi — o'zgarmagan paket qayta lint qilinmaydi (katta monorepoda katta tezlik). Monoreponing batafsili — 15.4-bob.
2.9. Qachon qaysi qoida to'plami (Airbnb / Standard / o'z)
Loyiha boshida keng savol: qanday qoida to'plamidan boshlash? Uch keng yondashuv bor:
QOIDA TO'PLAMLARI — qat'iylik va nazorat bo'yicha:
┌─────────────────┬──────────────────────────────────────────────┐
│ eslint:recommended│ Minimal — faqat aniq buglar. Xavfsiz boshlanish│
│ + typescript-eslint│ (kam bahs). Ko'pchilik loyiha uchun yetarli. │
├─────────────────┼──────────────────────────────────────────────┤
│ Airbnb │ Juda qat'iy, batafsil uslub. Izchil, lekin │
│ │ ko'p qoida (o'rganish/moslash kerak). │
├─────────────────┼──────────────────────────────────────────────┤
│ Standard │ Konfiguratsiyasiz, o'z fikri (masalan ; yo'q). │
│ │ Tez, lekin moslash cheklangan. │
├─────────────────┼──────────────────────────────────────────────┤
│ O'z to'plamingiz │ recommended + jamoa kelishgan qo'shimchalar. │
│ │ Eng moslashuvchan (aksar jamoa shu yo'lni tanlaydi)│
└─────────────────┴──────────────────────────────────────────────┘Qaysi qoida to'plami? (1)
eslint:recommended+typescript-eslint— minimal, faqat aniq xatolar (kam bahs, xavfsiz boshlanish). Ko'pchilik loyiha uchun yetarli — bu asosdan boshlash tavsiya etiladi. (2) Airbnb (eslint-config-airbnb) — juda qat'iy, batafsil uslub qoidalari (izchillik yuqori, lekin ko'p qoida — moslashish va o'rganish vaqt talab qiladi; ba'zi qoidalar bahsli). (3) Standard (eslint-config-standard) — o'z qat'iy fikri bor (masalan nuqta-vergulsiz), sozlash deyarli yo'q (tez, lekin moslash cheklangan — Prettier bilan qo'shish murakkab). (4) O'z to'plamingiz —recommendeddan boshlab, jamoa kelishgan qoidalarni qo'shish (eng moslashuvchan — aksar jamoa shu yo'lni tanlaydi). Umumiy tavsiya:recommended+typescript-eslintdan boshlang, format Prettier'ga bering, keyin loyiha ehtiyojiga qarab qoida qo'shing (Airbnb'ni to'liq olishdan ko'ra tanlab olgan qulay). Muhimi — jamoa kelishishi (qaysi to'plam bo'lsa ham — izchillik qoidaning o'zidan muhimroq).
3. Sintaksis — sozlash ma'lumotnoma
ESLINT 2.2-bob: eslint.config.js — js.recommended + tseslint + rules; eslint . --fix
FLAT vs ESKI (2.2.1): eslint.config.js (yangi, ESLint 9) vs .eslintrc.* (eski, env/extends)
PLAGINLAR (2.2.2): @typescript-eslint, react, react-hooks, jsx-a11y, import
PRETTIER 2.3-bob: .prettierrc — { semi, singleQuote, printWidth }; prettier --write .
IGNORE (2.3.1): .prettierignore — dist, node_modules, *.min.js
EDITOR (2.3.1): .vscode/settings.json — formatOnSave + codeActionsOnSave (ESLint)
MOJARO 2.3-bob: eslint-config-prettier (ESLint format qoidalarini o'chir)
HUSKY 2.4-bob: npx husky init; .husky/pre-commit npx lint-staged
LINT-STAGED 2.5-bob: "lint-staged": { "*.{ts,tsx}": ["eslint --fix", "prettier --write"] }
COMMITLINT (2.5.1): @commitlint/config-conventional; .husky/commit-msg commitlint --edit
TYPE-CHECK (2.5.2): tsc --noEmit (tip tekshiruv — .js chiqarmaydi)
CI 2.6-bob: npm run lint + prettier --check + type-check + test
PERFORMANS 2.8-bob: eslint . --cache (.eslintcache); shared config paket; monorepo 15.4-bob
QOIDA TO'PLAMI 2.9-bob: recommended (minimal) | Airbnb (qat'iy) | Standard | o'z4. Batafsil misollar
Har misol: Maqsad + sozlash/kod + "Bu nima qiladi".
Misol 1 — ESLint sozlash (2.2)
Maqsad: TypeScript loyihaga ESLint sozlash — sifat qoidalari bilan. Bu kod xatolarini yozish paytida topadi.
// eslint.config.js (flat config — yangi format):
import js from "@eslint/js";
import tseslint from "typescript-eslint";
export default [
js.configs.recommended, // JS standart qoidalar
...tseslint.configs.recommended, // TypeScript qoidalari (7-QISM)
{
files: ["**/*.{ts,tsx}"],
rules: {
// Xatolar (error — CI yiqitadi):
"no-unused-vars": "off", // TS versiyasini ishlat:
"@typescript-eslint/no-unused-vars": "error", // ishlatilmagan o'zgaruvchi
"eqeqeq": ["error", "always"], // === majburiy (== taqiq)
"no-var": "error", // var taqiq (let/const)
// Ogohlantirishlar (warn — sariq, lekin o'tadi):
"no-console": "warn", // console.log — ogohlantir
"@typescript-eslint/no-explicit-any": "warn", // any — ogohlantir (7-QISM)
},
},
{ ignores: ["dist/", "node_modules/", ".next/"] }, // tekshirma
];Bu nima qiladi: Bu — ESLint sozlash (TypeScript loyihaga — 2.2). eslint.config.js (flat config — ESLint'ning yangi sozlash formati): (1) js.configs.recommended — JavaScript standart qoidalari (eng keng muammolar — masalan duplicate keys, unreachable code); (2) tseslint.configs.recommended — TypeScript qoidalari (7-QISM — tip bilan bog'liq); (3) maxsus rules — loyiha qoidalari. Xatolar (error — CI'ni yiqitadi — tuzatish majburiy): @typescript-eslint/no-unused-vars (ishlatilmagan o'zgaruvchi — TS versiyasi — no-unused-vars o'chiq, TS versiyasi yoqilgan — to'g'riroq), eqeqeq (=== majburiy — == tip xavfi — 2-QISM), no-var (var taqiq — let/const). Ogohlantirishlar (warn — sariq, lekin o'tadi — yaxshilash, lekin bloklamaydi): no-console (console.log — production'da qolmasin — ogohlantirish), @typescript-eslint/no-explicit-any (any — 7-QISM — tip yo'qotadi — ogohlantirish). ignores — tekshirilmaydigan papkalar (dist, node_modules, .next — build natijalari — tekshirish keraksiz). Qoida darajalari: "error" (qizil — CI yiqiladi — jiddiy), "warn" (sariq — o'tadi — yaxshilash), "off" (o'chiq). Bu sozlama — kod sifatini yozish paytida (editor'da qizil/sariq) va CI'da (PR — error bloklaydi) tekshiradi. Nega bu muhim: ESLint xato/yomon naqshni yozish paytida topadi (production'dan oldin — == ishlatsangiz darrov qizil — tuzatasiz). recommended (yaxshi boshlanish) + maxsus qoidalar (loyihaga moslash — masalan console.log taqiq). Balans 2.7-bob — muhimlarni error (===, unused), yaxshilashlarni warn (console, any) — juda ko'p error demotivatsiya. Bu — har TS loyihaning ESLint asosi (sifat qoidalari — avtomatik tekshir).
Misol 2 — Prettier + ESLint birga (2.3)
Maqsad: Prettier va ESLint'ni mojarosiz birga ishlatish — har biri o'z vazifasini. Bu format va sifatni alohida boshqaradi.
// .prettierrc (format sozlamasi — kam, default yaxshi):
{
"semi": true,
"singleQuote": false,
"printWidth": 100,
"tabWidth": 2,
"trailingComma": "es5"
}// eslint.config.js — Prettier bilan mojaroni hal:
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import prettier from "eslint-config-prettier"; // ESLint format qoidalarini o'chiradi
export default [
js.configs.recommended,
...tseslint.configs.recommended,
{ rules: { /* sifat qoidalari — Misol 1 */ } },
prettier, // OXIRIDA — ESLint'ning format qoidalarini bekor qiladi (Prettier qiladi)
];// package.json scripts:
{
"scripts": {
"lint": "eslint .",
"format": "prettier --write .",
"format:check": "prettier --check ."
}
}Bu nima qiladi: Bu — Prettier va ESLint'ni mojarosiz birga ishlatish 2.3-bob. Muammo: ESLint'da ham format qoidalari bor (eski — masalan indent, quotes), Prettier ham format qiladi — agar ikkalasi yoqilgan bo'lsa, ular kurashadi (ESLint "bo'shliq 4" deydi, Prettier "2 qiladi" — har save'da o'zgaradi — chalkash). Yechim: (1) .prettierrc — format sozlamasi (semi — nuqta-vergul, singleQuote: false — qo'sh tirnoq, printWidth: 100 — qator uzunligi, tabWidth: 2 — indent, trailingComma — vergul) — kam sozlama (Prettier default yaxshi — faqat ba'zi afzalliklar); (2) eslint-config-prettier — ESLint sozlamasiga oxirida qo'shiladi — bu ESLint'ning format qoidalarini (indent, quotes, semi — Prettier qiladigan) o'chiradi — endi ESLint faqat sifat (mantiq — unused, ===), Prettier faqat format (ko'rinish) — har biri o'z vazifasi, mojaro yo'q. (3) package.json scripts — qulay buyruqlar: lint (ESLint — sifat), format (Prettier — formatla), format:check (Prettier — tekshir, tuzatmay — CI uchun — 2.6). Natija: ESLint kod sifatini (xato, yomon naqsh), Prettier formatini (ko'rinish) — alohida, mojarosiz. Nega bu kerak: ko'p loyiha ESLint + Prettier ishlatadi, lekin mojaro (format kurashadi) — eslint-config-prettier buni hal qiladi (ESLint format qoidalari o'chiq — Prettier qiladi). Bu standart sozlama (har ESLint + Prettier loyihada — eslint-config-prettier oxirida). Tartib muhim — prettier (eslint-config-prettier) oxirida (oldingi qoidalarni bekor qiladi — keyingi sozlama oldingisini o'chiradi). Endi: yozasiz ESLint sifatni tekshiradi (qizil xato) + Prettier formatlaydi (save'da) — birga, mojarosiz. Bu — ESLint + Prettier'ning to'g'ri kombinatsiyasi (har biri o'z ishi — sifat va format).
Misol 3 — Husky + lint-staged (2.4, 2.5)
Maqsad: Commit'dan oldin avtomatik lint/format — Husky + lint-staged bilan. Bu iflos kodning git'ga ketishini oldini oladi.
# O'rnatish:
npm install -D husky lint-staged
npx husky init # Husky o'rnatish (.husky/ yaratadi)// package.json — lint-staged sozlamasi:
{
"lint-staged": {
"*.{ts,tsx,js,jsx}": [
"eslint --fix", // o'zgargan JS/TS — lint + avtomatik tuzat
"prettier --write" // format
],
"*.{json,css,md}": [
"prettier --write" // boshqa fayllar — faqat format
]
}
}# .husky/pre-commit (fayl ichi):
npx lint-stagedNATIJA — git commit qilganda:
$ git add login.tsx
$ git commit -m "login qo'shildi"
Husky pre-commit ishlaydi
lint-staged: faqat login.tsx (staged) tekshiriladi
eslint --fix (xato tuzatiladi)
prettier --write (formatlanadi)
agar tuzatilmaydigan xato (masalan === kerak) COMMIT TO'XTAYDI
toza bo'lsa commit o'tadi (toza kod git'da)Bu nima qiladi: Bu — Husky + lint-staged (commit'dan oldin avtomatik tekshiruv — 2.4, 2.5). O'rnatish: npm install -D husky lint-staged, npx husky init (Husky o'rnatadi — .husky/ papka). lint-staged sozlamasi (package.json): qaysi fayllarga nima qilish — *.{ts,tsx,js,jsx} (JS/TS) eslint --fix (lint + avtomatik tuzat) + prettier --write (format); *.{json,css,md} (boshqa) faqat prettier --write (format — ESLint JS/TS uchun). .husky/pre-commit npx lint-staged (commit'dan oldin lint-staged ishlaydi). Natija: git commit qilinganda — Husky pre-commit ishlaydi lint-staged faqat staged (commit qilinayotgan — login.tsx) fayllarni tekshiradi (butun loyiha emas — tez — 2.5): eslint --fix (xato tuzatiladi — masalan ===ga o'zgartiradi) + prettier --write (formatlanadi); agar tuzatilmaydigan xato bo'lsa (masalan ishlatilmagan o'zgaruvchi — qo'lda tuzatish kerak) commit to'xtaydi (dasturchi tuzatsin); toza bo'lsa commit o'tadi (toza, formatlangan kod git'da). Nega bu muhim: (1) kafolat — har commit toza, formatlangan (dasturchi format/lint haqida o'ylamaydi — avtomatik); (2) tez — faqat o'zgargan fayllar (lint-staged — butun loyihani emas — commit sezilmas); (3) avtomatik tuzatish — --fix/--write ko'p narsani o'zi tuzatadi (format, ba'zi lint — dasturchi qo'lda qilmaydi). Demak: iflos kod git'ga umuman ketmaydi (commit paytida to'siladi yoki tuzatiladi). Bu CI'dan ham erta (local — commit paytida — 2.6). Husky (qachon — pre-commit) + lint-staged (nimani — o'zgargan) — birga ideal (avtomatik, tez, commit paytida). Bu standart sozlama (har professional JS/TS loyihada — Husky + lint-staged). Bir marta sozlansa — keyin har commit avtomatik (toza kod kafolati). Bu 14.9: Misol 3 (pre-commit secret)ning sifat versiyasi (pre-commit — lint/format).
Misol 4 — To'liq CI sozlash (2.6)
Maqsad: PR'da kod sifatini markaziy tekshirish — CI bilan. Bu local hook chetlab o'tilsa ham kafolat.
# .github/workflows/ci.yml — kod sifati CI 10.9-bob:
name: CI
on: [push, pull_request]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: "npm" }
- run: npm ci
# Kod sifati (har biri xato bo'lsa CI qizil — merge yo'q):
- run: npm run lint # ESLint (sifat — Misol 1)
- run: npx prettier --check . # format tekshir (--check — tuzatmaydi, topadi)
- run: npm run type-check # TypeScript (tsc --noEmit)
- run: npm test # test (11.17)
- run: npm run build # build muvaffaqiyatlimiNEGA CI HAM (Husky bor-ku — 2.6):
Husky LOCAL (git commit --no-verify bilan o'tkazib yuborilishi mumkin)
CI MARKAZIY (server'da — chetlab o'tib bo'lmaydi — majburiy qatlam)
QATLAMLAR (defense in depth):
Editor (yozishda) Husky (commit) CI (PR — majburiy)
har qatlam — kod sifati (biri o'tkazilsa, keyingi ushlaydi)Bu nima qiladi: Bu — to'liq CI kod sifati sozlash 2.6-bob. .github/workflows/ci.yml (GitHub Actions — 10.9), har push/PR'da: npm ci (paketlar), keyin kod sifati tekshiruvlari — npm run lint (ESLint — sifat — Misol 1), prettier --check . (format tekshir — --check faqat topadi formatlanmaganni, --write emas — CI tuzatmaydi, faqat tekshiradi — agar formatlanmagan fayl bor — CI qizil), type-check (TypeScript — tip xatolari), test 11.17-bob, build (kompilyatsiya). Har biri xato bo'lsa — CI qizil (merge yo'q — 15.2: 2.6). Nega CI ham (Husky pre-commit bor-ku): Husky local (dasturchi mashinasida) — git commit --no-verify bilan hook'ni o'tkazib yuborishi mumkin (yoki Husky o'rnatilmagan), shuning uchun markaziy kafolat kerak — CI (server'da — chetlab o'tib bo'lmaydi — PR yashil bo'lmasa merge yo'q). Qatlamlar (defense in depth — 14.1: 2.3): editor (yozishda — real vaqt — darrov) Husky (commit — local — tez) CI (PR — markaziy — majburiy) — har qatlam kod sifatini tekshiradi (biri o'tkazilsa — keyingi ushlaydi). Nega ko'p qatlam: editor (eng erta — yozishda — qulay, lekin o'chirilishi mumkin), Husky (commit — local kafolat, lekin --no-verify), CI (PR — markaziy — chetlab o'tib bo'lmaydi — eng ishonchli). Birga — kod sifati har bosqichda (yozish, commit, PR) — izchil kafolat. --check vs --write: CI'da --check (tekshiradi — formatlanmagan bo'lsa qizil — dasturchi tuzatsin), local hook'da --write (tuzatadi — avtomatik). Bu — kod sifati infratuzilmasinin markaziy qatlami (CI — majburiy — har PR toza kod). Editor + Husky + CI — to'liq oqim (15.3 vositalari har bosqichda). Bu professional loyihaning standarti (kod sifati avtomatik, ko'p qatlamli, majburiy — qo'lda emas).
Misol 5 — eslint-disable to'g'ri ishlatish (2.7)
Maqsad: ESLint qoidasini istisno qilishni to'g'ri (sababli, cheklangan) qilish. Bu vositani chetlab o'tmasdan, zarur holatda moslashish.
// YOMON — qoidani ko'r-ko'rona o'chirish (vosita foydasiz):
/* eslint-disable */ // BUTUN fayl uchun — hech narsa tekshirilmaydi!
function messy() { var x == 5 }
// YOMON — sababsiz, keng:
// eslint-disable-next-line
const data: any = fetchData(); // nega? — noaniq
// YAXSHI — aniq qoida + sabab (cheklangan):
// 3-tomon kutubxona tipi noto'g'ri — any zarur (issue: github.com/lib/123)
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const legacyData: any = oldLibrary.getData();
// YAXSHI — qoidani LOYIHA darajasida moslash (agar tez-tez kerak bo'lsa):
// eslint.config.js: test fayllarda console OK:
{
files: ["**/*.test.ts"],
rules: { "no-console": "off" }, // test'da console — OK (sababli)
}Bu nima qiladi: Bu — eslint-disable to'g'ri ishlatish (2.7 — vositani chetlab o'tmasdan moslashish). Ba'zan ESLint qoidasi zarur holatda noto'g'ri (false positive — 14.9: 2.2 — yoki haqiqiy istisno) — uni o'chirish kerak, lekin to'g'ri (sababli, cheklangan). Yomon: (1) /* eslint-disable */ (butun fayl — hech narsa tekshirilmaydi — vosita foydasiz — butun fayl himoyasiz — eng yomon); (2) // eslint-disable-next-line sababsiz (const data: any — nega any? — noaniq — keyingi dasturchi bilmaydi). Yaxshi: (1) aniq qoida + sabab (// eslint-disable-next-line @typescript-eslint/no-explicit-any — aniq qoida (faqat shu qoida, boshqalari faol) + sabab kommentariyasi ("3-tomon kutubxona tipi noto'g'ri — any zarur" + issue havolasi) — keyingi dasturchi nega ekanini biladi, va faqat bir qoida o'chiq (boshqalari himoya); (2) loyiha darajasida moslash (agar tez-tez kerak — masalan test fayllarda console.log OK — debug — eslint.config.jsda files: ["**/*.test.ts"], rules: { "no-console": "off" } — sababli, izchil — har test faylda eslint-disable yozishdan yaxshiroq). Nega bu muhim: eslint-disable — qoidani chetlab o'tish (ESLint foydasini yo'qotadi) — agar keng/sababsiz ishlatilsa (butun fayl, har joyda any) — vosita ma'nosiz (qoidalar bor, lekin chetlab o'tilgan). To'g'ri ishlatish: (1) cheklangan (aniq qoida + aniq qator — next-line — butun fayl emas); (2) sababli (kommentariya — nega — keyingi dasturchi tushunsin); (3) kam (faqat haqiqiy istisno — har noqulaylikda emas — qoidani o'zgartir yoki kodni tuzat). Agar bir qoida tez-tez o'chirilsa (har joyda eslint-disable) — bu qoida noto'g'ri sozlangan belgisi (loyiha darajasida moslash — warn/off yoki maxsus konfiguratsiya). eslint-disable — "qochish lyuki" (zarur, lekin kam, sababli) — keng ishlatilsa vosita buziladi. Bu — vositani professional ishlatish (chetlab o'tmasdan — zarur holatda, to'g'ri, sababli moslashish). Balans 2.7-bob — qoidalar foydali, lekin ba'zan istisno kerak (to'g'ri — cheklangan, sababli).
Misol 6 — React plaginlari va flat config (2.2.2)
Maqsad: React loyihaga plaginlar bilan ESLint sozlash (hook qoidalari, qulaylik, import tartibi) — flat config'da. Bu React'ga xos xatolarni topadi.
# Plaginlarni o'rnatish:
npm install -D eslint-plugin-react eslint-plugin-react-hooks \
eslint-plugin-jsx-a11y eslint-plugin-import eslint-config-prettier// eslint.config.js — React + TS + plaginlar (flat config):
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";
import jsxA11y from "eslint-plugin-jsx-a11y";
import importPlugin from "eslint-plugin-import";
import prettier from "eslint-config-prettier";
export default [
js.configs.recommended,
...tseslint.configs.recommended,
{
files: ["**/*.{ts,tsx}"],
plugins: { // plaginlar obyekt sifatida (string emas)
react,
"react-hooks": reactHooks,
"jsx-a11y": jsxA11y,
import: importPlugin,
},
languageOptions: {
globals: { window: "readonly", document: "readonly" }, // eski "env" o'rniga
},
settings: { react: { version: "detect" } }, // React versiyasini avtomatik aniqla
rules: {
"react-hooks/rules-of-hooks": "error", // hook faqat tepada (11-QISM)
"react-hooks/exhaustive-deps": "warn", // useEffect bog'liqlik massivi
"jsx-a11y/alt-text": "error", // img'da alt majburiy (13-QISM)
"import/no-cycle": "error", // davriy import taqiq
"import/order": "warn", // import tartibi izchil
},
},
{ ignores: ["dist/", "node_modules/"] },
prettier, // OXIRIDA — format qoidalarini o'chir
];Bu nima qiladi: Bu — React loyiha uchun to'liq ESLint konfiguratsiyasi (flat config — 2.2.1 — plaginlar bilan — 2.2.2). Har plagin import qilinadi va plugins obyektiga qo'yiladi (eski formatdagi string nomlar o'rniga — flat config'da haqiqiy obyekt). languageOptions.globals — eski env o'rnini bosadi (window, document — brauzer global o'zgaruvchilari — ESLint ularni "aniqlanmagan" deb belgilamasin). settings.react.version: "detect" — o'rnatilgan React versiyasini avtomatik aniqlaydi. Qoidalar: react-hooks/rules-of-hooks (error) — hook faqat komponent tepasida chaqirilsin (shart/tsikl ichida emas — 11-QISM — bu haqiqiy bug manbai); react-hooks/exhaustive-deps (warn) — useEffect bog'liqlik massivi to'liqmi (eskirgan qiymat xavfi); jsx-a11y/alt-text (error) — rasmda alt matni (nogironlar uchun — 13-QISM); import/no-cycle — davriy import taqiq (ikki fayl bir-birini import qilishi — chalkash bog'liqlik); import/order — import tartibi izchil. Eng oxirida prettier (eslint-config-prettier) — barcha format qoidalarini o'chiradi (Misol 2 — tartib muhim). Nega bu muhim: React'da eng keng xatolar (hook qoidasi buzilishi, to'liqsiz bog'liqlik massivi) ESLint yadrosida tutilmaydi — faqat react-hooks plagini topadi. Plaginlar loyiha stack'iga qarab tanlanadi — bu React loyiha uchun tavsiya etilgan minimal to'plam. Real vaqtda editor (VS Code ESLint kengaytmasi) bu qoidalarni yozish paytida ko'rsatadi.
5. To'g'ri va noto'g'ri holatlar
1) Format
qo'lda format (har kim har xil — chalkash)
Prettier (avtomatik, izchil — 2.3)2) ESLint + Prettier
ikkalasi format (mojaro — 2.3)
eslint-config-prettier (ESLint sifat, Prettier format — Misol 2)3) Commit
qo'lda lint (unutiladi — buzuq kod git'da)
Husky + lint-staged (avtomatik — Misol 3)4) Hook tezligi
butun loyiha (sekin commit)
lint-staged (faqat o'zgargan — 2.5)5) CI
faqat Husky (--no-verify bilan o'tkaziladi)
CI ham (markaziy qatlam — Misol 4)6) eslint-disable
butun fayl / sababsiz (vosita foydasiz)
aniq qoida + sabab + cheklangan (Misol 5)6. Keng tarqalgan xatolar va yechimlari
Xato 1 — ESLint vs Prettier mojaro
Sababi: ikkalasi format 2.3-bob. Yechimi: eslint-config-prettier (Misol 2).
Xato 2 — Buzuq kod git'da
Sababi: qo'lda lint (unutildi). Yechimi: Husky pre-commit (Misol 3).
Xato 3 — Commit sekin
Sababi: butun loyiha lint 2.5-bob. Yechimi: lint-staged (faqat o'zgargan).
Xato 4 — Juda ko'p ESLint xato
Sababi: har narsa error (demotivatsiya — 2.7). Yechimi: muhimlarini error, qolgani warn (Misol 1).
Xato 5 — Local hook chetlab o'tildi
Sababi: --no-verify yoki Husky yo'q 2.6-bob. Yechimi: CI ham (markaziy — Misol 4).
Xato 6 — eslint-disable hamma joyda
Sababi: qoidani chetlab o'tish 2.7-bob. Yechimi: sababli, cheklangan (Misol 5).
Xato 7 — Tip xatosi ESLint'dan o'tib ketdi
Sababi: ESLint tip tizimini emas, naqshni tekshiradi (2.5.2). Yechimi: tsc --noEmit alohida qadam (CI/pre-push).
Xato 8 — Chalkash commit tarixi
Sababi: commit xabar standartsiz ("WIP", "tuzatdim" — 2.5.1). Yechimi: commitlint + Conventional Commits (commit-msg hook).
Xato 9 — Katta loyihada lint sekin
Sababi: har safar butun loyiha qayta tekshiriladi 2.8-bob. Yechimi: --cache (.eslintcache) + lint-staged.
7. Integratsiya — bu mavzu stack'ning qayerida uchraydi
- Toza kod 15.1-bob: ESLint/Prettier — toza kodni avtomatlashtirish.
- Code review 15.2-bob: format avtomatik review mantiqqa 2.7-bob.
- Git (4-QISM): Husky — git hooks (commit).
- CI/CD 10.9-bob: CI — lint/format/test (markaziy).
- TypeScript (7-QISM): ESLint TS qoidalari (
@typescript-eslint),tsc --noEmittype-check. - React (11-QISM), qulaylik (13-QISM):
react-hooks,jsx-a11yplaginlari (Misol 6). - Xavfsizlik 14.9-bob: ESLint security plugin, secret scan (pre-commit).
- Git commit standarti (4-QISM): commitlint — Conventional Commits (commit-msg — 2.5.1).
- Monorepo 15.4-bob: umumiy/shared konfiguratsiya, lint task keshi 2.8-bob.
8. Eng yaxshi amaliyotlar (best practices)
- Prettier (format) + ESLint (sifat) (alohida vazifa — 2.1).
- eslint-config-prettier (mojaro hal — Misol 2).
- Husky + lint-staged (commit — tez, avtomatik — Misol 3).
- CI ham (markaziy qatlam — --no-verify'dan himoya — Misol 4).
- Editor format on save (eng qulay — 2.6).
- Muhimlarini error (qolgani warn — demotivatsiya emas — Misol 1).
- Jamoa standarti (umumiy konfiguratsiya — 2.7).
- eslint-disable sababli (cheklangan — Misol 5).
- lint-staged (tez) (faqat o'zgargan — 2.5).
tsc --noEmit(tip tekshiruv — ESLint yetarli emas — 2.5.2).- commitlint (Conventional Commits — o'qiladigan tarix — 2.5.1).
- Flat config (yangi loyihada
eslint.config.js— 2.2.1). --cache+ shared config (tez + izchil — 2.8).- Bir marta sozla (keyin avtomatik foyda — 2.6).
9. Amaliy loyiha: "Kod Sifati Avtomatlashtirish"
ESLint, Prettier, Husky, lint-staged sozlashni mustahkamlash.
Maqsad
Loyihaga to'liq kod sifati infratuzilmasi: ESLint, Prettier, Husky, lint-staged, CI.
Talablar (requirements)
- ESLint: sifat qoidalari (recommended + maxsus — Misol 1).
- Prettier: format sozlamasi (.prettierrc — Misol 2).
- Mojaro: eslint-config-prettier (Misol 2).
- Husky: pre-commit hook (Misol 3).
- lint-staged: faqat o'zgargan (Misol 3).
- CI: lint/format/type/test (Misol 4).
- Editor: format on save + ESLint plugin 2.6-bob.
- Scripts: lint, format, format:check (Misol 2).
- Balans: muhimlarini error (Misol 1).
- Test: buzuq kod commit'ni to'xtatadimi (Misol 3).
Maslahatlar (hint)
- eslint-config-prettier (Xato 1).
- Husky pre-commit (Xato 2).
- lint-staged (Xato 3).
- CI ham (Xato 5).
- Balans (Xato 4).
"Tayyor" mezonlari (acceptance criteria)
- ESLint (sifat).
- Prettier (format, mojarosiz).
- Husky + lint-staged (commit).
- CI (lint/format/test).
- Editor (format on save).
- Buzuq kod commit'da to'xtaydi.
Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.
10. Xulosa va keyingi bobga ko'prik
Bu bobda kod sifati avtomatlashtirishni chuqur o'rgandik:
- Vositalar roli (ESLint/Prettier/Husky/lint-staged — 2.1); ESLint (sifat, flat config, plaginlar — 2.2); Prettier (format,
.prettierignore, editor — 2.3); Husky (git hooks — 2.4); lint-staged (tez — 2.5); commitlint + type-check (2.5.1–2.5.2); CI/to'liq oqim 2.6-bob; best practices 2.7-bob; performans, shared config, monorepo 2.8-bob; qaysi qoida to'plami 2.9-bob.
Endi siz kod sifatini avtomatlashtirasiz: ESLint (sifat), Prettier (format), Husky + lint-staged (commit), CI (markaziy). Kod izchil, toza, avtomatik (qo'lda emas) — va review format munozarasidan ozod 15.2-bob.
Keyingi bob — 15.4-bob: Monorepo (Turborepo / Nx). Kod sifatini avtomatlashtirishni bildik; endi ko'p loyihani bir joyda boshqarishni ko'ramiz: monorepo (bir repozitoriyda ko'p loyiha/paket — frontend + backend + umumiy kod), Turborepo/Nx (monorepo vositalari — build kesh, bog'liqlik), umumiy kod (shared paketlar), va qachon monorepo. Bu — katta, ko'p qismli loyiha boshqaruvi.
Foydalanilgan rasmiy/ishonchli manbalar
- ESLint rasmiy hujjati — flat config (
eslint.config.js), qoidalar, plaginlar, migratsiya (.eslintrcflat) - typescript-eslint — TypeScript qoidalari va parser;
eslint-plugin-react,eslint-plugin-react-hooks,eslint-plugin-jsx-a11y,eslint-plugin-importrasmiy hujjatlari - Prettier rasmiy hujjati — sozlash,
.prettierignore, ESLint integratsiyasi (eslint-config-prettier) - TypeScript rasmiy hujjati —
tsc --noEmit, kompilyator bayroqlari - Husky rasmiy hujjati (v9+) va lint-staged rasmiy hujjati
- commitlint va Conventional Commits spetsifikatsiyasi
- GitHub Actions rasmiy hujjati — CI workflow, kesh (
actions/cache) - VS Code rasmiy hujjati — ESLint/Prettier kengaytmalari,
settings.json(format on save)
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!