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

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; .ts faylni sozlamasiz ishga tushiradi. Kanon o'lchovida Bun.serve bazasiz 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 .ts faylni to'g'ridan ishga tushirasiz va Bun.serve bilan marshrutli server yozasiz.
  • bun add, bun.lock va lifecycle skriptlar qoidasini bilasiz.
  • bun:sqlite va bun test bilan ishlaysiz, Bun.sql nima 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:

bash
bun --version
text
1.4.3

2.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):

ts
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:

text
201 {"id":2,"matn":"Kitob o'qish"}
400 {"xato":"matn"}
200 {"id":2,"matn":"Kitob o'qish"}
404 Topilmadi

Uchta yangi narsa:

  • routes — Bun'ning o'rnatilgan routeri: yo'l → funksiya yoki { GET, POST } obyekti. :id parametri req.params.id da.
  • fetch — hech bir marshrutga tushmagan so'rov uchun. Bu — Hono darsidagi "fetch handler" ning o'zi.
  • port: 0 — tasodifiy bo'sh port, server.port uni 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:

bash
bun add hono@4.13.13
text
bun 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:

text
{
  "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:

json
{
  "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:

ts
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):

text
[
  {
    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 hujjati node:sqlite ni 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:

js
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:

text
Bun.sql: 48 vazifa, PostgreSQL 18.6
pg paketi Bun'da: 1

Ikkinchi 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:

ts
// 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):

text
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:

js
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:

text
node:http Bun'da
81
ca978112ca1b
so'rov-1

Hammasi 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:inspector asosidagi profilerlar va APM agentlari eng ko'p muammo beradigan joylar.

7. Tezlik: raqamlar va ularning chegarasi

Bir xil API: GET soniyasiga so'rov
  • 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:

  1. Ishga tushish — Bun'da ~120 ms, Node'da ~300 ms. Bu CLI vositalar va serverless "sovuq start" uchun muhim (Serverless va edge).
  2. O'tkazuvchanlik — bir xil Hono kodi Bun'da 26 325, Node'da 21 634 so'rov/s. Bun.serve freymvorksiz — 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) va sharp bor. 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.json maydoni —
  • Bun ichidagi SQLite moduli — bun:
  • Bun .ts faylni 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 --noEmit kerak.

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
js
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:

text
GET /v1/taomlar/2 200 {"id":2,"nom":"Manti"}
DELETE /v1/taomlar 405 Metod yo'q
GET /v1/ichimlik 404 Topilmadi

Bun.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
js
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:

text
[ [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.
  • .ts sozlamasiz ishlaydi, lekin tip tekshirilmaydi — tsc --noEmit kerak.
  • Bun.serve da o'rnatilgan routes; bun:sqlite, Bun.sql — paketsiz baza klientlari.
  • bun install lifecycle skriptlarni sukutda bajarmaydi — trustedDependencies.
  • Node moslik keng, lekin to'liq emas — o'z testlaringizni Bun'da yurgizing.
  • Kanonda Bun.serve 30 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

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

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