Mundarija (25)
- Bu darsda
- 1. Nega bu kerak?
- 2. Yarn classic (1.x)
- 2.1 Tarix va holat
- 2.2 vazifalar Yarn 1 bilan
- 3. Yarn berry (4.x) va Plug'n'Play
- 3.1 node_modules siz
- 3.2 PnP qanday ishlaydi
- 3.3 PnP'ning narxi
- 4. Bun
- 4.1 Runtime va menejer
- 4.2 bun.lock
- 5. O'lchov: beshta menejer bir mashinada
- 6. packageManager va Corepack
- 6.1 Maydon
- 6.2 Kim tekshiradi, kim yo'q
- 7. Aralash lock-fayllar
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): Menejerni toping
- 2-mashq (o'rta): PnP'ni sinab ko'ring
- 3-mashq (qiyin): Menejer aniqlagich
- 10. Real ishda
- Xulosa
- Manbalar
Yarn va Bun: classic va berry, Plug'n'Play, bun install va packageManager
Qisqacha: Yarn ikki xil: classic (1.x, faqat tuzatishlar oladi) va berry (2+ versiyalar, hozir 4.x) — berry sukut bo'yicha
node_modulessiz, Plug'n'Play (PnP) rejimida ishlaydi. Bun — JavaScript runtime'i, ichida tez paket menejeri bor:bun installpackage-lock.jsonni o'zi ko'chirib,bun.lockyozadi. Loyiha qaysi menejerda ekanini lock-fayl vapackage.jsondagipackageManagermaydoni aytadi. Bitta loyihada ikki menejer — ikki lock-fayl va kelishmovchilik.
Bu darsda
- Yarn classic va berry farqini bilasiz va ikkalasida
vazifalarnusxasini o'rnatasiz. - PnP qanday ishlashini va uning haqiqiy narxini (TypeScript, Prettier) ko'rasiz.
.yarnrc.ymldanodeLinker: node-modulesbilan PnP'ni o'chirasiz.bun installvabun.lockni sinab, beshta menejerni bir mashinada o'lchaysiz.packageManager, Corepack va aralash lock-fayllar tuzog'ini taniysiz.
Oldin bilishingiz kerak: pnpm, Lock-fayllar va npm ci, Node versiya menejerlari.
1. Nega bu kerak?
Sardor GitHub'dan begona loyihani yukladi. Unda package-lock.json yo'q, yarn.lock va .yarnrc.yml bor. U odatdagidek npm install qildi — loyiha ishga tushdi, lekin PR'ida yarn.lock 800 qatorga o'zgarib ketdi va yangi package-lock.json paydo bo'ldi. Loyiha egasi PR'ni rad etdi: "bizda Yarn".
O'zingiz Yarn yoki Bun tanlamasangiz ham, ular bilan yozilgan loyihalarga albatta duch kelasiz. Bugungi maqsad — ularni tanib olish va to'g'ri buyruqni ishlatish. Yana o'lchov bilan: "Bun eng tez" degan gap sizning mashinangizda rostmi?
Maslahat: Chiqishlar 2026-10-10 da Windows 11, Node 24.21.0 bilan; Yarn 1.22.22, Yarn 4.18.1 (
@yarnpkg/cli-dist) va Bun 1.4.3 — uchalasi ham global o'rnatishsiz,npx -y <paket>@<versiya>bilan ishga tushirilgan. Keshlar va uy papkasi sinov papkasiga yo'naltirilgan. O'zingizda doimiy o'rnatish — rasmiy hujjatlar bo'yicha (yarnpkg.com, bun.sh).
2. Yarn classic (1.x)
2.1 Tarix va holat
Yarn 2016-yilda Facebook'da npm'ning sekinligi va lock-fayl yo'qligiga javob sifatida paydo bo'lgan — yarn.lock npm'dan oldin chiqqan. 2020-yildan asosiy rivojlanish berry (Yarn 2+) da. Yarn 1 esa "classic" deb ataladi va faqat muhim tuzatishlarni oladi:
npm view yarn dist-tags{ legacy: '1.21.1', rc: '1.22.0', berry: '2.4.3', latest: '1.22.22' }yarn paketining latest i hali ham 1.22.22 — shuning uchun npm i -g yarn classic'ni o'rnatadi. Berry esa boshqa paket (@yarnpkg/cli-dist, 4.18.1) yoki Corepack orqali keladi.
2.2 vazifalar Yarn 1 bilan
vazifalar nusxasida (package-lock.json hali turibdi):
npx yarn@1.22.22 installyarn install v1.22.22
info No lockfile found.
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/5] Validating package.json...
[2/5] Resolving packages...
[3/5] Fetching packages...
[4/5] Linking dependencies...
[5/5] Building fresh packages...
success Saved lockfile.
Done in 29.27s.Ikki muhim qator. info No lockfile found — Yarn npm'ning lock-faylini o'qimadi, versiyalarni noldan tanladi (yarn import buyrug'i uni ko'chira olardi). Ogohlantirish: "package-lock.json topildi… paket menejerlarini aralashtirmang… ogohlantirishni o'chirish uchun package-lock.json ni o'chiring".
Yarn 1 node_modules ni npm kabi quradi (hoisting bilan, 75 ta papka) — demak fantom bog'liqlik ham bor: import ms from 'ms' ishladi. yarn why ms:
info => Found "ms@2.1.3"
info Reasons this module exists
- "eslint#debug" depends on it
- Hoisted from "eslint#debug#ms""eslint#debug#ms dan ko'tarilgan" — node_modules ichida darsidagi hoisting, Yarn tilida.
yarn.lock (classic) o'z formatida:
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@cacheable/memory@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.2.0.tgz#72aeb8b051f6d597d10ac8595b94ad8302bd2239"
integrity sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==registry.yarnpkg.com — Yarn'ning registr manzili (npm registriga yo'naltiradi).
3. Yarn berry (4.x) va Plug'n'Play
3.1 node_modules siz
Yangi vazifalar nusxasida, package-lock.json siz. Chiqish uch bosqichga bo'lingan (Resolution, Fetch, Link) — har bosqichning oxirgi qatoriga va eng pastki Done qatoriga qarang:
npx @yarnpkg/cli-dist@4.18.1 install➤ YN0000: · Yarn 4.18.1
➤ YN0000: ┌ Resolution step
➤ YN0085: │ + @eslint/js@npm:10.0.1, eslint@npm:10.12.0, globals@npm:17.13.0, prettier@npm:3.9.9, typescript-eslint@npm:8.71.1, typescript@npm:7.0.2, and 116 more.
➤ YN0000: └ Completed in 30s 234ms
➤ YN0000: ┌ Fetch step
➤ YN0066: │ typescript@patch:@typescript/typescript6@npm%3A6.0.2#optional!builtin<compat/typescript>::version=6.0.2&hash=5786d5: ENOENT: no such file or directory, lstat '/node_modules/typescript/lib/_tsc.js'
➤ YN0013: │ 103 packages were added to the project (+ 79.27 MiB).
➤ YN0000: └ Completed in 21s 319ms
➤ YN0000: ┌ Link step
➤ YN0092: │ ESM support for PnP uses the experimental loader API and is therefore experimental
➤ YN0000: └ Completed in 3s 793ms
➤ YN0000: · Done with warnings in 55s 464msHar qator YN + raqam kodi bilan — Yarn xabarlari katalogi (yarnpkg.com da har kodning izohi bor). Masalan, YN0066 — Yarn TypeScript'ga o'z "yamog'i"ni (patch) qo'ymoqchi bo'ldi va bizning taxallusli TypeScript 6 da muvaffaqiyatsiz bo'ldi. YN0092 — "PnP uchun ESM qo'llovi eksperimental".
Natija — papkada node_modules yo'q. Uning o'rniga:
| Fayl | Nima |
|---|---|
.pnp.cjs |
"qaysi paket qayerda" xaritasi (CommonJS uchun) |
.pnp.loader.mjs |
o'sha xarita ESM uchun |
.yarn/ |
o'rnatish holati (keshi esa global) |
yarn.lock |
berry formati (YAML'ga yaqin) |
3.2 PnP qanday ishlaydi
Plug'n'Play ("ula va ishlat") — paketlar papkaga ochilmaydi, siqilgan arxivlarda qoladi. .pnp.cjs Node'ning modul qidiruvini almashtiradi: import "eslint" → "eslint arxivi shu yerda". Yarn skriptlarni (yarn test) shu yuklovchi bilan ishga tushiradi.
flowchart LR
A["import 'ms'"] --> P[".pnp.cjs xaritasi"]
P -- "e'lon qilingan" --> Z["arxiv ichidagi fayl"]
P -- "e'lon qilinmagan" --> X["xato: isn't declared"]Qat'iylik pnpm'dagidan ham kuchli — fantom bog'liqlik aniq xabar bilan to'xtaydi:
npx @yarnpkg/cli-dist@4.18.1 node --input-type=module \
-e "import ms from 'ms'; console.log(ms('1d'))"Error: Your application tried to access ms, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.
Required package: ms (via "ms\package.json")
Required by: …\kurs\mashqlar\16\14-yarn-bun\yarn4\[eval1]"Ilovangiz ms ga kirmoqchi bo'ldi, lekin u bog'liqliklaringizda e'lon qilinmagan — bu so'rov noaniq va ishonchsiz". yarn test esa toza o'tdi: ℹ tests 143, ℹ pass 143.
3.3 PnP'ning narxi
Lekin boshqa asboblar:
npx @yarnpkg/cli-dist@4.18.1 tipassets/js/olchov.ts(4,3): error TS2305: Module '"./vendor/web-vitals.js"' has no exported member 'onCLS'.
…
assets/js/vendor/web-vitals.d.ts(2,15): error TS2307: Cannot find module 'web-vitals' or its corresponding type declarations.TypeScript 7 (tsc, Go'da yozilgan) PnP xaritasini o'qimaydi — u node_modules ni qidiradi va web-vitals turlarini topmaydi. Qolgan beshta xato shundan kelib chiqadi. yarn lint ESLint'ni .pnp.cjs ga ham yubordi (✖ 2 problems (0 errors, 2 warnings) — o'sha fayldan), yarn format:check esa [warn] .pnp.cjs, [warn] .pnp.loader.mjs dedi. Har asbobni PnP'ga moslash kerak (ignore ro'yxatlari, maxsus plaginlar, muharrir uchun "SDK").
Yechim — PnP'ni o'chirish. .yarnrc.yml (berry sozlamalari fayli — npm'dagi .npmrc ning o'xshashi):
nodeLinker: node-modulesnpx @yarnpkg/cli-dist@4.18.1 install
npx @yarnpkg/cli-dist@4.18.1 tip➤ YN0000: · Yarn 4.18.1
…
➤ YN0000: · Done in 9s 239msOdatiy node_modules (75 papka) qaytdi, .pnp.cjs o'chdi. tip, lint, format:check — xatosiz. Ko'p jamoa berry'ni aynan shu sozlama bilan ishlatadi: Yarn'ning qulayliklari (workspace, plaginlar, yarn dlx), lekin asboblar bilan muammosiz.
Tekshirib ko'ring: Begona loyihada
.pnp.cjsbor,node_modulesyo'q. VS Code importlarni qizil chizmoqda. Nima sabab va qaysi buyruqdan boshlaysiz?
Javob
Loyiha Yarn PnP rejimida — muharrir (TypeScript server) node_modules ni qidiradi va topmaydi. Yarn hujjatidagi yo'l — muharrir uchun SDK o'rnatish (yarn dlx @yarnpkg/sdks vscode). Avval esa README va .yarnrc.yml ni o'qing — loyiha egasi buni allaqachon yozgan bo'lishi mumkin. O'zingiz nodeLinker ni o'zgartirmang: bu jamoa qarori.
4. Bun
4.1 Runtime va menejer
Bun — JavaScript'ni Node o'rniga ishga tushiradigan runtime (Zig tilida yozilgan, JavaScriptCore dvigateli bilan). Uning ichida paket menejeri, test yurgizgich va bundler ham bor. Bugun faqat menejer qismi — bun install. Uni Node loyihasida ham ishlatish mumkin: kodni baribir Node ishga tushiradi.
npx bun@1.4.3 installbun install v1.4.3 (c6da4a4d3)
[4.53ms] migrated lockfile from package-lock.json
Saved lockfile
+ @eslint/js@10.0.1
+ @typescript/native@7.0.2
+ eslint@10.12.0
+ globals@17.13.0
+ prettier@3.9.9
+ typescript@6.0.2
+ typescript-eslint@8.71.1
+ web-vitals@6.2.3
102 packages installed [41.15s]migrated lockfile from package-lock.json — Yarn 1 dan farqli, Bun npm lock'idagi o'sha versiyalarni ko'chirdi. Natija — bun.lock, lekin package-lock.json ham o'chirilmadi. Endi loyihada ikkita lock — buni o'zingiz hal qilasiz.
4.2 bun.lock
{
"lockfileVersion": 2,
"configVersion": 0,
"workspaces": {
"": {
"name": "vazifalar",
"devDependencies": {
"@eslint/js": "10.0.1",
…
"packages": {
"@cacheable/memory": ["@cacheable/memory@2.2.0", "", { "dependencies": { "@cacheable/utils": "^2.5.0", "@keyv/bigmap": "^1.3.1", "hookified": "^1.15.1", "keyv": "^5.6.0" } }, "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ=="],JSON'ga o'xshash matn (oxirgi vergul bilan — JSONC). Eski Bun versiyalarida u ikkilik bun.lockb edi va PR'da o'qib bo'lmasdi. Bun 1.2 dan beri sukut bo'yicha matnli bun.lock — eski loyihalarda bun.lockb ni ham uchratasiz (lock-fayllar jadvali).
5. O'lchov: beshta menejer bir mashinada
vazifalar (102 paket), node_modules yo'q, kesh to'la, har biri 5 marta (npx siz, to'g'ridan-to'g'ri ishga tushirib):
- pnpm 12.10.11,1 s
- Yarn 1.22.225,55 s
- npm ci 11.19.06,2 s
- Bun 1.4.38,94 s
- Yarn 4.18.1 (node-modules)10,7 s
Manba: O'lchov: Windows 11, Intel Core i5-12500H, 16 GB, Node 24.21.0, 2026-10-10
Xom raqamlar (ms). Yarn 1: 5521, 5633, 5550, 5764, 5518. Bun: 8937, 9008, 9148, 8865, 8367. Yarn 4: 11249, 10684, 9546, 11566, 10484. npm va pnpm — pnpm darsidan. node_modules bor bo'lsa, Bun 0.1 soniyadan kam (83–98 ms) — "o'zgarish yo'q"ni u eng tez sezadi.
Kutilmagan natija: bizning Windows mashinamizda Bun noldan o'rnatishda npm'dan sekinroq. Bun'ning rasmiy sahifasidagi "N baravar tez" o'lchovlari boshqa sharoitda (asosan Linux va macOS, boshqa loyihalar) olingan. Fayl tizimi, antivirus, disk — hammasi ta'sir qiladi. Xulosa: reklama raqamiga emas, o'z loyihangizdagi o'z o'lchovingizga ishoning (Paket tanlash darsidagi qoida).
6. packageManager va Corepack
6.1 Maydon
Loyiha qaysi menejer va versiyada ekanini package.json da yozish mumkin:
{
"name": "pm-sinov",
"private": true,
"packageManager": "pnpm@12.10.1"
}Uni Corepack o'qiydi — Node versiya menejerlari darsida tanishgan vosita (Node 24 bilan keladi, Node 25 dan alohida). corepack enable qilmasdan ham, uni to'g'ridan-to'g'ri chaqirib sinadik:
corepack yarn --versionThis project is configured to use pnpm because …\t14c\package.json has a "packageManager" field"Bu loyiha pnpm ishlatishga sozlangan, chunki package.json da packageManager maydoni bor" — Corepack noto'g'ri menejerni to'xtatdi (chiqish kodi 1).
corepack pnpm --versionDownloading the pnpm 12.10.1 binary for win32-x64...
12.10.1To'g'ri menejerni esa aynan yozilgan versiyada yuklab, ishga tushirdi. Jamoada hamma bir xil versiyada ishlaydi — .nvmrc ning paket menejeri uchun o'xshashi.
6.2 Kim tekshiradi, kim yo'q
| Kim | packageManager: pnpm@… bo'lsa |
|---|---|
| Corepack | boshqa menejerni to'xtatadi |
| Yarn 1.22.22 | install da xato beradi (pastda) |
| npm 11.19.0 | e'tibor bermaydi — jim o'rnatadi |
| CI | Corepack yoqilgan bo'lsa (corepack enable) — u majburlaydi |
Yarn 1 ning xabari — haqiqiy chiqish, xatosi bilan:
error This project's package.json defines "packageManager": "yarn@pnpm@12.10.1". However the current global version of Yarn is 1.22.22.yarn@pnpm@12.10.1 — Yarn 1 maydonni noto'g'ri o'qib, oldiga o'z nomini qo'shgan. Ma'nosi baribir to'g'ri: "bu loyiha boshqa menejer uchun".
7. Aralash lock-fayllar
Eng ko'p uchraydigan muammo — «Nega bu kerak?» bo'limidagi Sardor'ning holati. Yarn 1 loyihasida npm i -E picocolors@1.1.1 qildik:
733 yarn.lock
823 …\y1.lock.baknpm yarn.lock ni qayta yozdi (823 qatordan 733 qatorga) va yoniga package-lock.json yaratdi. Farqi, masalan:
resolved "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz"Yarn yozgan registry.yarnpkg.com/…#hash o'rniga npm o'z manzilini yozdi. npm 7 dan beri yarn.lock bor bo'lsa, uni ham yangilab boradi — "yaxshi niyat" bilan, lekin endi ikki lock bir-biridan uzoqlashadi. PR'da yuzlab o'zgargan qator, keyingi yarn install da yana boshqasi.
Qoida bitta: lock-fayl qaysi bo'lsa, o'sha menejer.
| Fayl | Buyruq |
|---|---|
package-lock.json |
npm ci |
pnpm-lock.yaml |
pnpm install --frozen-lockfile |
yarn.lock + .yarnrc.yml |
yarn install --immutable (berry) |
yarn.lock, .yarnrc.yml siz |
yarn install --frozen-lockfile (classic) |
bun.lock / bun.lockb |
bun install --frozen-lockfile |
Ikki lock ko'rsangiz — loyiha egasidan so'rang qaysi biri haqiqiy, ikkinchisini o'chiring va .gitignore ga qo'shing.
Tekshirib ko'ring: Repoda
yarn.lockbor,.yarnrc.ymlvapackageManageryo'q. Qaysi Yarn?
Javob
Deyarli aniq — classic (1.x). Berry o'zining .yarnrc.yml ini yaratadi va odatda packageManager ni yozadi. yarn.lock ning birinchi qatorlari ham aytadi: classic'da # yarn lockfile v1, berry'da __metadata:.
8. Ko'p uchraydigan xatolar
| Xabar / belgi | Sabab | Davosi |
|---|---|---|
package-lock.json found … do not mix |
npm lock'i Yarn loyihasida | bitta menejer tanlang |
isn't declared in your dependencies |
PnP, fantom bog'liqlik | paketni e'lon qiling |
TS2307 faqat Yarn berry'da |
tsc PnP'ni bilmaydi |
nodeLinker: node-modules |
This project is configured to use pnpm |
Corepack: boshqa menejer | packageManager dagisini ishlating |
| Belgi | Sabab | Davosi |
|---|---|---|
yarn.lock yuzlab qator o'zgardi |
npm uni qayta yozdi | Yarn loyihasida faqat Yarn |
bun.lock va package-lock.json |
Bun eskisini o'chirmaydi | birini o'chiring |
npm i -g yarn 1.x berdi |
yarn paketi — classic |
berry: Corepack yoki packageManager |
9. Mashqlar
Mashqlar kurs/mashqlar/16/14-yarn-bun/ da. Menejerlarni npx bilan aniq versiyada chaqiring.
1-mashq (oson): Menejerni toping
Har holatda qaysi menejer va qaysi buyruq?
pnpm-lock.yaml,pnpm-workspace.yaml:yarn.lock(__metadata:bilan),.yarnrc.yml,.pnp.cjs:bun.lock:- faqat
package.json(lock yo'q,packageManageryo'q):
Yechim
Uchinchisi — Yarn berry PnP rejimida. To'rtinchisi — lock yo'q; standart — npm, lekin avval README'ni o'qing. Buyruqlar — «Aralash lock-fayllar» bo'limidagi jadvalda.
2-mashq (o'rta): PnP'ni sinab ko'ring
vazifalar nusxasini oling (package-lock.json siz), Yarn 4.18.1 bilan o'rnating. yarn test va yarn tip natijalari: testlar [:143], tip chiqish kodi [:1]. Keyin .yarnrc.yml ga nodeLinker: node-modules yozib, qayta o'rnating va tip ni takrorlang.
Yechim
PnP'da tip — TS2307: Cannot find module 'web-vitals' va beshta TS2305 (chiqish kodi 1): TypeScript 7 .pnp.cjs ni o'qimaydi. nodeLinker: node-modules bilan — node_modules qaytadi, tip 0 bilan tugaydi. Testlar ikkala rejimda ham 143/143: node --test ni Yarn PnP yuklovchisi bilan ishga tushiradi.
3-mashq (qiyin): Menejer aniqlagich
Begona repoga kirganda birinchi savolga javob beradigan skript yozing. menejer.mjs da detectManager(files, pkg) — files papkadagi nomlar, pkg — package.json obyekti. Qaytaradi: { manager, warnings }.
manager: avvalpackageManagermaydonidan ("pnpm@12.10.1"→"pnpm"), bo'lmasa lock-fayldan, hech narsa bo'lmasa"npm".warnings: bir nechta menejerning lock-fayllari;packageManagerlock bilan mos emas;.pnp.cjsbor.
tekshir.mjs — node tekshir.mjs <papka>. menejer.test.mjs — kamida 3 test.
Ishoralar: readdirSync — papkadagi nomlar; in operatori — obyektda kalit bormi; new Set — takrorsiz; ?. — maydon bo'lmasa undefined (?? va ?.).
Yechim
menejer.mjs:
// menejer.mjs — loyiha qaysi paket menejerida ekanini aniqlaydi
const LOCKS = {
"package-lock.json": "npm",
"npm-shrinkwrap.json": "npm",
"pnpm-lock.yaml": "pnpm",
"yarn.lock": "yarn",
"bun.lock": "bun",
"bun.lockb": "bun",
};
// files — papkadagi fayl nomlari, pkg — package.json obyekti
export function detectManager(files, pkg = {}) {
const fromLocks = [
...new Set(files.filter((f) => f in LOCKS).map((f) => LOCKS[f])),
].sort();
// "pnpm@12.10.1" → "pnpm"; "yarn@4.18.1+sha512…" → "yarn"
const declared = pkg.packageManager?.split("@")[0] ?? null;
const warnings = [];
if (fromLocks.length > 1) {
warnings.push(`bir nechta lock-fayl: ${fromLocks.join(", ")}`);
}
const hasLock = fromLocks.length > 0;
if (declared && hasLock && !fromLocks.includes(declared)) {
warnings.push(`packageManager: ${declared}, lock esa boshqa`);
}
if (files.includes(".pnp.cjs")) warnings.push("Yarn PnP rejimi");
return { manager: declared ?? fromLocks[0] ?? "npm", warnings };
}
const files = ["package-lock.json", "bun.lock", "package.json"];
console.log(detectManager(files));Konsolda:
{ manager: 'bun', warnings: [ 'bir nechta lock-fayl: bun, npm' ] }Oxirgi ikki qator — sinash uchun (Bun'dan keyingi vazifalar nusxasining holati). sort() tufayli fromLocks[0] alifbo bo'yicha birinchisi — ikki lock bo'lsa, "to'g'ri" menejerni skript bilmaydi, shuning uchun ogohlantiradi.
tekshir.mjs:
// tekshir.mjs — ishlatish: node tekshir.mjs [papka]
import { existsSync, readdirSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { detectManager } from "./menejer.mjs";
const dir = process.argv[2] ?? ".";
const pkgFile = join(dir, "package.json");
const pkg = existsSync(pkgFile)
? JSON.parse(readFileSync(pkgFile, "utf8"))
: {};
const { manager, warnings } = detectManager(readdirSync(dir), pkg);
console.log(`Menejer: ${manager}`);
for (const text of warnings) console.log(`⚠ ${text}`);menejer.test.mjs:
// menejer.test.mjs — node --test menejer.test.mjs
import { test } from "node:test";
import assert from "node:assert/strict";
import { detectManager } from "./menejer.mjs";
test("lock-fayl bo'yicha", () => {
assert.equal(detectManager(["pnpm-lock.yaml"]).manager, "pnpm");
assert.equal(detectManager(["bun.lock"]).manager, "bun");
assert.deepEqual(detectManager(["package.json"]), {
manager: "npm",
warnings: [],
});
});
test("packageManager maydoni ustun", () => {
const pkg = { packageManager: "yarn@4.18.1" };
const result = detectManager(["yarn.lock", ".pnp.cjs"], pkg);
assert.equal(result.manager, "yarn");
assert.deepEqual(result.warnings, ["Yarn PnP rejimi"]);
});
test("aralash lock-fayllar va nomuvofiqlik", () => {
const files = ["package-lock.json", "yarn.lock"];
const pkg = { packageManager: "pnpm@12.10.1" };
assert.deepEqual(detectManager(files, pkg).warnings, [
"bir nechta lock-fayl: npm, yarn",
"packageManager: pnpm, lock esa boshqa",
]);
});Darsdagi papkalarda:
Menejer: bun
⚠ bir nechta lock-fayl: bun, npm(Bun bilan o'rnatilgan nusxa.) Yarn 4 nusxasida — Menejer: yarn, ogohlantirishsiz (PnP o'chirilgandan keyin). vazifalar ning o'zida — Menejer: npm.
10. Real ishda
- Begona repoda birinchi qadam: lock-fayl va
packageManagerga qarang, o'sha menejerni ishlating. "Men npm'ga o'rganganman" — sabab emas. - Yarn berry ko'p korporativ monorepolarda (workspace, plaginlar, "zero-install" — arxivlar Git'da). Ko'pincha
nodeLinker: node-modulesbilan. - Bun — runtime sifatida tez o'smoqda; menejer sifatida ham uchraydi. Uning test yurgizgichi va bundleri — keyingi qismlarda boshqa asboblar bilan solishtiriladi.
- Intervyu: "Yarn classic va berry farqi?", "Plug'n'Play nima va uning kamchiligi?", "
packageManagermaydoni nima uchun?".
Xulosa
- Yarn 1 (classic) — npm'ga o'xshash
node_modules, faqat tuzatishlar;yarnpaketininglatesti hali 1.22.22. - Yarn berry (4.18.1) — sukut bo'yicha PnP:
node_modulesyo'q,.pnp.cjs, fantomlar qat'iy to'xtaydi; lekintsc, Prettier va boshqa asboblar moslashtirishni talab qiladi —nodeLinker: node-modules. bun installnpm lock'ini ko'chiradi vabun.lock(matnli) yozadi; bizning Windows o'lchovimizda npm'dan tez emas edi.packageManager— loyiha menejeri va versiyasi; Corepack uni majburlaydi, npm esa e'tiborsiz qoldiradi.- Bitta loyiha — bitta menejer — bitta lock-fayl; npm
yarn.lockni ham qayta yozadi.
Keyingi dars: Paket tanlash va baholash — npm i dan oldin: hajm, faollik, litsenziya, turlar va "native API yetarlimi?". Asosiy misol — Zod, Valibot va qo'lda yozilgan tekshiruvni vazifalar da o'lchash.
Manbalar
- Yarn: Plug'n'Play, Configuration (.yarnrc.yml) — nodeLinker, Error codes, Corepack
- Bun: bun install, Lockfile (bun.lock)
- Node.js: Corepack
- npm Docs (v11): package-lock.json — yarn.lock bilan ishlash
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!