Mundarija (26)
- Bu darsda
- 1. Nega bu kerak?
- 2. O'rnatish va birinchi fayl
- 2.1 O'rnatish
- 2.2 TypeScript to'g'ridan
- 3. Paket menejeri: bun install
- 3.1 bun add va bun.lock
- 3.2 Lifecycle skriptlar sukutda o'chiq
- 4. Ma'lumotlar bazasi: bun:sqlite va Bun.sql
- 4.1 bun:sqlite
- 4.2 Bun.sql — Postgres
- 5. Test: bun test
- 6. Node bilan moslik
- 6.1 O'lchov
- 6.2 Lekin hammasi emas
- 7. Tezlik: raqamlar va ularning chegarasi
- 8. Prodakshnda Bun: qachon va qachon emas
- 9. Ko'p uchraydigan xatolar
- 10. Mashqlar
- 1-mashq (oson): bo'shliqlarni to'ldiring
- 2-mashq (o'rta): routes ni o'zingiz yozing
- 3-mashq (qiyin): bun:sqlite dan node:sqlite ga
- 11. Loyiha qadami: kanon tajribasi, loyihaga kirmaydi
- 12. Real ishda
- Xulosa
- Manbalar
Bun runtime: Node'ga muqobil — runtime, paket menejeri va test bitta faylda
Qisqacha: Bun — JavaScript va TypeScript'ni bajaradigan runtime, xuddi Node kabi. Farqi: bitta dastur ichida paket menejeri (
bun install), test runner (bun test), bundler (bun build) va SQLite/Postgres klientlari bor;.tsfaylni sozlamasiz ishga tushiradi. Kanon o'lchovidaBun.servebazasiz API'da Node'dagi Express'dan qariyb uch baravar ko'p so'rov o'tkazdi. Lekin Node bilan moslik to'liq emas — prodakshnga olishdan oldin o'z kodingizni sinang.
Bu darsda
- Bun'da
.tsfaylni to'g'ridan ishga tushirasiz vaBun.servebilan marshrutli server yozasiz. bun add,bun.lockva lifecycle skriptlar qoidasini bilasiz.bun:sqlitevabun testbilan ishlaysiz,Bun.sqlnima ekanini bilasiz.- Node API'lari Bun'da qanchalik ishlashini o'lchov va hujjat bilan baholaysiz.
- Bun'ni qachon tanlash va qachon ehtiyot bo'lishni asoslaysiz.
Oldin bilishingiz kerak: Node.js nima: runtime, V8 va libuv, Node'ning yangi o'rnatilgan imkoniyatlari, TypeScript'ni Node'da to'g'ridan ishga tushirish, node:test va node:assert.
Oldingi darsda Elysia'ni Bun'da ishga tushirdik va "farqni runtime berdi" dedik. Endi shu runtime'ning o'zi.
1. Nega bu kerak?
24-qism boshida Node'ni "runtime" deb atadik: V8 dvigateli + libuv + standart modullar. Node loyihasida odatda yana bir nechta vosita bor: npm (paketlar), Vitest yoki node:test (testlar), Vite yoki esbuild (build), tsx (TypeScript). Har biri alohida o'rnatiladi va sozlanadi.
Bun bu vositalarni bitta dasturga yig'adi:
flowchart TB
B["bun (bitta dastur)"] --> R["runtime: bun run"]
B --> P["paket menejeri: bun install"]
B --> T["test runner: bun test"]
B --> U["bundler: bun build"]
R --> J["JavaScriptCore dvigateli"]
R --> A["Bun.serve, bun:sqlite, Bun.sql"]Diagrammaga qarang: Bun V8 emas, JavaScriptCore dvigatelida ishlaydi (Safari brauzerining dvigateli) va Zig tilida yozilgan. Ya'ni bu Node'ning "tezlashtirilgan nusxasi" emas — butunlay boshqa dastur, Node API'larini taqlid qiladi.
O'xshatish: Node — oshxonadagi alohida plita, alohida pichoq, alohida tarozi. Bun — hammasi bitta korpusdagi oshxona kombayni: qulay va tez, lekin ba'zi eski retseptlar unda boshqacha chiqishi mumkin.
2. O'rnatish va birinchi fayl
2.1 O'rnatish
Bun rasmiy saytidagi o'rnatuvchi yoki npm orqali o'rnatiladi (npm i -g bun). Kanon mashinasida Bun 1.4.3 (npm global). Versiyani tekshirish:
bun --version1.4.32.2 TypeScript to'g'ridan
TypeScript'ni Node'da ishga tushirganda Node tiplarni "o'chirar" edi, ba'zi sintaksis (enum) uchun bayroq kerak edi. Bun .ts, .tsx va .jsx ni sozlamasiz bajaradi. Lekin u ham tip tekshirmaydi — tsc --noEmit baribir kerak.
Quyidagi fayl — vazifalar API'sining kichik nusxasi Bun.serve da. Biz bun server.ts bilan ishga tushirdik (Bun 1.4.3):
type Vazifa = { id: number; matn: string };
const vazifalar: Vazifa[] = [{ id: 1, matn: "Non olish" }];
const server = Bun.serve({
port: 0,
hostname: "127.0.0.1",
routes: {
"/v1/vazifalar": {
GET: () => Response.json(vazifalar),
POST: async (req) => {
const j = (await req.json().catch(() => ({}))) as {
matn?: unknown;
};
if (typeof j.matn !== "string" || !j.matn.trim()) {
return Response.json({ xato: "matn" }, { status: 400 });
}
const v = { id: vazifalar.length + 1, matn: j.matn.trim() };
vazifalar.push(v);
return Response.json(v, { status: 201 });
},
},
"/v1/vazifalar/:id": (req) => {
const id = Number(req.params.id);
const v = vazifalar.find((x) => x.id === id);
if (!v) return new Response("yo'q", { status: 404 });
return Response.json(v);
},
},
fetch: () => new Response("Topilmadi", { status: 404 }),
});
const url = `http://127.0.0.1:${server.port}/v1/vazifalar`;
const yubor = (matn: string) => fetch(url, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ matn }),
});
let r = await yubor(" Kitob o'qish ");
console.log(r.status, await r.text());
r = await yubor("");
console.log(r.status, await r.text());
r = await fetch(`${url}/2`);
console.log(r.status, await r.text());
r = await fetch(`http://127.0.0.1:${server.port}/boshqa`);
console.log(r.status, await r.text());
await server.stop();Konsolda:
201 {"id":2,"matn":"Kitob o'qish"}
400 {"xato":"matn"}
200 {"id":2,"matn":"Kitob o'qish"}
404 TopilmadiUchta yangi narsa:
routes— Bun'ning o'rnatilgan routeri: yo'l → funksiya yoki{ GET, POST }obyekti.:idparametrireq.params.idda.fetch— hech bir marshrutga tushmagan so'rov uchun. Bu — Hono darsidagi "fetch handler" ning o'zi.port: 0— tasodifiy bo'sh port,server.portuni beradi;server.stop()— yopish.
Express ham, Hono ham kerak bo'lmadi. Kichik API uchun Bun.serve yetarli.
3. Paket menejeri: bun install
3.1 bun add va bun.lock
Bun npm reyestridagi paketlarni o'rnatadi va package.json ni tushunadi. Biz bo'sh papkada sinadik. Chiqishning oxirgi ikki qatoriga qarang — nima o'rnatildi va qancha vaqtda:
bun add hono@4.13.13bun add v1.4.3 (c6da4a4d3)
Resolving dependencies
Resolved, downloaded and extracted [4]
Saved lockfile
installed hono@4.13.13
1 package installed [2.45s]Vaqt (2.45 s) — tarmoq va keshga bog'liq, har safar boshqacha. Natijada node_modules (npm bilan bir xil tuzilma) va bun.lock paydo bo'ldi. bun.lock — matnli fayl (JSON'ga o'xshash), git'da ko'rib chiqsa bo'ladi:
{
"lockfileVersion": 2,
"configVersion": 1,
"workspaces": {
"": {
"name": "bun-sinov",
"dependencies": {
"hono": "4.13.13",
},
},
},
"packages": {
"hono": ["hono@4.13.13", "", {}, "sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA=="],
}
}Oxirgi qatordagi sha512-… — paketning integrity hash'i, package-lock.json dagi kabi (npm darslaridagi lock-fayl g'oyasi). Bitta loyihada bitta paket menejeri bo'lsin: package-lock.json va bun.lock ikkalasi turgan loyiha — har kompyuterda boshqa versiya degani.
3.2 Lifecycle skriptlar sukutda o'chiq
npm postinstall kabi skriptlarni sukutda bajaradi — zararli paket o'rnatilishi bilan kod ishga tushiradi. Bun boshqacha: rasmiy hujjatga ko'ra (bun.com/docs, "Lifecycle scripts", 2026-10-28) Bun "default-secure" — skriptlar faqat ruxsat ro'yxatidagi paketlar uchun bajariladi. Ro'yxat — mashhur paketlarning tayyor ro'yxati yoki package.json dagi trustedDependencies:
{
"trustedDependencies": ["sharp"]
}Diqqat: trustedDependencies yozsangiz, u tayyor ro'yxatni almashtiradi, kengaytirmaydi. Paket "o'rnatildi, lekin ishlamayapti" (masalan, binar yuklanmadi) bo'lsa — sabab ko'pincha shu.
Tekshirib ko'ring: Bun skriptlarni bajarmasligi xavfsizlik uchun yaxshi. Bu qanday muammo tug'dirishi mumkin?
Javob
Ba'zi paketlar o'rnatilganda o'z binarini yuklab oladi yoki kompilyatsiya qiladi (postinstall). Skript bajarilmasa, paket "o'rnatilgan" ko'rinadi, lekin ishga tushirganda "binar topilmadi" xatosi chiqadi. Yechim — o'sha paketni trustedDependencies ga ongli ravishda qo'shish.
4. Ma'lumotlar bazasi: bun:sqlite va Bun.sql
4.1 bun:sqlite
Bun ichida SQLite klienti bor. SQLite — bitta fayldagi (yoki xotiradagi) SQL baza, server kerak emas. Biz ishga tushirdik:
import { Database } from "bun:sqlite";
const db = new Database(":memory:");
db.run("CREATE TABLE vazifalar (id INTEGER PRIMARY KEY, matn TEXT)");
const qosh = db.prepare("INSERT INTO vazifalar (matn) VALUES (?)");
const kop = db.transaction((matnlar: string[]) => {
for (const m of matnlar) qosh.run(m);
});
kop(["Non olish", "Kitob o'qish", "Sport"]);
const topish = db.query(
"SELECT id, matn FROM vazifalar WHERE matn LIKE ?",
);
console.log(topish.all("%olish%"));
console.log(db.query("SELECT count(*) AS n FROM vazifalar").get());Konsolda (Bun obyektlarni o'z formatida chiqaradi — har maydon alohida qatorda):
[
{
id: 1,
matn: "Non olish",
}
]
{
n: 3,
}? — parametr (SQL injection dan himoya, pg dagi $1 kabi). db.transaction(fn) — funksiyani bitta tranzaksiyaga o'raydi: ichida xato bo'lsa hammasi bekor.
Kanon tajribasida 100 000 qator bitta tranzaksiyada yozildi: ikki ishga tushirishda 83 ms va 147 ms (Bun 1.4.3). Ikki o'lchov orasidagi farq — kompyuter yuklamasi; tartib bir xil: yuz ming qator — soniyaning o'ndan biri atrofida.
Maslahat: Node 24 da ham o'rnatilgan SQLite bor —
node:sqlite(Node'ning yangi o'rnatilgan imkoniyatlari). 3-mashqda yuqoridagi kodni unga ko'chirasiz. Bun hujjatinode:sqliteni Bun'da ham "to'liq amalga oshirilgan" deydi — biz tekshirdik, ishladi.
4.2 Bun.sql — Postgres
Bun.sql — Bun ichidagi Postgres klienti (pg paketisiz). So'rov tagged template bilan yoziladi, qiymatlar avtomatik parametrga aylanadi:
import { SQL } from "bun";
const sql = new SQL(process.env.DATABASE_URL);
const r = await sql`SELECT count(*)::int AS n, version() AS v
FROM vazifalar`;
console.log("Bun.sql:", r[0].n, "vazifa,",
r[0].v.split(" ").slice(0, 2).join(" "));
await sql.close();Kanon natijasi (Postgres 18.6, Docker; biz Docker'ni yoqmadik, chiqish — kanon yozuvidan aynan). Ikki qatorga qarang — biri Bun.sql, biri oddiy pg paketi:
Bun.sql: 48 vazifa, PostgreSQL 18.6
pg paketi Bun'da: 1Ikkinchi qator — kanon bir xil skriptda oddiy pg paketini ham Bun'da ishlatgan: u ham ulandi. Ya'ni 26–27-qismdagi pg kodingiz Bun'da ham ishlashi mumkin.
5. Test: bun test
bun test — Jest uslubidagi test runner (describe, test, expect), Bun ichida. Fayl *.test.ts nomli bo'lsa, o'zi topadi:
// fayl: hisob.test.ts
import { test, expect, describe } from "bun:test";
import { tiyinga } from "./hisob.ts";
describe("tiyinga", () => {
test("butun so'm", () => {
expect(tiyinga(35000)).toBe(3500000);
});
test("kasr so'm", () => {
expect(tiyinga(0.1 + 0.2)).toBe(30);
});
});hisob.ts dagi funksiya — Math.round(som * 100) (Pul bilan ishlash JS'da darsidagi tiyin g'oyasi). bun test natijasi (biz ishga tushirdik):
bun test v1.4.3 (c6da4a4d3)
2 pass
0 fail
2 expect() calls
Ran 2 tests across 1 file. [32.00ms]Vaqt har safar boshqa. Vitest'dagi vi.fn, vi.mock o'rnida mock() va mock.module() bor (hujjat bo'yicha). Lekin bun test — Vitest emas: konfiguratsiya, plaginlar va ba'zi matcher'lar farq qiladi. Jamoa Vitest'da bo'lsa, Bun'da ham Vitest'ni ishlatish mumkin.
6. Node bilan moslik
6.1 O'lchov
Bun'ning eng katta va'dasi: "Node kodingiz o'zgarmay ishlaydi". Biz Node modullarini Bun'da sinadik — node:http server, node:fs/promises, node:crypto, AsyncLocalStorage:
import { createServer } from "node:http";
import { readFile } from "node:fs/promises";
import { createHash } from "node:crypto";
import { AsyncLocalStorage } from "node:async_hooks";
const s = createServer((req, res) => res.end("node:http Bun'da"));
await new Promise((ok) => s.listen(0, "127.0.0.1", ok));
const r = await fetch(`http://127.0.0.1:${s.address().port}/`);
console.log(await r.text());
s.close();
console.log((await readFile("hisob.ts", "utf8")).length);
const xesh = createHash("sha256").update("a").digest("hex");
console.log(xesh.slice(0, 12));
const als = new AsyncLocalStorage();
als.run({ id: "so'rov-1" }, async () => {
await null;
console.log(als.getStore().id);
});bun nodecompat.mjs natijasi:
node:http Bun'da
81
ca978112ca1b
so'rov-1Hammasi ishladi. ca978112ca1b — "a" ning SHA-256 hash'i boshi; kanon tajribasida ham aynan shu qiymat chiqqan. Express, Hono, Koa, Elysia, pg — kanonda Bun'da ishladi.
6.2 Lekin hammasi emas
Bun hujjatidagi moslik jadvali (bun.com/docs, "Node.js compatibility", 2026-10-28):
| Holat | Modullar (namuna) |
|---|---|
| to'liq | fs, http, http2, net, path, stream, zlib, events, vm, sqlite |
| qisman | crypto, child_process, cluster, worker_threads, async_hooks, tls, inspector, test |
| yo'q | sea (bitta faylli ilova) |
"Qisman" — eng ko'p ishlatiladigan qismi ishlaydi, chekka holatlar farq qilishi mumkin. Masalan, hujjatga ko'ra worker_threads dagi Worker resourceLimits sozlamasini e'tiborsiz qoldiradi. Sizning kodingiz aynan shu chekkaga tayansa — xato jim bo'ladi.
Diqqat: Prodakshnga olishdan oldin o'z test to'plamingizni Bun'da to'liq ishga tushiring. "Node'da ishlaydi" — "Bun'da ishlaydi" degani emas. Native addon'lar (C++ modullar),
node:inspectorasosidagi profilerlar va APM agentlari eng ko'p muammo beradigan joylar.
7. Tezlik: raqamlar va ularning chegarasi
- Express (Node 24)start 300 ms10 698 req/s
- Hono (Node 24)start 300 ms21 634 req/s
- Hono (Bun)start 118 ms26 325 req/s
- Bun.servestart 120 ms30 430 req/s
Manba: IlmHamroh kanon o'lchovi, 2026-10-27: Bun 1.4.3, Node 24.21.0, autocannon 8.0.0, 50 ulanish, 5 s, Windows 11, i5-12500H; bazasiz
Ikki narsa ko'rinadi:
- Ishga tushish — Bun'da ~120 ms, Node'da ~300 ms. Bu CLI vositalar va serverless "sovuq start" uchun muhim (Serverless va edge).
- O'tkazuvchanlik — bir xil Hono kodi Bun'da 26 325, Node'da 21 634 so'rov/s.
Bun.servefreymvorksiz — 30 430.
Chegarasi: bu bo'sh API, bitta Windows mashinasi, bitta o'lchov (±10 %). Bazaga murojaat qiladigan haqiqiy API'da farq ancha kichik bo'ladi. Linux serverda raqamlar boshqacha (sinalmagan).
8. Prodakshnda Bun: qachon va qachon emas
| Bun mos | Ehtiyot bo'ling |
|---|---|
| yangi loyiha, kichik bog'liqliklar | katta eski loyiha, ko'p native paket |
| skriptlar, CLI, monorepo vositalari | APM, profiler, inspector ga tayanadigan vositalar |
bun install — faqat paket menejeri sifatida |
hosting Bun'ni qo'llab-quvvatlamasa |
tez test (bun test) |
jamoa Node'da, Bun tajribasi yo'q |
Oraliq yo'l ham bor: Bun'ni faqat paket menejeri yoki test runner sifatida ishlatib, ilovani Node'da yurgizish. Ko'p jamoalar shunday boshlaydi.
Tekshirib ko'ring: Loyihada
bcrypt(C++ native addon) vasharpbor. Bun'ga o'tishdan oldin nimani tekshirasiz?
Javob
Native addon'lar Bun'da ishlashini (Bun Node-API'ni qo'llab-quvvatlaydi, lekin har paket alohida sinaladi), ularning postinstall skriptlari trustedDependencies da ekanini va to'liq test to'plami Bun'da o'tishini. Bundan tashqari — prod hosting va monitoring vositalari Bun'ni qo'llab-quvvatlashini.
9. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
| Paket o'rnatildi, lekin binar yo'q | lifecycle skript bajarilmagan | trustedDependencies |
| Ikki lock-fayl, versiyalar har xil | npm va bun aralash | bitta paket menejeri |
Tip xatosi bor, lekin bun ishga tushirdi |
Bun tip tekshirmaydi | tsc --noEmit CI'da |
Bun is not defined |
Bun.serve kodi Node'da ishga tushirildi |
runtime'ni tekshiring yoki Hono ishlating |
Vitest konfiguratsiyasi bun test da ishlamaydi |
boshqa runner | bunx vitest yoki bun test uchun qayta yozing |
| Node'da ishlagan chekka holat Bun'da boshqacha | "qisman" modul | o'z testlaringizni Bun'da yurgizing |
10. Mashqlar
Mashqlar kurs/mashqlar/29/66-bun/ da. Yechimlar Node 24 da ham ishlaydi (Bun'da ham sinashingiz mumkin).
1-mashq (oson): bo'shliqlarni to'ldiring
- Bun qaysi JavaScript dvigatelida ishlaydi —
- Bun'ning matnli lock-fayli —
- Lifecycle skriptlarga ruxsat beriladigan
package.jsonmaydoni — - Bun ichidagi SQLite moduli —
bun: - Bun
.tsfaylni bajaradi, lekin tiplarni
Yechim
- JavaScriptCore — Safari dvigateli (Node'da V8).
- bun.lock — matnli, git'da o'qiladi.
- trustedDependencies — tayyor ro'yxatni almashtiradi.
- sqlite —
import { Database } from "bun:sqlite". - tekshirmaydi —
tsc --noEmitkerak.
2-mashq (o'rta): routes ni o'zingiz yozing
Bun.serve dagi routes g'oyasini oddiy funksiyada yozing: marshrutla(routes) — Request oladigan va Response qaytaradigan funksiya qaytarsin. routes kaliti — yo'l (/v1/taomlar yoki /v1/taomlar/:id), qiymati — { GET: fn } obyekti. Parametr req.params ga yozilsin; mos yo'l topilmasa — 404, yo'l bor-u metod yo'q bo'lsa — 405. Uch so'rov bilan sinang. Ishora: yo'lni split("/") qilib qismlarni solishtiring; : bilan boshlangan qism — parametr. Bu funksiya faqat Web API'lardan foydalanadi, Node va Bun'da bir xil ishlaydi.
Yechim
function marshrutla(routes) {
const jadval = Object.entries(routes).map(([yol, ishlov]) => ({
qismlar: yol.split("/"),
ishlov,
}));
return async (req) => {
const qismlar = new URL(req.url).pathname.split("/");
for (const m of jadval) {
if (m.qismlar.length !== qismlar.length) continue;
const params = {};
const mos = m.qismlar.every((q, i) => {
if (q.startsWith(":")) {
params[q.slice(1)] = qismlar[i];
return true;
}
return q === qismlar[i];
});
if (!mos) continue;
const fn = m.ishlov[req.method];
if (!fn) return new Response("Metod yo'q", { status: 405 });
req.params = params;
return fn(req);
}
return new Response("Topilmadi", { status: 404 });
};
}
const taomlar = [{ id: 1, nom: "Osh" }, { id: 2, nom: "Manti" }];
const ishlov = marshrutla({
"/v1/taomlar": { GET: () => Response.json(taomlar) },
"/v1/taomlar/:id": {
GET: (req) => Response.json(
taomlar.find((t) => t.id === Number(req.params.id)) ?? null,
),
},
});
const B = "http://localhost";
for (const [metod, yol] of [["GET", "/v1/taomlar/2"],
["DELETE", "/v1/taomlar"], ["GET", "/v1/ichimlik"]]) {
const r = await ishlov(new Request(B + yol, { method: metod }));
console.log(metod, yol, r.status, await r.text());
}Konsolda:
GET /v1/taomlar/2 200 {"id":2,"nom":"Manti"}
DELETE /v1/taomlar 405 Metod yo'q
GET /v1/ichimlik 404 TopilmadiBun.serve buni ichkarida, tezroq tuzilma bilan qiladi va bir nechta mos yo'ldan eng aniqini tanlaydi. G'oya esa shu.
3-mashq (qiyin): bun:sqlite dan node:sqlite ga
Darsdagi bun:sqlite kodini Node 24 dagi node:sqlite ga ko'chiring: DatabaseSync, exec, prepare. node:sqlite da db.transaction() yo'q — BEGIN/COMMIT/ROLLBACK ni o'zingiz yozing (xatoda ROLLBACK va xatoni qayta otish). So'rov o'sha: LIKE "%olish%" va count(*). Ishora: exec — natijasiz SQL, prepare(sql).all(...) / .get() — natijali.
Yechim
import { DatabaseSync } from "node:sqlite";
const db = new DatabaseSync(":memory:");
db.exec("CREATE TABLE vazifalar (id INTEGER PRIMARY KEY, matn TEXT)");
const qosh = db.prepare("INSERT INTO vazifalar (matn) VALUES (?)");
function kopQosh(matnlar) {
db.exec("BEGIN");
try {
for (const m of matnlar) qosh.run(m);
db.exec("COMMIT");
} catch (e) {
db.exec("ROLLBACK");
throw e;
}
}
kopQosh(["Non olish", "Kitob o'qish", "Sport"]);
const topish = db.prepare(
"SELECT id, matn FROM vazifalar WHERE matn LIKE ?",
);
console.log(topish.all("%olish%"));
console.log(db.prepare("SELECT count(*) AS n FROM vazifalar").get());Konsolda:
[ [Object: null prototype] { id: 1, matn: 'Non olish' } ]
[Object: null prototype] { n: 3 }[Object: null prototype] — node:sqlite qatorlarni prototipsiz obyekt qilib qaytaradi (toString kabi meros xususiyatlarsiz). Biz shu faylni Bun 1.4.3 da ham ishga tushirdik — natija bir xil ma'noda, faqat Bun formatida (har maydon alohida qatorda). Bitta kod ikki runtime'da — node: modullarining afzalligi.
11. Loyiha qadami: kanon tajribasi, loyihaga kirmaydi
vazifalar-api Node 24 da qoladi. Kanon Bun 1.4.3 ni tajribada sinadi: Bun.serve (30 430 so'rov/s), Hono va Elysia Bun'da, bun:sqlite 100 000 qator, Bun.sql va pg Postgres 18.6 ga ulandi, node:crypto, bun test 2/2.
Nega loyihaga kirmaydi? Loyihada Prisma, BullMQ, sharp va boshqa ko'p bog'liqlik bor — har birini Bun'da alohida sinash kerak. 33-qismdagi Docker va server sozlamalari Node'ga mo'ljallangan. Foyda (bazali API'da kichik tezlik) xavfdan kichik. Lekin Bun'ni bilish shart: yangi kichik servis yoki skript uchun u juda qulay.
O'zingiz sinab ko'ring: Bun'ni o'rnatib, darsdagi server.ts ni bun server.ts bilan, so'ng 3-mashq faylini avval node, keyin bun bilan ishga tushiring.
12. Real ishda
- Bun paket menejeri sifatida — tez o'rnatish uchun Node loyihalarida ham ishlatiladi.
- Yangi startaplar — Bun + Hono yoki Elysia.
- Vercel Bun runtime'ni funksiyalar uchun qo'llab-quvvatlaydi (vercel.com/docs, "Functions Limits", 2026-10-28).
- Intervyuda: "Bun va Node farqi?", "Bun'ga o'tishdagi xavflar?", "Lifecycle skriptlar va xavfsizlik?"
Xulosa
- Bun — JavaScriptCore asosidagi runtime: runtime, paket menejeri, test runner va bundler bitta dasturda.
.tssozlamasiz ishlaydi, lekin tip tekshirilmaydi —tsc --noEmitkerak.Bun.serveda o'rnatilganroutes;bun:sqlite,Bun.sql— paketsiz baza klientlari.bun installlifecycle skriptlarni sukutda bajarmaydi —trustedDependencies.- Node moslik keng, lekin to'liq emas — o'z testlaringizni Bun'da yurgizing.
- Kanonda
Bun.serve30 430, Express 10 698 so'rov/s; start 120 va 300 ms (bazasiz).
Keyingi dars: Deno — xavfsizlikni birinchi o'ringa qo'ygan runtime: ruxsatlar, deno.json, npm: va JSR.
Manbalar
- Bun hujjati: https://bun.com/docs
- Bun.serve va routes: https://bun.com/docs/api/http
- bun:sqlite: https://bun.com/docs/api/sqlite · Bun.sql: https://bun.com/docs/api/sql
- Lifecycle scripts: https://bun.com/docs/pm/lifecycle
- Node.js compatibility: https://bun.com/docs/runtime/nodejs-compat
- Kanon tajribasi (IlmHamroh, 2026-10-27): Bun 1.4.3, Node 24.21.0, autocannon 8.0.0, Postgres 18.6.
Bun.servemarshrutlari,bun add,bun:sqlite,bun test, Node moslik va mashqlar — biz ishga tushirdik (2026-10-28, Bun 1.4.3, Node 24.21.0).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!