IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config39/48-dars17 daqiqa
Mundarija (30)

Biome va Oxlint: ESLint va Prettier'ning Rust'dagi tez muqobillari

Qisqacha: Biome — linter va formatlagich bitta dasturda (biome check), Oxlint — faqat linter. Ikkalasi Rust'da yozilgan va ESLint'dan bir necha baravar tez: vazifalar da Oxlint 0.8 s, ESLint 4 s. Ammo hamma narsani qila olmaydi: bizning XSS qoidamiz (no-restricted-syntax) ikkalasiga ham ko'chmadi. Shuning uchun ko'p jamoa ularni ESLint bilan yonma-yon ishlatadi.

Bu darsda

  • Biome va Oxlint nima ekanini, ESLint va Prettier'dan nimasi bilan farq qilishini tushuntira olasiz.
  • biome.json ni o'qiysiz, biome check --write va biome migrate ni ishlatasiz.
  • Oxlint'ni va uning turli rejimini (--type-aware) ishga tushirasiz.
  • Tezlikni o'zingiz o'lchab, ko'chish qarorini sabab bilan qabul qilasiz.
  • Oxlint'ni ESLint yonida ishlatish usulini bilasiz.

Oldin bilishingiz kerak: ESLint II: plaginlar, Prettier konfiguratsiyasi, Bundlerlar landshafti 2026.

1. Nega bu kerak?

O'tgan darsda bir yangilikni ko'rdingiz: Vite'ning React shabloni (create-vite 9.2.1) endi ESLint o'rniga Oxlint qo'yadi. Sardor hayron bo'ldi: "ESLint yomonmi? Biz ham o'tishimiz kerakmi?"

Javobni o'lchovdan boshlaymiz. vazifalar da npm run lint bir necha soniya ishlaydi. Bu kichik loyiha — 50 ta fayl. Katta kompaniyada esa minglab fayl bor va lint daqiqalab davom etadi. Har commitdan oldin, har PR'da. Bu vaqt to'planadi.

Muammoning ildizi — til. ESLint va Prettier JavaScript'da yozilgan va Node'da ishlaydi. Bundlerlar landshafti darsida ko'rganingizdek, asboblar dunyosi Rust va Go'ga ko'chmoqda: Rolldown, Oxc, Lightning CSS. Linter va formatlagichlar ham shu yo'lda.

Rust — tez ishlaydigan dastur yozish uchun til (C++ kabi tez, lekin xotira xatolaridan himoyalangan). Uni o'rganish shart emas: siz faqat tayyor dasturni npm orqali olasiz. Oshxonadagi pichoq kabi: qanday quyilganini bilmasdan ham ishlatasiz.

Bugun ikki asbobni ko'ramiz:

Asbob Nima qiladi Kimning o'rnida
Biome 2.5.15 lint + format + import tartibi ESLint + Prettier
Oxlint 1.87.0 faqat lint ESLint

Versiyalar — 2026-10 holatiga. Oxlint — Oxc loyihasining qismi. Oxc'ni Vite 8 transpilyatsiya uchun allaqachon ishlatadi.

flowchart LR
  K["kod"] --> E["ESLint<br/>(JS, plaginlar)"]
  K --> P["Prettier<br/>(JS)"]
  K --> B["Biome<br/>(Rust):<br/>lint + format"]
  K --> O["Oxlint<br/>(Rust):<br/>lint"]
  E --> N["xatolar"]
  B --> N
  O --> N
  P --> F["formatlangan kod"]
  B --> F

Sxemaga qarang: Biome ikki ishni bir o'zi qiladi, Oxlint esa faqat ESLint'ning ishini.

2. Tezlik: o'lchaymiz

2.1 Tajriba

vazifalar nusxasiga ikkala asbobni o'rnatdik (asl loyihaga tegmaymiz):

bash
npm i -D -E @biomejs/biome@2.5.15 oxlint@1.87.0
text

added 4 packages, and audited 148 packages in 14s

59 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

Ikkita paket nomi so'radik, to'rttasi qo'shildi. Qo'shimcha ikkitasi — Windows uchun tayyor yig'ilgan dasturlar: @biomejs/cli-win32-x64 va @oxlint/binding-win32-x64-msvc. Rust dasturi npm'da shunday tarqatiladi: har operatsion tizimga alohida paket. Bu npm buyruqlari chuqur darsidagi UNMET OPTIONAL DEPENDENCY ning o'zi.

