Mundarija (23)
- Bu darsda
- 1. Nega bu kerak?
- 2. Native API yetarlimi?
- 2.1 e18e ro'yxati
- 2.2 Node 24 da sinab ko'ramiz
- 3. Paket kartasi
- 3.1 npm view — besh maydon
- 3.2 Turlar: o'zida yoki @types
- 3.3 Yuklashlar, faollik va litsenziya
- 4. Hajm: reklamadagi raqam va sizning raqamingiz
- 4.1 bundlephobia
- 4.2 O'z o'lchovimiz: to'rt variant
- 4.3 Tuzoq: import { z }
- 4.4 Qism oxiridagi o'lchov: Vite bilan
- 4.5 Qaror
- 5. Ko'p uchraydigan xatolar
- 6. Mashqlar
- 1-mashq (oson): chalk kerakmi?
- 2-mashq (o'rta): O'lchovni takrorlang
- 3-mashq (qiyin): Paket baholovchi
- 7. Real ishda
- Xulosa
- Manbalar
Paket tanlash va baholash: native API, npm view, hajm o'lchovi va Zod qarori
Qisqacha: Har
npm idan oldin besh savol beriladi. Node yoki brauzerning o'zida bu bormi (native API)? Paket tirikmi — oxirgi o'zgarish, eskirgan (deprecated) belgisi? Litsenziyasi, turlari (TypeScript) va ESM qo'llovi qanday? O'zi qancha bog'liqlik olib keladi? Brauzerga qancha kod qo'shadi — reklamadagi emas, sizning ishlatishingizda o'lchangan raqam? Bu darsda shu savollar bilan Zod, Valibot va qo'lda yozilgan tekshiruvni solishtiramiz va 15-qismdagi qarorni yangilaymiz.
Bu darsda
- "Native API yetarlimi?" savoliga e18e ro'yxati va Node 24 bilan javob topasiz.
npm viewva registr API'si bilan paket kartasini o'qiysiz: litsenziya, turlar, ESM, bog'liqliklar, yangilanish, yuklashlar.- bundlephobia raqami va sizning haqiqiy o'lchovingiz nega farq qilishini ko'rasiz.
- Zod,
zod/mini, Valibot va qo'lda yozilgan tekshiruvni esbuild bilan o'lchaysiz vaimport { z }tuzog'ini topasiz. - Paketni baholaydigan kichik skript yozasiz.
Oldin bilishingiz kerak: Zod va turni sxemadan chiqarish, npm buyruqlari chuqur, Semver, package.json IV: kirish nuqtalari.
1. Nega bu kerak?
15-qismda Zod darsida qaror qilgan edik: vazifalar da qo'lda yozilgan tekshiruv qoladi, Zod esa "bundler bilan qayta ko'rib chiqiladi". Bugun shu va'dani bajaramiz. Lekin avval kengroq savol: istalgan paketni qanday tanlash kerak?
Har npm i — loyihangizga begona kod, begona muallif va begona xatolar. Bog'liqlik turlari darsida bitta paket 95 ta bog'liqlik olib kelganini ko'rgansiz. Keyingi darsda (Ta'minot zanjiri) esa ularning har biri hujum eshigi bo'lishi mumkinligini ko'rasiz. Shuning uchun professional dasturchi npm i dan oldin besh daqiqa tekshiradi.
flowchart TD
A["Menga X kerak"] --> B{"Node/brauzerda<br/>bormi?"}
B -- "ha" --> N["native API — paket yo'q"]
B -- "yo'q" --> C{"20 qatorda<br/>yoza olamanmi?"}
C -- "ha" --> Q["o'zim yozaman + test"]
C -- "yo'q" --> D["nomzodlar: npm view,<br/>yuklashlar, litsenziya"]
D --> E["o'z loyihamda o'lchayman"]
E --> F["qaror + sababi yoziladi"]Maslahat: Raqamlar 2026-10-10 da olingan: Node 24.21.0, npm 11.19.0, esbuild 0.28.2, zod 4.6.5, valibot 1.5.0. Yuklashlar va sanalar siz o'qiyotgan kuni boshqacha bo'ladi — usul o'zgarmaydi.
2. Native API yetarlimi?
2.1 e18e ro'yxati
Ko'p mashhur paketlar Node yoki brauzerda hali yo'q bo'lgan imkoniyatlarni to'ldirish uchun yozilgan. Keyin platforma o'sdi, paketlar esa qoldi. e18e ("ecosystem performance" — ekotizim samaradorligi) — shunday paketlarni yengilroq muqobillar bilan almashtirishga intilayotgan jamoa. Uning module-replacements paketi (3.4.0) — "qaysi paket o'rniga nima" ro'yxati. Undan haqiqiy yozuvlar:
| Paket | e18e tavsiyasi | Haftalik yuklash* |
|---|---|---|
uuid |
crypto.randomUUID |
296 281 996 |
chalk |
util.styleText, picocolors, ansis |
491 503 097 |
node-fetch |
fetch, ofetch, ky |
— |
rimraf |
fs.promises.rm |
— |
| Paket | e18e tavsiyasi | Haftalik yuklash* |
|---|---|---|
object.groupby |
Object.groupBy |
— |
lodash.clonedeep |
es-toolkit va boshqalar |
— |
is-number |
bir qatorli kod ("snippet") | 175 800 124 |
* api.npmjs.org/downloads/point/last-week/<nom>, 2026-10-02 — 2026-10-08.
is-number — bitta funksiyali paket, oxirgi o'zgarishi 2023-05-26 da, lekin haftasiga 175 million marta yuklanadi. Bu yuklashlarning aksariyati — boshqa paketlar orqali, hech kim uni ataylab tanlamagan.
2.2 Node 24 da sinab ko'ramiz
// Paketsiz: uuid, chalk, lodash.clonedeep, object.groupby o'rniga
import { styleText } from "node:util";
console.log(styleText("green", "Osh tayyor")); // Osh tayyor
console.log(crypto.randomUUID().length); // 36
const order = { dish: "osh", price: 35000, extra: { bread: true } };
const copy = structuredClone(order);
copy.extra.bread = false;
console.log(order.extra.bread); // true
const menu = [
{ name: "osh", kind: "taom" },
{ name: "manti", kind: "taom" },
{ name: "ko'k choy", kind: "ichimlik" },
];
console.log(Object.keys(Object.groupBy(menu, (m) => m.kind)));
// [ 'taom', 'ichimlik' ]To'rt paket — nol bog'liqlik. styleText terminalda yashil rang beradi (chiqish faylga yo'naltirilsa, rang kodlari tashlanadi — shuning uchun // Osh tayyor). structuredClone chuqur nusxa oldi: nusxani o'zgartirish asl obyektga tegmadi. Bu imkoniyatlarning hammasi Chrome 154 da ham bor (styleText dan tashqari — u faqat Node'da).
Qoida: paket qidirishdan oldin MDN va Node hujjatida bir daqiqa izlang. scripts darsida rimraf va cross-env o'rniga node -e va --env-file ni ishlatganimiz ham shu qoida.
Tekshirib ko'ring: Malika telefon raqamini tekshirish uchun
is-numbero'rnatmoqchi. Siz nima taklif qilasiz?
Javob
Paket shart emas: telefon raqami — raqam emas, matn (+998 90 000 00 00). Unga oddiy RegExp kerak (RegExp asoslari): /^\+998 \d{2} \d{3} \d{2} \d{2}$/. Raqam tekshirish kerak bo'lsa ham — Number.isFinite(x) bir qatorda. e18e ro'yxati ham is-number uchun "snippet" — bir qatorli kodni tavsiya qiladi.
3. Paket kartasi
3.1 npm view — besh maydon
Nomzodlar: Zod va Valibot. npm buyruqlari darsidagi npm view bilan:
npm view zod@4.6.5 license type types dependencies \
dist.unpackedSize --json{
"license": "MIT",
"type": "module",
"types": "./index.d.cts",
"dist.unpackedSize": 6140311
}npm view valibot@1.5.0 license type types dependencies \
dist.unpackedSize --json{
"license": "MIT",
"type": "module",
"types": "./dist/index.d.mts",
"dist.unpackedSize": 1865457
}| Savol | Zod 4.6.5 | Valibot 1.5.0 |
|---|---|---|
| litsenziya | MIT | MIT |
| ESM | ha (type: module) |
ha |
| o'z turlari | bor | bor |
| bog'liqliklar | 0 (maydon chiqmadi) | 0 |
| Savol | Zod 4.6.5 | Valibot 1.5.0 |
|---|---|---|
| ochilgandagi hajm | 6.1 MB | 1.9 MB |
oxirgi o'zgarish (time.modified) |
2026-10-02 | 2026-09-09 |
| haftalik yuklash | 325 977 043 | 21 776 996 |
Ikkalasi ham "yashil": ochiq litsenziya, turlari ichida, bog'liqliksiz, yaqinda yangilangan. dependencies so'ralgan, lekin javobda yo'q — demak bog'liqlik nol.
unpackedSize — diskdagi hajm, brauzerga boradigan hajm emas: unda TypeScript turlari, manba kodi, CommonJS nusxasi, tillar bor. Zod'ning 6 MB i sizni qo'rqitmasin — bundler faqat kerakli qismini oladi. Qancha — buni «Hajm» bo'limida o'lchaymiz.
3.2 Turlar: o'zida yoki @types
npm view lodash version types
npm view @types/lodash version4.18.1
4.17.26lodash da types maydoni chiqmadi — turlar paketning o'zida yo'q, ular alohida DefinitelyTyped loyihasida (@types/lodash) (Declaration fayllari). Versiyalar ham farq qiladi: 4.18.1 va 4.17.26 — turlar kutubxonadan orqada qolishi mumkin. O'z turlari bor paket — yaxshiroq belgi.
3.3 Yuklashlar, faollik va litsenziya
- Haftalik yuklashlar — npmjs.com sahifasida yoki
api.npmjs.org/downloads/point/last-week/<nom>. Ko'p yuklash — "ko'p odam ishlatadi va xatolar tez topiladi", lekinis-numbermisoli ko'rsatdiki, "ko'p odam o'zi tanlagan" degani emas. Solishtirish uchun npmtrends.com — bir nechta paket grafigi bitta sahifada. - Faollik — GitHub sahifasi: oxirgi commit, ochiq issue va PR'lar, javob tezligi, relizlar. Biz GitHub API'dan raqamlarni ololmadik (so'rov
403qaytardi — kalitsiz so'rovlar chegarasi), shuning uchun sahifani ko'z bilan ko'ring.npm view <nom> time.modifiedvanpm view <nom> deprecated— terminaldagi o'rinbosar. - Litsenziya (pasport darsi): MIT, ISC, Apache-2.0, BSD — erkin. GPL — o'zgartirilgan kodni ham ochishni talab qiladi; yopiq tijorat loyihasida ko'p kompaniyalar uni taqiqlaydi.
UNLICENSEDyoki maydon yo'q — ishlatmang. - ESM (pasport darsi): faqat CommonJS paket bundler'da yomonroq tree shaking qilinadi va ESM loyihada tuzoq beradi.
Tekshirib ko'ring: Paket haftasiga 20 million yuklanadi, lekin
npm viewdadeprecated = 'Use X instead'va oxirgi o'zgarish 2021-yil. Tanlaysizmi?
Javob
Yo'q. Yuklashlar eski loyihalar va tranzitiv bog'liqliklardan keladi. deprecated — muallifning o'zi "endi ishlatmang" degani: xatolar va xavfsizlik teshiklari tuzatilmaydi. Muallif tavsiya qilgan X ni tekshiring.
4. Hajm: reklamadagi raqam va sizning raqamingiz
4.1 bundlephobia
bundlephobia.com paketni yig'ib, hajmini ko'rsatadi. Uning API'si ham bor:
curl -s "https://bundlephobia.com/api/size?package=valibot@1.5.0"{"name":"valibot","version":"1.5.0","size":84771,"gzip":14713,"assets":[{"gzip":14713,"name":"main","size":84771,"type":"js"}],"dependencyCount":0,…}Valibot — 14.4 KB gzip, Zod 4.6.5 — 86.5 KB gzip ("gzip":88626). Bu — paket butunligicha import qilinganda. Siz esa bitta sxema yozasiz. Haqiqiy narxni faqat o'z kodingiz bilan o'lchash mumkin. pkg-size.dev — shunga o'xshash sayt, u diskdagi o'rnatish hajmini ham ko'rsatadi.
4.2 O'z o'lchovimiz: to'rt variant
vazifalar dagi vazifa tekshiruvi: id — butun son ≥ 1, matn — bo'sh emas va ≤ 100 belgi, bajarildi — boolean. kurs/mashqlar/16/15-tanlash/ da shu tekshiruvni to'rt xil yozdik va har birini bitta to'g'ri, bitta buzuq vazifada sinadik. Qo'lda:
// qolda.js — kutubxonasiz, qo'lda yozilgan tekshiruv
import { samples } from "./namuna.js";
function isTask(v) {
return (
Number.isInteger(v.id) && v.id >= 1 &&
typeof v.matn === "string" && v.matn.length > 0 &&
v.matn.length <= 100 && typeof v.bajarildi === "boolean"
);
}
for (const s of samples) console.log("qo'lda:", isTask(s));Valibot:
// valibot.js — Valibot sxemasi
import * as v from "valibot";
import { samples } from "./namuna.js";
const Task = v.object({
id: v.pipe(v.number(), v.integer(), v.minValue(1)),
matn: v.pipe(v.string(), v.minLength(1), v.maxLength(100)),
bajarildi: v.boolean(),
});
for (const s of samples) console.log("valibot:", v.is(Task, s));Zod (zod/mini varianti ham shunday, faqat z.int().check(z.minimum(1)) uslubida):
// zod.js — to'liq Zod: zanjirli metodlar
import * as z from "zod";
import { samples } from "./namuna.js";
z.config({ jitless: true });
const Task = z.object({
id: z.number().int().min(1),
matn: z.string().min(1).max(100),
bajarildi: z.boolean(),
});
for (const s of samples) {
console.log("zod:", Task.safeParse(s).success);
}jitless: true — Zod darsidagi Trusted Types topilmasi: vazifalar ning CSP'si new Function ni taqiqlaydi. O'lchov skripti har variantni esbuild bilan yig'adi va gzip hajmini hisoblaydi:
// olcha.mjs — har variantni esbuild bilan yig'ib, hajmini o'lchaydi
import { build } from "esbuild";
import { readFileSync } from "node:fs";
import { gzipSync } from "node:zlib";
const variants = ["qolda", "valibot", "zodmini", "zod"];
const kb = (bytes) => (bytes / 1024).toFixed(2);
for (const name of variants) {
const outfile = `dist/${name}.js`;
await build({
entryPoints: [`src/${name}.js`],
bundle: true,
minify: true,
format: "esm",
platform: "browser",
outfile,
});
const code = readFileSync(outfile);
const gzip = gzipSync(code, { level: 9 }).length;
const label = name.padEnd(8);
console.log(`${label} ${kb(code.length)} KB, gzip ${kb(gzip)} KB`);
}node olcha.mjsqolda 0.27 KB, gzip 0.21 KB
valibot 4.29 KB, gzip 1.51 KB
zodmini 16.21 KB, gzip 5.57 KB
zod 87.84 KB, gzip 25.58 KBHajm aniq (har safar bir xil). To'rttala yig'ilgan fayl Node'da ishga tushirildi va bir xil javob berdi: true, false.
- Qo'lda yozilgan0,21 KB
- Valibot 1.5.01,51 KB
- zod/mini 4.6.55,57 KB
- Zod 4.6.525,58 KB
Manba: O'lchov: esbuild 0.28.2 --bundle --minify, gzip -9, bitta vazifa sxemasi, 2026-10-10
4.3 Tuzoq: import { z }
Zod hujjatidagi eng ko'p uchraydigan yozuv — import { z } from "zod". Shu bilan qayta yig'sak:
zod 442.64 KB, gzip 90.58 KB3.5 baravar katta! Sababi Zod'ning o'z manba kodida, index.js dagi izohda yozilgan. Rollup va webpack { z } ni bo'laklarga ajrata oladi, aks holda "har bir til (locale) ham tortiladi". esbuild 0.28.2 esa buni qilmadi va hamma tillarni olib keldi. import * as z from "zod" bilan esa — 25.58 KB.
15-qismdagi o'lchovni eslang: o'sha yerda Zod import { z } bilan esbuild'da 92.1 KB gzip chiqqan edi, import * as z bilan esa taxminan 26 KB. Sabab — import shakli va bundler. Bir qator import 65 KB farq qiladi. Saboq: o'lchovni o'z bundleringiz va o'z yozuvingiz bilan qiling.
4.4 Qism oxiridagi o'lchov: Vite bilan
Qism oxirida vazifalar Vite'da yig'iladi (Vite I). Kanon loyihasida tekshiruvni har kutubxona bilan almashtirib, butun ilovani yig'dik va brauzer testlarini yuritdik:
| Variant | Ilova JS (gzip) | Farq | Testlar |
|---|---|---|---|
| qo'lda (kanon) | 9.51 KB | — | 146/146 |
| Valibot 1.5.0 | 10.85 KB | +1.34 KB (+14 %) | 144/146 |
| zod/mini 4.6.5 | 15.03 KB | +5.52 KB (+58 %) | 144/146 |
| Zod 4.6.5 | 33.22 KB | +23.71 KB (+249 %) | 144/146 |
Ikki xulosa jadvalda yo'q, lekin muhim:
- 2 ta test yiqildi — har kutubxonada. Ular xato xabarini tekshiradi: bizniki — "bajarildi true yoki false emas.", kutubxonaniki —
Invalid type: Expected boolean…. O'zbekcha, har maydonga alohida xabar uchun sxema uzayadi. - Zod
jitlesssiz — 157/159 brauzer tekshiruvi: konsolda 23 martaThis document requires 'TrustedScript' assignmentva CSP buzilishi. Xavfsizlik siyosati bilan kelishuv — narxning bir qismi.
4.5 Qaror
Biz qaror qildik: vazifalar da qo'lda yozilgan tekshiruv qoladi — bundler bilan ham.
| Mezon | Qo'lda | Eng arzon kutubxona (Valibot) |
|---|---|---|
| brauzerga qo'shimcha kod | 0 | +1.34 KB (+14 %) |
| yangi bog'liqlik | yo'q | 1 ta (yangilash, xavfsizlik kuzatuvi) |
| o'zbekcha xabarlar | bor | har maydonga yozish kerak |
| sxemalar soni | 1 ta, 3 maydon | — |
Uch maydonli bitta tekshiruv uchun kutubxona o'zini oqlamaydi. Agar loyihada o'nlab formalar va API javoblari bo'lsa (masalan, serverda), hisob o'zgaradi: sxema kutubxonasi kodni qisqartiradi va turlarni beradi. Zod serverda — 25-qismda, o'sha yerda hajm muhim emas. Qarorning sababi TEXNIK-QARZ.md ga yoziladi: "sxemalar ko'paysa — qayta ko'rib chiqilsin".
Tekshirib ko'ring: Jasur aka: "Valibot atigi 1.34 KB, nega olmaysan?". Sardor qanday javob beradi?
Javob
Hajm — narxning faqat bir qismi. Yana: yangi bog'liqlik (yangilash va xavfsizlik kuzatuvi), xato xabarlarini qayta yozish (2 test yiqildi), jamoa uchun yana bir API. Foyda esa — bitta 3 maydonli tekshiruvni qisqartirish. Sxemalar ko'paysa — Valibot birinchi nomzod, chunki eng arzoni.
5. Ko'p uchraydigan xatolar
| Xato | Nega yomon | To'g'risi |
|---|---|---|
| "eng ko'p yuklangan — eng yaxshi" | yuklashlar tranzitiv va eski loyihalardan | faollik va mosligini tekshiring |
| bundlephobia raqamiga ishonish | butun paket, sizning ishlatishingiz emas | o'z bundleringizda o'lchang |
unpackedSize ni brauzer hajmi deb o'ylash |
turlar, manba, tillar ham ichida | yig'ilgan fayl hajmi |
import { z } va esbuild |
hamma tillar tortiladi | import * as z |
| Xato | Nega yomon | To'g'risi |
|---|---|---|
deprecated ni ko'rmaslik |
tuzatishlar yo'q | npm view nom deprecated |
| GPL'ni yopiq loyihaga qo'shish | huquqiy xavf | litsenziyani birinchi tekshiring |
| native API'ni tekshirmaslik | ortiqcha bog'liqlik | MDN, Node hujjati, e18e |
6. Mashqlar
Mashqlar kurs/mashqlar/16/15-tanlash/ da.
1-mashq (oson): chalk kerakmi?
npm view chalk va npm view picocolors kartalarini solishtiring va Node 24 dagi util.styleText bilan uchinchi variantni sinang. Javob bering:
npm view picocolors dependencies— bog'liqliklar soni:npm view chalk type(eng yangi versiya):- terminal rangli matn uchun paket shartmi?
Yechim
picocolors — bog'liqliksiz va CommonJS (type yo'q), chalk 5+ — faqat ESM (pasport darsidagi tuzoq). Node 24 da util.styleText("green", "matn") paketsiz ishlaydi. e18e ro'yxati ham chalk o'rniga birinchi bo'lib util.styleText ni tavsiya qiladi. Brauzerda esa bunday ehtiyoj yo'q — rang CSS bilan beriladi.
2-mashq (o'rta): O'lchovni takrorlang
15-tanlash/ da npm i -E zod@4.6.5 valibot@1.5.0 va npm i -D -E esbuild@0.28.2. To'rt variantni (src/qolda.js, valibot.js, zodmini.js, zod.js, umumiy namuna.js) va olcha.mjs ni darsdagidek yozing. Keyin zod.js da importni import { z } from "zod" ga o'zgartirib, qayta o'lchang.
node olcha.mjsdagi Valibot gzip:import { z }bilan Zod gzip:
Yechim
namuna.js:
// namuna.js — tekshiriladigan ikki vazifa: biri to'g'ri, biri buzuq
export const samples = [
{ id: 1, matn: "Osh uchun guruch olish", bajarildi: false },
{ id: 0, matn: "", bajarildi: "ha" },
];Qolgan fayllar — darsdagidek. npm i -D esbuild da npm 11.19.0 ogohlantiradi: npm warn install-scripts 1 package has install scripts not yet covered by allowScripts — esbuild'ning postinstall i (pnpm darsidagi allowBuilds ning npm'dagi o'xshashi, keyingi dars). node olcha.mjs — «O'z o'lchovimiz» bo'limidagi to'rt qator. import { z } bilan — zod 442.64 KB, gzip 90.58 KB. Har yig'ilgan faylni node dist/<nom>.js bilan ishga tushirib, true/false chiqishini tekshiring: o'lchangan kod ishlashi ham kerak.
3-mashq (qiyin): Paket baholovchi
baho/baho.mjs da evaluate(meta, now) yozing: npm view <paket> --json obyektidan [nom, qiymat, ok] qatorlari:
- litsenziya — ochiq ro'yxatda (MIT, ISC, Apache-2.0, BSD-2-Clause, BSD-3-Clause, 0BSD)mi;
- o'z turlari —
types/typingsyokiexportsichida"types"; - ESM —
type: "module"; - bog'liqliklar — 5 tadan ko'p emas;
- oxirgi o'zgarish (
time.modified) — 365 kundan yangi; deprecatedyo'q.
tekshir.mjs — node tekshir.mjs zod@4.6.5: npm view … --json ni ishga tushiradi va natijani ✔/✖ bilan chiqaradi. Paket nomini buyruqqa qo'yishdan oldin tekshiring — foydalanuvchi zod; rm -rf / yozsa nima bo'ladi? baho.test.mjs — kamida 3 test (tayyor obyektlar bilan, internetsiz).
Ishoralar: execSync — node:child_process dan, buyruqni bajarib chiqishini qaytaradi; kunlar farqi — (now - new Date(...)) / (24 * 60 * 60 * 1000).
Yechim
baho.mjs:
// baho.mjs — `npm view <paket> --json` ma'lumotidan qisqa baho
const OPEN_LICENSES = ["MIT", "ISC", "Apache-2.0", "BSD-2-Clause",
"BSD-3-Clause", "0BSD"];
const DAY = 24 * 60 * 60 * 1000;
// Turlar paketning o'zidami? (types/typings yoki exports ichida)
function hasOwnTypes(meta) {
if (meta.types || meta.typings) return true;
return JSON.stringify(meta.exports ?? {}).includes('"types"');
}
// meta — npm view --json natijasi; now — Date (sinov uchun)
export function evaluate(meta, now = new Date()) {
const days = Math.floor((now - new Date(meta.time.modified)) / DAY);
const deps = Object.keys(meta.dependencies ?? {}).length;
return [
["litsenziya", meta.license,
OPEN_LICENSES.includes(meta.license)],
["o'z turlari", hasOwnTypes(meta) ? "bor" : "yo'q",
hasOwnTypes(meta)],
["ESM", meta.type === "module" ? "ha" : "yo'q",
meta.type === "module"],
["bog'liqliklar", deps, deps <= 5],
["oxirgi o'zgarish", `${days} kun oldin`, days <= 365],
["eskirgan (deprecated)", meta.deprecated ? "ha" : "yo'q",
!meta.deprecated],
];
}
const meta = { license: "MIT", time: { modified: "2023-05-26" } };
const rows = evaluate(meta, new Date("2026-10-10"));
console.log(rows.filter(([, , ok]) => !ok).length); // 3Oxirgi uch qator — sinash uchun: turlar, ESM va sana o'tmadi.
tekshir.mjs:
// tekshir.mjs — ishlatish: node tekshir.mjs <paket>[@versiya]
import { execSync } from "node:child_process";
import { evaluate } from "./baho.mjs";
const spec = process.argv[2] ?? "";
// Buyruqqa faqat paket nomi belgilari o'tsin (in'ektsiya yo'q)
const SPEC = /^[@a-z0-9._/-]+(@[0-9a-z.^~-]+)?$/i;
if (!SPEC.test(spec)) {
console.error("✖ Paket kerak: node tekshir.mjs zod@4.6.5");
process.exit(1);
}
const json = execSync(`npm view ${spec} --json`, {
encoding: "utf8",
});
const meta = JSON.parse(json);
console.log(`${meta.name}@${meta.version}`);
for (const [name, value, ok] of evaluate(meta)) {
console.log(`${ok ? "✔" : "✖"} ${name}: ${value}`);
}node tekshir.mjs is-number@7.0.0is-number@7.0.0
✔ litsenziya: MIT
✖ o'z turlari: yo'q
✖ ESM: yo'q
✔ bog'liqliklar: 0
✖ oxirgi o'zgarish: 1232 kun oldin
✔ eskirgan (deprecated): yo'qvalibot@1.5.0 da hammasi ✔ (oxirgi o'zgarish — 31 kun oldin). node tekshir.mjs "zod; echo x" — ✖ Paket kerak: … va chiqish kodi 1: satr buyruqqa qo'shilmadi. execSync buyruqni shell orqali bajaradi, shuning uchun foydalanuvchi matnini oldin tekshirish shart (Hujumchi nigohi — xavfsizlik qismida chuqur). baho.test.mjs (3 test) — tayyor obyektlar bilan, ℹ pass 3.
7. Real ishda
- Kod ko'rib chiqishda (code review) yangi bog'liqlik — alohida savol: "nega aynan shu, native yo'l bormi, qancha qo'shadi?". Ko'p jamoalar PR shablonida shu uchta savolni so'raydi.
- Bundle budjeti — "JS 100 KB gzip dan oshmasin" qoidasi CI'da tekshiriladi (Vite V: bundle tahlili).
- Kutubxona tanlash hujjati — katta qarorlar (sxema, holat boshqaruvi, sana) ADR (Architecture Decision Record) sifatida yoziladi: variantlar, o'lchovlar, qaror va "qachon qayta ko'riladi".
- Intervyu: "Paketni qanday tanlaysiz?", "bundlephobia raqami nega aldashi mumkin?", "tree shaking nimaga bog'liq?".
Xulosa
npm idan oldin: native API → o'zim yozamanmi → nomzodlar kartasi → o'z o'lchovim → qaror va sababi.- e18e
module-replacements— "qaysi paket o'rniga nima";uuid→crypto.randomUUID,chalk→util.styleText,object.groupby→Object.groupBy. - Karta: litsenziya, ESM, o'z turlari, bog'liqliklar,
time.modified,deprecated, haftalik yuklashlar (ehtiyotkorlik bilan). - bundlephobia — butun paket; haqiqiy narx — sizning kodingiz va bundleringizda: qo'lda 0.21 KB, Valibot 1.51, zod/mini 5.57, Zod 25.58 KB (esbuild, gzip).
import { z } from "zod"esbuild'da 90.58 KB — import shakli ham narx.vazifalar: qo'lda tekshiruv qoladi — uch maydon uchun kutubxona o'zini oqlamaydi; sxemalar ko'paysa, birinchi nomzod Valibot.
Keyingi dars: Ta'minot zanjiri xavfsizligi — begona paket qanday hujum eshigiga aylanadi: haqiqiy hodisalar, npm audit, imzolar va vazifalar ga .npmrc himoyasi.
Manbalar
- e18e: e18e.dev,
module-replacements3.4.0 — github.com/es-tooling/module-replacements (manifests: preferred, native, micro-utilities) - npm: Downloads API; npm Docs (v11): npm view
- bundlephobia.com (API:
/api/size?package=…), pkg-size.dev, npmtrends.com - Zod 4.6.5 manba kodi:
index.jsdagi izoh (tree shaking va tillar, #6050) — github.com/colinhacks/zod - Node.js Docs (v24): util.styleText, crypto.randomUUID
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!