IlmHamroh
JavaScript Full-stack/29-qism. Backend integratsiyalar: fayl, to'lov, bot, realtime69/69-dars16 daqiqa
Mundarija (26)

BaaS va headless CMS: Supabase, Firebase, PocketBase, Strapi, Payload

Qisqacha: BaaS (Backend as a Service) — baza, foydalanuvchilar, fayl ombori va realtime'ni tayyor xizmat sifatida beradi: frontend to'g'ridan uning SDK'si bilan ishlaydi, backend kodi kam yoki yo'q. Headless CMS — kontentni (maqola, mahsulot, sahifa) admin panelda tahrirlash va API orqali berish tizimi. Ikkalasi vaqtni tejaydi, lekin evaziga provayderga bog'lanasiz (lock-in). Tanlovdan oldin "chiqish narxi"ni hisoblang.

Diqqat: Bu darsdagi xizmatlarning birortasi ham kurs kanonida sinalmagan — akkaunt yoki alohida server o'rnatish kerak edi. Faktlar rasmiy hujjat va repozitoriylardan (2026-10-28), kod parchalari — hujjat namunasi uslubida, natijasi ko'rsatilmaydi. Faqat toza JavaScript bloklari (tanlov hisobi) ishga tushirilgan.

Bu darsda

  • BaaS va headless CMS nima ekanini va oddiy backend'dan farqini tushuntira olasiz.
  • Supabase, Firebase, Appwrite va PocketBase'ning asosiy farqlarini bilasiz.
  • Strapi, Payload va Directus qanday vazifani hal qilishini bilasiz.
  • Lock-in narxini mezonlar bo'yicha baholaysiz va adapter qatlami bilan kamaytirasiz.
  • Loyihangiz uchun "o'zimiz yozamiz" yoki "tayyorini olamiz" qarorini asoslay olasiz.

Oldin bilishingiz kerak: Serverless va edge funksiyalar, Row Level Security, Managed va serverless Postgres, Auth kutubxonalari va xizmatlari.

Oldingi darsda serverni platformaga topshirdik, lekin backend kodini o'zimiz yozdik. Bu darsda bir qadam nariga o'tamiz: backend'ning katta qismini ham tayyor olamiz.

1. Nega bu kerak?

Malika "Bahor" oshxonasi uchun ilova yasamoqchi: menyu, buyurtmalar, foydalanuvchilar, taom rasmlari, buyurtma holati real vaqtda. 25–29-qismlarda bularning hammasini o'zimiz yozishni o'rgandik: Express API, Postgres, auth, S3, SSE. Bu — haftalar.

BaaS shu qismlarni tayyor beradi:

flowchart LR
  subgraph O["O'z backend'imiz"]
    F1["frontend"] --> A1["API: Express"]
    A1 --> D1[("Postgres")]
    A1 --> S1["S3 ombor"]
    A1 --> R1["SSE"]
  end
  subgraph B["BaaS"]
    F2["frontend + SDK"] --> X["BaaS: baza, auth, fayl, realtime"]
  end

