Asosiy kontentga o‘tish
Innovialabs

Veb-loyihalar uchun monorepozitoriy: Turborepo, Nx va pnpm

Chuqur3 daq

Qisqacha

Monorepozitoriy sayt, admin panel, API va umumiy paketlarni bitta repozitoriyda saqlaydi; pnpm workspaces paketlarni bog‘laydi, Turborepo yoki Nx esa kesh va faqat ta’sirlangan vazifalarni ishga tushirish orqali yig‘ishni tezlashtiradi.

Monorepozitoriy nima beradi

Monorepozitoriy — bir nechta ilova va kutubxonalar yashaydigan bitta Git-repozitoriy. Odatiy veb-loyiha: ommaviy sayt, admin panel, API va umumiy paketlar — UI komponentlar, tiplar, konfiglar.

Asosiy foydalari:

  • Frontend va API o‘rtasida umumiy tiplar. Modeldagi maydonni o‘zgartirdingiz — TypeScript buzilgan barcha joylarni darhol ko‘rsatadi.
  • Sayt va admin panel uchun npm ga paket chiqarmasdan yagona dizayn-tizim.
  • Atomar o‘zgarishlar: API va klient tuzatishi bitta kommit va bitta pull request da.
  • Yagona qoidalar: bitta linter, formatlash va bog‘liqlik versiyalari to‘plami.

Narxi — vositalar: ularsiz har o‘zgarishda barcha paketlarni yig‘ish va test qilish sekinlashadi.

Tuzilma namunasi

my-project/
├── apps/
│   ├── web/          # ommaviy sayt (Next.js)
│   ├── admin/        # admin panel
│   └── api/          # backend (Node.js)
├── packages/
│   ├── ui/           # umumiy komponentlar
│   ├── types/        # umumiy tiplar va sxemalar
│   └── config/       # eslint, tsconfig
├── package.json
├── pnpm-workspace.yaml
└── turbo.json

Qoida: ilovalar paketlarga bog‘liq, lekin bir-biriga emas. Agar admin panelga sayt kodi kerak bo‘lsa — uni packages/ ga chiqaring.

1-qatlam: pnpm workspaces

pnpm workspaces repozitoriy ichidagi paketlarni bog‘laydi. Ular qayerda joylashganini ko‘rsatish kifoya:

# pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"

Va ilovada lokal paketni ulash:

{
  "dependencies": {
    "@acme/ui": "workspace:*"
  }
}

pnpm lokal papkaga havola yaratadi, shuning uchun packages/ui dagi o‘zgarishlar apps/web da darhol ko‘rinadi. pnpm o‘zi nimani qayta yig‘ish va keshlashni bilmaydi — bu orkestratorlar vazifasi.

2-qatlam: vazifalar orkestratori va kesh

Orkestrator paketlar orasidagi bog‘liqliklar grafini tushunadi va quyidagilarni qila oladi:

  • vazifalarni (build, test, lint) to‘g‘ri tartibda va parallel ishga tushirish;
  • natijalarni keshlash: paketning kirish fayllari o‘zgarmagan bo‘lsa, natija qayta hisoblanmasdan keshdan olinadi;
  • vazifalarni faqat o‘zgarish ta’sir qilgan paketlar uchun ishga tushirish;
  • masofaviy kesh orqali keshni dasturchilar va CI o‘rtasida bo‘lishish.

Turborepo konfiguratsiyasi namunasi:

{
  "$schema": "https://turborepo.com/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**", "!.next/cache/**"]
    },
    "lint": {},
    "test": { "dependsOn": ["^build"] }
  }
}

^build — «avval shu paketning bog‘liqliklarini yig‘» degani. Konfiguratsiya formati major versiyalar orasida o‘zgaradi, shuning uchun o‘z versiyangiz hujjatlari bilan solishtiring.

Turborepo, Nx yoki faqat pnpm

Mezonpnpm workspacesTurborepoNx
Bu nimaPaket menejeriYengil vazifalar orkestratoriMonorepozitoriylar uchun to‘liq platforma
Vazifalar keshiYo‘qHa, lokal va masofaviyHa, lokal va masofaviy
O‘rganish qiyinligiMinimalPastYuqoriroq
Kod generatorlari, plaginlarYo‘qMinimalKo‘p
Paketlar chegarasini nazorat qilishYo‘qCheklanganBog‘liqlik qoidalari bor
Kimga mos2–3 paket, oddiy skriptlarKo‘pchilik JS/TS loyihalarYirik repozitoriylar, ko‘p jamoalar

Amaliy yo‘l: pnpm workspaces dan boshlang, yig‘ish sezilarli sekinlashganda Turborepo qo‘shing, qat’iy chegaralar, generatorlar va katta miqyos kerak bo‘lsa Nx ga qarang.

Ko‘p uchraydigan xatolar

  • Paketlar orasida siklik bog‘liqliklar: ui types dan import qiladi, types esa ui dan.
  • Kodni umumiy paketga chiqarish o‘rniga qo‘shni ilovadan import qilish.
  • Kesh sozlamalarida noto‘g‘ri outputs: kesh noto‘g‘ri fayllarni tiklaydi yoki hech narsani tiklamaydi.
  • Muhit o‘zgaruvchilari keshda hisobga olinmagan: boshqa qiymatlar bilan yig‘ish eski natijani oladi.
  • Turli ilovalarda sababsiz bitta kutubxonaning turli versiyalari.
  • Umumiy paketlardagi maxfiy kalitlar: packages/ dagi kod klient bandliga tushib qolishi mumkin.

Ko‘p beriladigan savollar

Yo‘q. U umumiy kodga ega bir nechta ilova bo‘lganda foydali: sayt va admin panel, veb va API, bitta dizayn-tizimdagi bir nechta sayt.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.