Har buyruqni 6 marta ishga tushirdik, birinchisini tashlab, qolgan 5 tasining o'rtanchasini (medianasini) oldik. Kompyuter: Windows 11, 16 oqimli protsessor, Node 24.21.0.

vazifalar: lint vaqti (mediana, 5 marta)
  • ESLint (typed)4 s
  • Oxlint0,77 s
  • Oxlint --type-aware0,94 s
  • Biome lint0,9 s

Manba: O'lchov: vazifalar (16-qism, typed lint qadamidan keyin), ESLint 10.12.0, Oxlint 1.87.0, Biome 2.5.15, Windows 11, Node 24.21.0, 2026-10-10

Formatlash ham:

Buyruq Vaqt (mediana)
prettier --check . 2.68 s
biome format . 0.94 s
node -e 0 (bo'sh Node) 0.26 s

2.2 Raqamlarni to'g'ri o'qish

ESLint'dan Oxlint taxminan 5 baravar, Biome — 4 baravar tez. Prettier'dan Biome formatlagichi — 3 baravar.

Lekin uchta ehtiyot so'z bor:

  • Shovqin. O'lchov paytida kompyuterda boshqa ishlar ham bor edi. Bir seriyada ESLint medianasi 4.0 s, boshqasida 7.3 s chiqdi. Shuning uchun "X marta tez" ni taxminiy deb qabul qiling.
  • Ishga tushish narxi. Bo'sh Node'ning o'zi 0.26 s oladi. Biome'ning o'z hisobi: Checked 56 files in 88ms — qolgan vaqt dasturni ishga tushirishga ketadi. Kichik loyihada asbobning o'zi emas, ishga tushish ustun.
  • Katta loyihada farq kattaroq. Rasmiy saytlarda "50–100 baravar" degan raqamlar bor — ular minglab faylli repolarda o'lchangan. Bizning 50 faylda bunday farq bo'lmaydi va bu normal.

Maslahat: O'zingiz o'lchang. hyperfine dasturi bo'lmasa, oddiy usul: buyruqni 5 marta ishga tushiring, birinchisini tashlang, o'rtadagisini oling. Bitta o'lchovga ishonmang.

Tekshirib ko'ring: Nega Biome "88ms" deydi, biz esa 0.9 s o'lchadik?

Javob

Biome faqat fayllarni tekshirishga ketgan vaqtni sanaydi. Biz esa butun buyruqni o'lchadik: npx ning ishga tushishi, dasturning yuklanishi, sozlamani o'qish. Kichik loyihada bu "qo'shimcha" vaqt asosiy ishdan ko'p.

3. Biome

3.1 biome init va biome.json

bash
npx biome init

Buyruq katta "BIOME" logotipi va keyingi qadamlar ro'yxatini chiqaradi (biz qisqartirdik). Asosiy natija — biome.json:

json
{
	"$schema": "https://biomejs.dev/schemas/2.5.15/schema.json",
	"vcs": {
		"enabled": true,
		"clientKind": "git",
		"useIgnoreFile": true
	},
	"files": {
		"ignoreUnknown": false
	},
	"formatter": {
		"enabled": true,
		"indentStyle": "tab"
	},
	"linter": {
		"enabled": true,
		"rules": {
			"preset": "recommended"
		}
	},
	"javascript": {
		"formatter": {
			"quoteStyle": "double"
		}
	},
	"assist": {
		"enabled": true,
		"actions": {
			"source": {
				"organizeImports": "on"
			}
		}
	}
}

Kalitlarni o'qiymiz:

Kalit Nima qiladi Sukut bo'yicha
$schema muharrirga avtomatik to'ldirish va tekshiruv yo'q
vcs.useIgnoreFile .gitignore dagilarni (node_modules/, dist/) o'tkazib yuboradi false (init true yozadi)
formatter.indentStyle chekinish: tab yoki space tab!
linter.rules.preset qoidalar to'plami recommended
assist…organizeImports importlarni saralash yoqiq

E'tibor bering: Biome sukut bo'yicha tab bilan chekinadi, Prettier esa 2 ta bo'sh joy bilan. Sozlamasiz biome format bizning hamma faylimizni "noto'g'ri" deydi.

3.2 Biome nimani topdi

bash
npx biome lint --reporter=summary .

Jadvalga qarang: chapda qoida nomi (guruh bilan), o'ngda nechta topilma. Oxirgi ikki qator — jami.

text
…
  Rule Name                                               Diagnostics
  
  lint/suspicious/useIterableCallbackReturn               1 (1 error)
  lint/style/noDescendingSpecificity                      1 (1 warning)
  lint/complexity/noImportantStyles                       3 (3 warnings)
  lint/suspicious/noImplicitAnyLet                        6 (6 errors)
  lint/a11y/useSemanticElements                           2 (2 errors)
  lint/a11y/noSvgWithoutTitle                             1 (1 error)
  lint/a11y/useButtonType                                 2 (2 errors)

Checked 56 files in 79ms. No fixes applied.
Found 12 errors.
Found 4 warnings.

Ikki yangilik bor. Birinchisi: Biome .ts dan tashqari index.html, vazifalar.css va hatto SVG ikonkani ham tekshirdi. a11y qoidalari HTML'dan "tugmada type yo'q" kabi qulaylik kamchiliklarini topdi. ESLint buni qilmaydi.

Ikkinchisi — eng ko'p xato, noImplicitAnyLet (6 ta):

text
src\saqlash.ts:29:7 lint/suspicious/noImplicitAnyLet ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  × This variable implicitly has the any type.
  
    28 │ export function yukla(): VazifaMalumoti[] | null {
  > 29 │   let matn;
       │       ^^^^
    30 │   try {
    31 │     matn = localStorage.getItem(SAQLASH_KALITI);

"Bu o'zgaruvchi yashirin any turida". Aslida bunday emas. TypeScript let matn; ning turini keyingi qiymatlardan kuzatib boradi va matn string | null bo'ladi — tsc strict rejimda ham jim. Biome turlarni so'ramaydi: u faqat kod shaklini ko'radi va "tur yozilmagan, qiymat yo'q" degan shaklni xato deb hisoblaydi. Bu — typed linting yo'qligining narxi.

3.3 biome migrate: ESLint va Prettier sozlamasidan

Biome mavjud sozlamani o'zi ko'chira oladi:

bash
npx biome migrate prettier --write
npx biome migrate eslint --write

ESLint ko'chishining hisoboti (boshi):

text
  i 123 ESLint rules found
    - 80 have been migrated to Biome's rules
    - 80% (99) of your ESLint rules are fully covered by Biome
      - 65% (80) via direct migration to Biome rules

"123 ta ESLint qoidasi topildi, 80 tasi ko'chirildi". Ko'chmaganlari ro'yxatining oxirida eng muhimi bor:

text
  i These rules have not yet been implemented:
  
  - no-delete-var
…
  - no-restricted-syntax
…
  - @typescript-eslint/no-unsafe-return
…
  - @typescript-eslint/restrict-template-expressions
…

no-restricted-syntax — bizning XSS qoidamiz: innerHTML = … taqiqi (13-qismdagi himoya). restrict-template-expressions esa o'tgan darsda paket.ts dagi xatoni topgan qoida. Ikkalasi ham Biome'ga ko'chmaydi. Ro'yxatni biz qisqartirdik (…) — jami 24 ta qoida.

3.4 Tuzoq: migratsiya ham xato qilishi mumkin

biome migrate prettier dan keyin biome format . 46 ta faylda farq ko'rsatdi:

text
      2     │ - import·type·{·ApiXatosiKodi,·VazifaMalumoti·}·from·"./turlar.ts";
          2 │ + import·type·{·ApiXatosiKodi,·VazifaMalumoti·}·from·'./turlar.ts'

- — hozirgi qator, + — Biome yozmoqchi bo'lgani. Qo'shtirnoq bittaga, nuqtali vergul esa olib tashlanmoqda! Bizning .prettierrc da faqat { "printWidth": 72 } bor, qolgani Prettier sukutlari (qo'sh qo'shtirnoq, nuqtali vergul). Biome 2.5.15 ko'chirishda yozilmagan maydonlarga "quoteStyle": "single" va "semicolons": "asNeeded" qo'ydi. Buni bo'sh papkada ham takrorladik — natija bir xil.

Qo'lda "double" va "always" ga tuzatgach, faqat 2 fayl farq qildi — uzun union turlarni Biome boshqacha bo'ladi:

text
     79     │ - ··"almashtir"·|·"ochir"·|·"tahrirla"·|·"saqla"·|·"bekor";
         79 │ + ··|·"almashtir"
         80 │ + ··|·"ochir"

Saboq: avtomatik ko'chirishdan keyin natijani tekshiring. biome format . (--write siz) — avval "nima o'zgaradi?" deb ko'rish.

3.5 biome check --write

Kundalik buyruq — biome check: lint, format va import tartibi bittada. --write — tuzatib ham qo'yadi. O'tgan darsdagi order.ts da:

text
src\order.ts:1:1 assist/source/organizeImports  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
src\order.ts format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Checked 1 file in 20ms. No fixes applied.
Found 2 errors.

--write bilan: Checked 1 file in 10ms. Fixed 1 file. Importlar saralandi va kod formatlandi (sukutdagi tab bilan — sozlamani unutmang).

CI uchun alohida buyruq bor — biome ci. U check bilan bir xil tekshiradi, lekin hech qachon faylga yozmaydi va CI muhitiga mos chiqish beradi. Lokalda — check --write, CI'da — ci. Bu Prettier dagi --write va --check juftiga o'xshaydi.

3.6 biome-ignore: sabab majburiy

O'tgan darsdagi eslint-disable ning Biome'dagi o'rinbosari — biome-ignore izohi. Farqi bitta, lekin muhim: sababni yozish majburiy. Sinov fayli:

ts
export function check(x: string): void {
  // biome-ignore lint/suspicious/noDebugger: vaqtinchalik sinov
  debugger;
  // biome-ignore lint/suspicious/noDebugger
  debugger;
  console.log(x);
}

Birinchi izoh ishladi. Ikkinchisiga Biome:

text
a.ts:4:19 suppressions/parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  × Unexpected token, expected one of ':', '(' or whitespace
…
  i A colon is required after the category.
  
  i Example of suppression: // biome-ignore lint: reason

"Qoida nomidan keyin ikki nuqta kerak" — ya'ni : sabab. Sababsiz izoh xato hisoblanadi va debugger ham xato bo'lib qoladi. ESLint'da sabab ixtiyoriy (-- sabab), Biome'da esa majburiy. Kod sharhida "nega o'chirdingiz?" savoli tug'ilmaydi.

ESLint Biome
// eslint-disable-next-line no-debugger -- sabab // biome-ignore lint/suspicious/noDebugger: sabab
qoida nomi — no-debugger qoida nomi — guruh bilan: lint/suspicious/noDebugger
sabab ixtiyoriy sabab majburiy

Biome qoida nomlari camelCase va guruhga bo'lingan: correctness (aniq xato), suspicious (shubhali), style, complexity, a11y, performance, security. Guruh nomi qoidaning "og'irligini" bildiradi.

Tekshirib ko'ring: Jamoa Biome'ga o'tdi va npm run lint dagi eslint . ni biome check . ga almashtirdi. .prettierrc va eslint.config.js ni o'chirsa bo'ladimi?

Javob

Faqat Biome ularning ishini to'liq bajarsagina. Bizda — yo'q: XSS qoidasi va turli qoidalar ko'chmadi. O'chirsak, innerHTML = … yozilgan kod tekshiruvdan jim o'tadi. Avval "nima yo'qoladi?" ro'yxatini (biome migrate hisoboti) o'qing, keyin qaror qiling.

4. Oxlint

4.1 Sozlamasiz ishga tushirish

bash
npx oxlint

vazifalar da buyruq jim tugaydi (chiqish yo'q, chiqish kodi 0) — bu muvaffaqiyat belgisi. Necha fayl va qoida tekshirilganini JSON format ko'rsatadi:

bash
npx oxlint -f json
text
{ "diagnostics": [],
              "number_of_files": 50,
              "number_of_rules": 96,
              "threads_count": 16,
              "start_time": 0.0350785
            }

50 ta fayl, 96 ta qoida, 16 oqim — Oxlint fayllarni parallel tekshiradi. Sozlamasiz u faqat correctness (aniq xatolar) toifasini yoqadi.

4.2 Tuzoq: .gitignore siz

Oxlint ham .gitignore ga qaraydi. O'tgan darsdagi mashq loyihasida .gitignore yo'q edi — Oxlint node_modules ni ham tekshirdi:

text
node_modules/path-exists/index.js:11:11: warning eslint(no-unused-vars): Catch parameter '_' is caught but never used. help: Consider handling this error.
node_modules/@types/node/vm.d.ts:152:29: warning typescript(no-wrapper-object-types): Do not use wrapper object types. help: Replace `Object` with `object`.
…

3 250 qator begona ogohlantirish. Bitta qator — node_modules/ — yozilgan .gitignore qo'shilgach, chiqish bo'sh. Har yangi loyihaning birinchi fayllaridan biri .gitignore bo'lishining yana bir sababi (.gitignore).

4.3 --type-aware: TypeScript 7 bilan turli lint

Oxlint'ning eng qiziq imkoniyati — turli qoidalar. Ular uchun alohida paket kerak:

bash
npm i -D -E oxlint-tsgolint@7.0.2004
npx oxlint --type-aware

oxlint-tsgolint ning tavsifi: "typescript-go asosidagi turli TypeScript linter". typescript-go — 15-qismdagi TypeScript 7 (tsgo). Ya'ni typescript-eslint TS 6 API'sini kutib turgan paytda, Oxlint turlarni TypeScript 7 dan oladi. Mashq loyihasida:

text
src/order.ts:10:23: warning typescript(restrict-template-expressions): Invalid type used in template literal expression.
src/order.ts:14:23: warning typescript(await-thenable): Unexpected `await` of a non-Promise (non-"Thenable") value. help: Remove `await` if the value is synchronous, or change the expression to return a Promise or Thenable before awaiting it.
src/order.ts:15:3: warning typescript(no-floating-promises): Promises must be awaited, add void operator to ignore. help: The promise must end with a call to .catch, or end with a call to .then with a rejection handler, or be explicitly marked as ignored with the `void` operator.

ESLint topgan uchta turli xatoning uchalasi! Faqat ular warning — chiqish kodi 0. vazifalar da esa --type-aware paket.ts:130:18 dagi xatoni ham topdi va tekshiruv/ papkasida yana beshta joyni ko'rsatdi. Bizning ESLint sozlamamiz turli qoidalarni faqat src/ ga qo'llaydi, Oxlint esa hamma faylga. Vaqti — 0.94 s.

Diqqat: Oxlint ogohlantirishda chiqish kodi 0 beradi. CI'da to'xtatish uchun --deny-warnings bayrog'i yoki .oxlintrc.json da qoidaga "error" darajasi kerak. Aks holda CI "yashil" bo'lib qolaveradi.

4.4 @oxlint/migrate va XSS sinovi

ESLint sozlamasidan .oxlintrc.json yasaydigan rasmiy vosita bor:

bash
npx @oxlint/migrate@1.87.0

U 100 dan ortiq qoidali .oxlintrc.json yozdi va 8 ta ogohlantirish berdi (ichma-ich files naqshlari qo'llanmaydi). Endi asosiy sinov — XSS qoidasi ishlaydimi? Vaqtinchalik faylga atayin xavfli qator yozdik:

ts
document.body.innerHTML = location.hash;

ESLint:

text
  1:1  error  XSS: innerHTML/outerHTML o'rniga textContent yoki createElement  no-restricted-syntax

✖ 1 problem (1 error, 0 warnings)

Oxlint — jim, chiqish kodi 0. Biome — jim. no-restricted-syntax ESLint'ning maxsus qoidasi: u kodni AST selektori bilan qidiradi (AssignmentExpression > MemberExpression…). Biome'da u hali yo'q, Oxlint'ga esa ko'chmadi. Bu — eng xavfli holat: tekshiruv bor, lekin u hech narsa topmaydi.

5. Yonma-yon ishlatish

5.1 G'oya

Ko'p jamoa tanlov qilmaydi — ikkalasini birga ishlatadi:

  1. Oxlint birinchi — tez, oddiy xatolarni bir soniyada topadi.
  2. ESLint keyin — faqat Oxlint'da yo'q qoidalar: turli to'plamlar, maxsus selektorlar, kam uchraydigan plaginlar.

Ikkalasi bitta xatoni ikki marta aytmasligi uchun eslint-plugin-oxlint (1.87.0) bor. U ESLint'da Oxlint qamraydigan qoidalarni o'chiradi. Uning flat/recommended to'plami 249 ta qoidani o'chiradi. Sozlamaning oxiriga qo'shiladi:

js
import oxlint from "eslint-plugin-oxlint";

export default defineConfig([
  // ... avvalgi bloklar
  // Oxlint qiladigan ishni ESLint qilmasin — oxirida
  ...oxlint.configs["flat/recommended"],
]);

package.json da: "lint": "oxlint && eslint .". Oxlint xato topsa, && zanjirni to'xtatadi va sekin ESLint ishga tushmaydi (scripts chuqur).

5.2 Qachon nima

Vaziyat Tanlov
yangi kichik loyiha, maxsus qoida yo'q Biome (bitta asbob) yoki Oxlint + Prettier
katta loyiha, lint sekin Oxlint + ESLint yonma-yon
maxsus selektor qoidalar, kam plaginlar ESLint
React, Vite shabloni Oxlint (shablonning o'zi)

5.3 vazifalar qarori

vazifalar ESLint va Prettier'da qoladi. Sabablar o'lchovdan:

  • XSS qoidasi (no-restricted-syntax) — Biome'da ham, Oxlint'da ham yo'q.
  • Biome'ning noImplicitAnyLet — turlarni bilmagani uchun 6 ta noto'g'ri xato.
  • Tezlik farqi — 3 soniya. 50 faylli loyihada bu muammo emas.

Bu dars vazifalar ni o'zgartirmaydi. Loyiha o'ssa yoki Oxlint XSS qoidasini qo'llay boshlasa — qaror qayta ko'riladi.

Tekshirib ko'ring: "lint": "oxlint && eslint ." o'rniga "lint": "eslint . && oxlint" yozilsa, nima o'zgaradi?

Javob

Natija (xato bor-yo'qligi) bir xil. Lekin tezkor qayta aloqa yo'qoladi: Oxlint topadigan oddiy xato bo'lsa ham, avval sekin ESLint to'liq ishlaydi. Tez asbob oldinda tursa, ko'p xatolar bir soniyada topiladi.

6. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
Biome hamma faylni formatlamoqchi sukut indentStyle: "tab" biome migrate prettier yoki "space"
migratsiyadan keyin qo'shtirnoq/nuqtali vergul o'zgardi Biome 2.5.15 ko'chirish xatosi quoteStyle, semicolons ni qo'lda
Oxlint minglab ogohlantirish .gitignore yo'q, node_modules tekshirildi .gitignore
CI xato bor, lekin yashil Oxlint warning — chiqish kodi 0 --deny-warnings

Yana biri — eng xavflisi: ko'chishdan keyin qoida jim yo'qolishi. biome migrate va @oxlint/migrate hisobotidagi "not implemented" ro'yxatini doim o'qing va muhim qoidalarni vaqtinchalik xatoli fayl bilan sinang.

7. Mashqlar

Mashqlar o'tgan darsdagi kurs/mashqlar/16/38-eslint-plaginlar/ loyihasining boshlang'ich nusxasida (4 ta xatoli order.ts). Uni kurs/mashqlar/16/39-biome-oxlint/ ga nusxalang va npm ci, so'ng npm i -D -E oxlint@1.87.0 oxlint-tsgolint@7.0.2004 @biomejs/biome@2.5.15.

1-mashq (oson): .gitignore tuzog'i

  1. .gitignore siz npx oxlint | wc -l — nechta qator? (wc -l — qatorlarni sanaydi.)
  2. node_modules/ yozilgan .gitignore qo'shib, takrorlang.
Yechim
  1. Bizda 3 250 qator — hammasi node_modules ichidagi fayllar haqida. Sizda paket versiyalari bir xil bo'lsa, raqam ham yaqin chiqadi.
  2. npx oxlint — chiqish yo'q, chiqish kodi 0. Oxlint (sozlamasiz) order.ts dagi xatolarni ko'rmaydi: ular turli yoki import tartibi xatolari, correctness toifasida esa ular yo'q.

2-mashq (o'rta): turli rejim

npx oxlint --type-aware ni ishga tushiring. ESLint topgan 4 xatodan qaysilari chiqdi, qaysisi yo'q va nega?

Yechim
bash
npx oxlint --type-aware
text
src/order.ts:10:23: warning typescript(restrict-template-expressions): Invalid type used in template literal expression.
src/order.ts:14:23: warning typescript(await-thenable): Unexpected `await` of a non-Promise (non-"Thenable") value. help: Remove `await` if the value is synchronous, or change the expression to return a Promise or Thenable before awaiting it.
src/order.ts:15:3: warning typescript(no-floating-promises): Promises must be awaited, add void operator to ignore. help: The promise must end with a call to .catch, or end with a call to .then with a rejection handler, or be explicitly marked as ignored with the `void` operator.

Uchta turli xato topildi. Import tartibi (simple-import-sort) — yo'q: bu ESLint plaginining qoidasi, Oxlint'da yoqilmagan. Darajasi warning — chiqish kodi 0.

3-mashq (o'rta): biome check --write

git init, npx biome init, keyin npx biome check src/order.ts va npx biome check --write src/order.ts. Nechta xato bor edi va --write nimani o'zgartirdi? Faylning chekinishi qanday bo'ldi?

Yechim

Birinchi buyruq: Found 2 errors. — import tartibi (assist/source/organizeImports, FIXABLE) va format. --write bilan: Checked 1 file in 10ms. Fixed 1 file. Importlar saralandi, lekin Prettier'dagidek bo'sh qator bilan guruhlanmadi. Chekinish — tab: biome init sukuti. Prettier uslubida qolish uchun biome.json da "indentStyle": "space".

4-mashq (qiyin): XSS qoidasi uch asbobda

eslint.config.js dagi rules ga qo'shing:

js
"no-restricted-syntax": ["error", {
  selector:
    "AssignmentExpression > " +
    "MemberExpression.left[property.name='innerHTML']",
  message: "XSS: textContent ishlating.",
}],

src/show.ts:

ts
export function show(text: string): void {
  document.body.innerHTML = text;
}

Uch asbobni ishga tushiring: npx eslint src/show.ts, npx oxlint src/show.ts, npx biome lint src/show.ts. Qaysi biri ushladi? Bu mashqdan qanday qoida chiqadi?

Yechim
text

D:\kurs\mashqlar\16\39-biome-oxlint\src\show.ts
  2:3  error  XSS: textContent ishlating  no-restricted-syntax

✖ 1 problem (1 error, 0 warnings)

Faqat ESLint (chiqish kodi 1). Oxlint — jim, chiqish kodi 0. Biome — Checked 1 file in 7ms. No fixes applied., xato yo'q. Qoida: asbob almashtirganda muhim qoidalarni ataylab xatoli fayl bilan sinang. "Tekshiruv yashil" — "xavf yo'q" degani emas, ehtimol tekshiruvchining o'zi bu xatoni bilmaydi.

8. Real ishda

  • Vite React shabloni — Oxlint; Next.js shabloni — ESLint 9. 17- va 23-qismlarda ikkalasini ham uchratamiz.
  • Katta repolarda Oxlint + ESLint yonma-yon keng tarqalgan: lint vaqti daqiqalardan soniyalarga tushadi, ESLint esa faqat qolgan qoidalarni bajaradi.
  • Biome — yangi loyihalarda ommalashmoqda: bitta biome.json, bitta buyruq, bitta muharrir kengaytmasi.
  • Intervyu: "Biome va ESLint farqi?", "Rust asboblari nimani qila olmaydi?", "lint'ni qanday tezlashtirasiz?" — o'lchov bilan javob bersangiz, alohida ajralib turasiz.

Xulosa

  • Biome — lint + format + import tartibi (biome check --write); Oxlint — faqat lint; ikkalasi Rust'da.
  • vazifalar da: Oxlint 0.77 s, Biome 0.90 s, ESLint 4.0 s (mediana); formatlash: Biome 0.94 s, Prettier 2.68 s. Kichik loyihada ishga tushish narxi ustun.
  • Biome turlarni bilmaydi (noImplicitAnyLet — noto'g'ri xato); Oxlint --type-aware (tsgolint, TypeScript 7) turli xatolarni topadi, lekin warning bilan.
  • biome migrate va @oxlint/migrate — tez boshlanish, lekin natijani tekshiring: qo'shtirnoq almashdi, XSS qoidasi jim yo'qoldi.
  • Yonma-yon: oxlint && eslint . + eslint-plugin-oxlint.

Keyingi dars: Conventional Commits va commitlint — commit xabarlarini mashina o'qiy oladigan shaklda yozish va buni commitlint bilan tekshirish; nega bizda subject-case qoidasi o'chirilgan.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Biome va Oxlint: ESLint va Prettier'ning Rust'dagi tez muqobillari — IlmHamroh