Diagrammaga qarang: chap tomonda API qatlamini o'zimiz yozamiz va saqlaymiz. O'ng tomonda frontend to'g'ridan BaaS bilan gaplashadi. Kod kam — lekin qoidalar (kim nimani o'qiy oladi) endi BaaS sozlamasida yashaydi.

O'xshatish: o'z backend'ingiz — uyni o'zingiz qurish. BaaS — tayyor kvartira ijarasi: tez ko'chib kirasiz, lekin devorni buzib bo'lmaydi va ko'chib ketish ham mehnat.

Headless CMS boshqa muammoni hal qiladi. Malikaning kontent menejeri dasturchi emas, lekin menyu tavsiflari va aksiya sahifalarini o'zi yangilashi kerak. CMS (Content Management System — kontent boshqaruv tizimi) unga admin panel beradi. "Headless" ("boshsiz") — CMS sahifani o'zi chizmaydi, kontentni API orqali beradi; uni React, mobil ilova yoki Telegram bot ko'rsatadi.

2. BaaS: to'rt asosiy vakil

2.1 Supabase

Supabase — ochiq kodli BaaS, markazida Postgres. Rasmiy arxitektura hujjatidan (supabase.com/docs, 2026-10-28):

Qism Vazifasi
Postgres asosiy baza; "to'liq huquq bilan" ochiq
PostgREST Postgres jadvallaridan avtomatik REST API
GoTrue (Auth) foydalanuvchilar va JWT tokenlar
Realtime WebSocket: bazadagi o'zgarishlar, presence
Storage S3 mos fayl ombori, metama'lumot Postgres'da
Edge Functions Deno'da ishlaydigan funksiyalar (Deno)
Supavisor ulanishlar pooler'i (Serverless darsidagi muammo)

Frontend kodi taxminan shunday (supabase-js 2 hujjati uslubida, sinalmagan):

js
import { createClient } from "@supabase/supabase-js";

const supabase = createClient(
  "https://<loyiha>.supabase.co",
  "<publishable-kalit>", // ommaviy kalit, sir emas
);

const { data, error } = await supabase
  .from("taomlar")
  .select("id, nom, narx")
  .lte("narx", 30000)
  .order("narx");

Ikkinchi argument — publishable kalit (ommaviy kalit, sb_publishable_…). Supabase hujjatiga ko'ra u eski anon kalitining o'rnini egallaydi va xuddi shunday kam huquqli; eski anon va service_role kalitlari 2026-yil oxirigacha bosqichma-bosqich olib tashlanmoqda (2026-10-28 holatiga). Bu yerda backend kodi yo'q: so'rov PostgREST orqali to'g'ridan bazaga boradi. Unda xavfsizlik qayerda? Javob — Row Level Security (Row Level Security darsi). Har jadvalga Postgres siyosati yoziladi:

sql
ALTER TABLE buyurtmalar ENABLE ROW LEVEL SECURITY;

CREATE POLICY "o'z buyurtmalari"
  ON buyurtmalar FOR SELECT
  USING (auth.uid() = foydalanuvchi_id);

auth.uid() — Supabase'ning yordamchi funksiyasi: so'rovdagi JWT'dan foydalanuvchi ID'si. RLS'ni yoqishni unutsangiz, ommaviy kalit bilan butun jadval o'qiladi. Supabase hujjati buni qizil ogohlantirish bilan yozadi: "Enable RLS on every table in an exposed schema". Ya'ni API orqali ochiq sxemadagi har jadvalda RLS'ni yoqing. RLS'siz jadvalni huquqi bor har qanday rol o'qiydi va yozadi. Maxfiy service_role kalit esa RLS'ni chetlab o'tadi — u faqat serverda turadi.

Lock-in jihatidan: Supabase Postgres ustida qurilgani uchun ma'lumot pg_dump bilan chiqadi, o'z serveringizda ham ishlatish mumkin. Hujjat ochiq aytadi: "To avoid lock-in, we make it easy to migrate in and out" ("bog'lanib qolmaslik uchun kirish va chiqishni oson qilamiz"). Lekin RLS siyosatlari, Auth foydalanuvchilari, Storage va Edge Functions — ko'chishda qayta quriladigan qismlar.

2.2 Firebase

Firebase — Google'ning BaaS'i. Asosiy bazasi Firestore — hujjatli NoSQL baza (MongoDB ga o'xshash g'oya: kolleksiya va hujjatlar). Xavfsizlik qoidalari — Firebase Security Rules tilida yoziladi. Auth, Cloud Storage, Cloud Functions, push (FCM) va hosting — bitta ekotizimda (firebase.google.com/docs).

Kuchli tomoni — mobil ilovalar (offline kesh, realtime sinxronlash) va Google ekotizimi. Zaif tomoni — lock-in kuchli: Firestore'ning so'rov modeli va Security Rules tili boshqa joyda yo'q; SQL'dagi JOIN va murakkab so'rovlar o'rniga ma'lumotni boshqacha tuzish kerak.

2.3 Appwrite

Appwrite — ochiq kodli BaaS: baza, auth, storage, funksiyalar, realtime. O'z serveringizda Docker bilan yoki ularning bulutida ishlatiladi (appwrite.io/docs). Firebase'ga ochiq kodli muqobil sifatida tanilgan.

2.4 PocketBase

PocketBase — bitta bajariladigan fayldagi backend: Go'da yozilgan, ichida SQLite, realtime obunalar, auth, fayl boshqaruvi va admin panel. Rasmiy repozitoriydan (github.com/pocketbase/pocketbase, 2026-10-28): litsenziya — MIT; muhim ogohlantirish — loyiha "faol rivojlanmoqda va v1.0.0 gacha to'liq orqaga moslik kafolatlanmaydi". JS SDK — pocketbase paketi (npm'da 0.28.1, 2026-10-28).

Kichik loyiha, ichki vosita yoki prototip uchun juda qulay: bitta faylni VPS'ga qo'yasiz va ishlaydi. Katta yuklama va bir nechta server nusxasi uchun SQLite cheklovi bor.

2.5 Taqqoslash

Xizmat Baza Ochiq kod O'z serverda
Supabase Postgres (SQL) ha ha
Firebase Firestore (NoSQL) yo'q yo'q
Appwrite o'z bazasi ustida ha ha
PocketBase SQLite ha (MIT) ha, bitta fayl

Ma'lumotni olib chiqish: Supabase — pg_dump, PocketBase — SQLite faylning o'zi, Firebase va Appwrite — o'z eksport vositalari.

Jadval rasmiy hujjat va repozitoriylar bo'yicha; hech biri kanonda sinalmagan.

Tekshirib ko'ring: Supabase'da frontend ommaviy (publishable) kalit bilan to'g'ridan bazaga so'rov yuboradi. Kalit ommaviy bo'lsa, nega boshqa foydalanuvchining buyurtmalarini o'qib bo'lmaydi?

Javob

Faqat RLS yoqilgan va to'g'ri siyosat yozilgan bo'lsa o'qib bo'lmaydi. Ommaviy kalit — "kim bo'lsa ham kira oladi" degani; nimani ko'rishini Postgres siyosati (auth.uid() = foydalanuvchi_id) hal qiladi. RLS o'chiq qolsa — ommaviy kalit bilan hamma narsa o'qiladi. Ya'ni xavfsizlik API kodidan baza siyosatiga ko'chdi, yo'qolmadi.

3. Headless CMS

3.1 Strapi

Strapi — Node.js'da yozilgan ochiq kodli headless CMS. Admin panelda kontent turlarini (masalan "Taom": nom, tavsif, rasm, narx) yaratasiz, Strapi ulardan REST va GraphQL API yasaydi. Hozirgi katta versiya — 5 (@strapi/strapi 5.59.0, npm, 2026-10-28). O'z serveringizda yoki Strapi Cloud'da.

3.2 Payload

Payload — TypeScript'da yozilgan CMS va freymvork. Rasmiy repozitoriy: "Payload is the first-ever Next.js native CMS that can install directly in your existing /app folder" — mavjud Next.js ilovangizning /app papkasiga o'rnatiladi. Konfiguratsiya — kodda (TypeScript), ma'lumot — Postgres yoki MongoDB'da (baza adapterlari orqali; repozitoriy teglari bo'yicha). Litsenziya — MIT; versiya 3 (payload 3.92.1, npm, 2026-10-28).

Payload'ning farqi: u alohida xizmat emas, sizning kodingizning bir qismi. Shuning uchun lock-in kichikroq — kod va baza sizda.

3.3 Directus

Directus — mavjud SQL bazangiz ustiga REST, GraphQL API va admin panel qo'yadigan tizim. Rasmiy repozitoriy: Postgres, MySQL, MariaDB, MS SQL, SQLite, OracleDB, CockroachDB. Jadvallarni o'zi yaratishi shart emas — bor bazani "o'raydi".

Litsenziyaga e'tibor bering: Directus — klassik ochiq kod emas. Repozitoriyga ko'ra 12-versiyadan u "Monospace Sustainable Core License (MSCL) 1.0" ostida: kod ochiq ko'rinadi, lekin uni raqobatchi xizmat sifatida taklif qilish taqiqlangan. Directus e'loniga (2026-04-22) ko'ra yillik daromadi 5 million dollardan kam va xodimi 50 tadan kam tashkilotlar "Innovation Grant" bilan bepul ishlatadi, kattalari tijoriy litsenziya oladi. Tanlovda litsenziyani ham o'qing — "GitHub'da kodi bor" degani "har qanday maqsadda bepul" degani emas.

3.4 Qachon headless CMS

Kerak Kerak emas
kontentni dasturchi bo'lmagan odam tahrirlaydi ma'lumot faqat foydalanuvchilar kiritadi (buyurtma, vazifa)
bir kontent — sayt, ilova, bot bitta sahifa, kam o'zgaradi
tarjimalar, qoralama/nashr, versiyalar murakkab biznes mantiq (to'lov, ombor)

IlmHamroh darslari ham "kontent": Markdown fayllar, git va import skripti. Biz CMS o'rniga git'ni tanlaganmiz — tahrirlovchilar dasturchilar va ularga git qulay. Bu ham tanlov.

4. Lock-in narxini baholash

4.1 Mezonlar

Lock-in (provayderga bog'lanish) — boshqa yechimga o'tish narxi. U nolga teng bo'lmaydi; savol — qancha. Baholash mezonlari:

Mezon Savol
Ma'lumot standart formatda olib chiqiladimi (SQL dump, CSV)?
So'rov modeli SQL'mi yoki faqat shu xizmatning tili?
Auth foydalanuvchilar va parol hash'lari eksport qilinadimi?
Mantiq qoidalar va funksiyalar standart kodmi yoki maxsus til?
Joylash o'z serverda ishlatsa bo'ladimi?

Bu mezonlarni raqamga aylantirib, variantlarni solishtirish mumkin. Quyidagi hisob — misol: ballarni siz qo'yasiz (0 — oson ko'chiladi, 2 — qiyin), natija esa hisob-kitob. Blok brauzerda jonli:

js
const vaznlar = {
  malumot: 3, sorov: 2, auth: 2, mantiq: 2, joylash: 1,
};

function lockInBali(ballar) {
  let jami = 0;
  let maks = 0;
  for (const [mezon, vazn] of Object.entries(vaznlar)) {
    jami += vazn * ballar[mezon];
    maks += vazn * 2;
  }
  return Math.round((jami / maks) * 100);
}

// misol baholar — o'z loyihangiz uchun qayta qo'ying
const variantlar = {
  "o'z backend":
    { malumot: 0, sorov: 0, auth: 0, mantiq: 0, joylash: 0 },
  "BaaS (SQL)":
    { malumot: 0, sorov: 1, auth: 1, mantiq: 1, joylash: 0 },
  "BaaS (NoSQL)":
    { malumot: 1, sorov: 2, auth: 1, mantiq: 2, joylash: 2 },
};
for (const [nom, ballar] of Object.entries(variantlar)) {
  console.log(`${nom}: ${lockInBali(ballar)}%`);
}

Konsolda:

text
o'z backend: 0%
BaaS (SQL): 30%
BaaS (NoSQL): 75%

Raqamlar — kiritilgan misol baholarining natijasi, haqiqiy xizmatlarning o'lchovi emas. Foydasi — muhokamani "menga yoqadi" dan "qaysi mezon bo'yicha" ga o'tkazish.

4.2 Adapter qatlami

Lock-in'ni kamaytirishning eng ishonchli yo'li — BaaS SDK'sini butun kodga sochmaslik. Repository naqshini eslang: vazifalar-api da Ombor interfeysi bor edi, xotira va Postgres versiyalari almashtirilardi. BaaS uchun ham xuddi shu: komponentlar taomlarOmbori.arzonlari(30000) ni chaqiradi, supabase.from(...) ni emas. Provayder almashsa — faqat bitta fayl o'zgaradi. 3-mashqda buni yozasiz.

Tekshirib ko'ring: Jamoa Firebase'da 2 yil ishladi, endi Postgres'ga o'tmoqchi. Eng qimmat qism nima bo'lishi ehtimoli katta?

Javob

Ma'lumot modeli va so'rovlar: Firestore hujjatlari Postgres jadvallariga qayta loyihalanadi, NoSQL uchun takrorlangan (denormalizatsiya qilingan) ma'lumot tozalanadi, Security Rules RLS yoki API kodiga qayta yoziladi. Agar SDK chaqiruvlari butun frontend bo'ylab sochilgan bo'lsa — har ekranni ham o'zgartirish kerak. Adapter qatlami bo'lsa, oxirgisi kichrayadi.

5. Qaror: yozamizmi yoki olamizmi

Vaziyat Tavsiya
Prototip, MVP, xakaton BaaS (Supabase yoki PocketBase)
Mobil ilova, offline kerak Firebase yoki Supabase
Kontent sayti, tahrirlovchilar ko'p headless CMS (Payload, Strapi)
Murakkab biznes mantiq, to'lov, integratsiyalar o'z backend
Ma'lumotlar O'zbekiston hududida saqlanishi shart o'z server yoki o'z serverda ishlaydigan BaaS

Oxirgi qatorga e'tibor bering: shaxsiy ma'lumotlarni saqlash joyi bo'yicha qonun talablari (31-qismda batafsil) bulutli BaaS'ni cheklashi mumkin. Bunday holda o'z serverda ishlaydigan variantlar (Supabase self-host, Appwrite, PocketBase, Directus) qoladi.

Gibrid yo'l ham keng tarqalgan: auth va fayllar — BaaS'da, to'lov va murakkab mantiq — o'z API'ngizda (masalan Supabase Edge Functions yoki alohida Hono servisi).

6. Ko'p uchraydigan xatolar

Xato Oqibat Davosi
RLS yoqilmagan ommaviy kalit bilan butun jadval ochiq har jadvalda RLS + siyosat
service_role (maxfiy) kalit frontendda to'liq huquq hammaga maxfiy kalit faqat serverda
SDK chaqiruvlari hamma joyda ko'chish juda qimmat adapter (ombor) qatlami
Litsenziya o'qilmagan kutilmagan to'lov yoki cheklov litsenziya va narxni tanlovdan oldin
Bepul tarif limiti unutilgan o'sish paytida to'xtash limitlar va narxni oldindan hisoblash
"Backend yozish shart emas" deb mantiqni frontendda qilish narxni mijoz o'zgartiradi ishonchli mantiq — server yoki baza siyosatida

7. Mashqlar

Mashqlar kurs/mashqlar/29/69-baas/ da. Yechimlar toza JavaScript — hech qanday akkaunt kerak emas.

1-mashq (oson): bo'shliqlarni to'ldiring

  • Backend'ni tayyor xizmat sifatida beradigan platforma —
  • Supabase'da qatorlarni foydalanuvchi bo'yicha cheklaydigan Postgres imkoniyati —
  • Bitta fayldagi, SQLite asosidagi backend —
  • Next.js ilovasining /app papkasiga o'rnatiladigan CMS —
  • Boshqa yechimga o'tish narxi —
Yechim
  • BaaS — Backend as a Service.
  • RLS — Row Level Security.
  • PocketBase — Go, SQLite, bitta fayl.
  • Payload — Next.js native CMS.
  • lock-in — provayderga bog'lanish.

2-mashq (o'rta): RLS siyosatini modellang

Supabase siyosati USING (auth.uid() = foydalanuvchi_id) ni JavaScript'da modellang: korinadigan(qatorlar, uid, rlsYoqilgan) — RLS o'chiq bo'lsa hamma qatorni, yoqilgan bo'lsa faqat foydalanuvchi_id === uid larni qaytarsin; uid null (tizimga kirmagan) bo'lsa va RLS yoqilgan — bo'sh massiv. Buyurtmalar: Ali (u1) — 2 ta, Malika (u2) — 1 ta. Uch holatni sinang: RLS o'chiq + kirmagan, RLS yoqilgan + u2, RLS yoqilgan + kirmagan. Natijada faqat buyurtma ID'larini chiqaring. Ishora: filter, map.

Yechim
js
const buyurtmalar = [
  { id: 1, foydalanuvchi_id: "u1", taom: "Osh" },
  { id: 2, foydalanuvchi_id: "u2", taom: "Manti" },
  { id: 3, foydalanuvchi_id: "u1", taom: "Lag'mon" },
];

function korinadigan(qatorlar, uid, rlsYoqilgan) {
  if (!rlsYoqilgan) return qatorlar;
  if (uid === null) return [];
  return qatorlar.filter((q) => q.foydalanuvchi_id === uid);
}

const idlar = (q) => q.map((x) => x.id);
console.log("RLS o'chiq, kirmagan:",
  idlar(korinadigan(buyurtmalar, null, false)));
console.log("RLS, Malika:",
  idlar(korinadigan(buyurtmalar, "u2", true)));
console.log("RLS, kirmagan:",
  idlar(korinadigan(buyurtmalar, null, true)));

Konsolda:

text
RLS o'chiq, kirmagan: [ 1, 2, 3 ]
RLS, Malika: [ 2 ]
RLS, kirmagan: []

Birinchi qator — "RLS'ni unutish" xatosining o'zi: tizimga kirmagan odam hamma buyurtmani ko'rdi. Haqiqiy Postgres'da auth.uid() null bo'lsa, null = 'u1' taqqoslashi true emas — qator ko'rinmaydi; modelimiz shuni takrorlaydi.

3-mashq (qiyin): adapter qatlami

taomlarOmbori interfeysini yozing: arzonlari(maks) — narxi maks dan oshmaydigan taomlar, narx bo'yicha o'sib borish tartibida; qosh(taom) — yangi taom, ID bilan qaytaradi. Ikki amalga oshirish yasang: (1) xotiraOmbori() — massivda; (2) soxtaBaasOmbori(sdk) — BaaS SDK'siga o'xshash soxta obyekt orqali (sdk.from(jadval).select().lte(ustun, qiymat).order(ustun) → { data, error }). Ilova funksiyasi menyuMatni(ombor) qaysi omborni olganini bilmasin. Ikkalasi bilan bir xil natija chiqaring. Ishora: soxta SDK — zanjir metodlari this qaytaradi, oxirida then o'rniga oddiy natija() usuli yetarli.

Yechim
js
const boshlangich = [
  { nom: "Osh", narx: 35000 },
  { nom: "Lag'mon", narx: 28000 },
  { nom: "Manti", narx: 30000 },
];

function xotiraOmbori(royxat) {
  const taomlar = royxat.map((t, i) => ({ id: i + 1, ...t }));
  return {
    async arzonlari(maks) {
      return taomlar.filter((t) => t.narx <= maks)
        .sort((a, b) => a.narx - b.narx);
    },
    async qosh(taom) {
      const yangi = { id: taomlar.length + 1, ...taom };
      taomlar.push(yangi);
      return yangi;
    },
  };
}

function soxtaSdk(royxat) {
  const jadval = royxat.map((t, i) => ({ id: i + 1, ...t }));
  return {
    from() {
      let q = [...jadval];
      return {
        select() { return this; },
        lte(ustun, v) {
          q = q.filter((t) => t[ustun] <= v);
          return this;
        },
        order(ustun) {
          q.sort((a, b) => a[ustun] - b[ustun]);
          return this;
        },
        natija() { return { data: q, error: null }; },
        insert(taom) {
          const yangi = { id: jadval.length + 1, ...taom };
          jadval.push(yangi);
          return { data: yangi, error: null };
        },
      };
    },
  };
}

function soxtaBaasOmbori(sdk) {
  return {
    async arzonlari(maks) {
      const { data, error } = sdk.from("taomlar").select()
        .lte("narx", maks).order("narx").natija();
      if (error) throw error;
      return data;
    },
    async qosh(taom) {
      const { data, error } = sdk.from("taomlar").insert(taom);
      if (error) throw error;
      return data;
    },
  };
}

async function menyuMatni(ombor) {
  await ombor.qosh({ nom: "Ko'k choy", narx: 5000 });
  const r = await ombor.arzonlari(30000);
  return r.map((t) => `${t.nom} ${t.narx}`).join(", ");
}

console.log(await menyuMatni(xotiraOmbori(boshlangich)));
console.log(await menyuMatni(soxtaBaasOmbori(soxtaSdk(boshlangich))));

Konsolda:

text
Ko'k choy 5000, Lag'mon 28000, Manti 30000
Ko'k choy 5000, Lag'mon 28000, Manti 30000

menyuMatni ikkalasida bir xil ishladi va SDK haqida hech narsa bilmaydi. Haqiqiy loyihada soxtaSdk o'rniga haqiqiy BaaS klienti turadi; testlarda esa xotiraOmbori — bu Mock, stub, spy va fake darsidagi "fake".

8. Loyiha qadami: hujjat bo'yicha, loyihaga kirmaydi

Bu dars kanonda sinalmagan: Supabase, Firebase, Appwrite, PocketBase, Strapi, Payload va Directus akkaunt yoki alohida server (binar, konteyner) talab qiladi; kurs qoidasiga ko'ra haqiqiy hisob ochilmaydi, disk ham cheklangan edi. Darsdagi faktlar — rasmiy hujjatlar va repozitoriylardan, sana bilan.

Nega loyihaga kirmaydi? vazifalar-api ni biz ataylab o'zimiz yozdik — backend qanday ishlashini ichidan bilish uchun. BaaS bu bilimni o'rnini bosmaydi: RLS, pooler, presigned URL, webhook imzosi — BaaS ichida ham aynan shu tushunchalar ishlaydi, faqat yashirin. Ularni bilgan dasturchi BaaS'ni ham xavfsiz sozlaydi.

O'zingiz sinab ko'ring: 3-mashqdagi menyuMatni ni o'zgartirmasdan uchinchi ombor qo'shing — masalan, Map asosidagi yoki node:sqlite (Bun runtime darsidagi 3-mashq) asosidagi.

9. Real ishda

  • Startaplar va MVP — Supabase yoki Firebase bilan bir necha haftada ishga tushirish.
  • Agentlik loyihalari — mijoz kontentni o'zi tahrirlashi uchun headless CMS.
  • Ichki vositalar — PocketBase yoki Directus bilan tez admin panel.
  • Intervyuda: "BaaS'ni qachon tanlamaysiz?", "Supabase'da xavfsizlik qayerda?", "Lock-in'ni qanday kamaytirasiz?"

Xulosa

  • BaaS — baza, auth, fayl va realtime tayyor xizmat sifatida; frontend SDK bilan to'g'ridan ishlaydi.
  • Supabase — Postgres + PostgREST + Auth + Storage + Realtime; xavfsizlik RLS siyosatlarida — RLS o'chiq bo'lsa jadval ochiq.
  • Firebase — NoSQL va Google ekotizimi, lock-in kuchli; Appwrite va PocketBase — ochiq kodli, o'z serverda ishlaydi.
  • Headless CMS (Strapi, Payload, Directus) — kontentni admin panelda tahrirlash va API orqali berish; litsenziyani o'qing.
  • Lock-in'ni mezonlar bilan baholang va SDK'ni adapter (ombor) qatlami ortiga yashiring.

Keyingi qism: NestJS nima va nega — 30-qismda modullar, dependency injection va dekoratorlar asosidagi "hammasi tartibli" Node freymvorkini boshlaymiz.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!