Mundarija (26)
- Bu darsda
- 1. Nega bu kerak?
- 2. BaaS: to'rt asosiy vakil
- 2.1 Supabase
- 2.2 Firebase
- 2.3 Appwrite
- 2.4 PocketBase
- 2.5 Taqqoslash
- 3. Headless CMS
- 3.1 Strapi
- 3.2 Payload
- 3.3 Directus
- 3.4 Qachon headless CMS
- 4. Lock-in narxini baholash
- 4.1 Mezonlar
- 4.2 Adapter qatlami
- 5. Qaror: yozamizmi yoki olamizmi
- 6. Ko'p uchraydigan xatolar
- 7. Mashqlar
- 1-mashq (oson): bo'shliqlarni to'ldiring
- 2-mashq (o'rta): RLS siyosatini modellang
- 3-mashq (qiyin): adapter qatlami
- 8. Loyiha qadami: hujjat bo'yicha, loyihaga kirmaydi
- 9. Real ishda
- Xulosa
- Manbalar
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"]
endDiagrammaga 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):
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:
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:
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:
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
/apppapkasiga 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
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:
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
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:
Ko'k choy 5000, Lag'mon 28000, Manti 30000
Ko'k choy 5000, Lag'mon 28000, Manti 30000menyuMatni 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
- Supabase arxitekturasi: https://supabase.com/docs/guides/getting-started/architecture
- Supabase Row Level Security: https://supabase.com/docs/guides/database/postgres/row-level-security
- Firebase hujjati: https://firebase.google.com/docs
- Appwrite hujjati: https://appwrite.io/docs
- PocketBase: https://github.com/pocketbase/pocketbase · https://pocketbase.io/docs/
- Strapi: https://docs.strapi.io/
- Payload: https://github.com/payloadcms/payload · https://payloadcms.com/docs
- Directus (litsenziya va qo'llab-quvvatlanadigan bazalar): https://github.com/directus/directus
- Paket versiyalari — npm reyestri, 2026-10-28. Kanonda hech biri sinalmagan; JavaScript bloklari — biz ishga tushirdik (Node 24.21.0).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!