IlmHamroh
JavaScript Full-stack/24-qism. Node.js43/55-dars15 daqiqa
Mundarija (24)

Node.js yangi imkoniyatlari: node:sqlite, WebSocket, Temporal va paketsiz yechimlar

Qisqacha: Har Node versiyasi bir nechta npm paketini keraksiz qiladi. Node 24.21 da paketsiz ishlaydi: node:sqlite (SQLite ma'lumotlar bazasi, bayroqsiz va ogohlantirishsiz), global WebSocket klienti, URLPattern, navigator, import.meta.dirname, crypto.argon2Sync (parol hash'i), zlib.zstdCompressSync va V8 13.6 ning yangi JS metodlari (Array.fromAsync, RegExp.escape, Error.isError, Set amallari). Temporal Node 24 da faqat --harmony-temporal bayrog'i bilan, Node 26 da esa sukut bo'yicha. Map.prototype.getOrInsert va Iterator.concat Node 24.21 da hali yo'q — biz tekshirdik.

Bu darsda

  • node:sqlite bilan jadval yaratib, tayyorlangan so'rov (prepared statement) bilan yozib-o'qiysiz.
  • Global WebSocket klienti, URLPattern, navigator va import.meta.dirname ni Node'da ishlatasiz.
  • Yangi JS metodlarining qaysi biri Node 24 da bor, qaysisi yo'qligini tekshirish usulini bilasiz.
  • "Bu paket kerakmi yoki Node'da bormi?" degan savolga o'lchov va hujjat bilan javob bera olasiz.

Oldin bilishingiz kerak: Global obyektlar: Node va brauzer farqi, Built-in fetch va undici, crypto 2: parolni hash'lash, shifrlash va imzo, zlib: siqish, Temporal API.

1. Nega bu kerak?

Kichik loyihaga ma'lumotlar bazasi kerak bo'ldi — better-sqlite3 o'rnatiladi. U C++ da yozilgan, o'rnatishda kompilyatsiya qilinadi yoki tayyor ikkilik faylni yuklaydi. Windows'da bu ko'pincha birinchi muammo. WebSocket klienti uchun ws, URL naqshi uchun path-to-regexp, parol uchun argon2 — har biri yana bitta bog'liqlik.

Node har yili bunday paketlarning bir qismini ichiga oladi. Ularni bilmasangiz, keraksiz paket o'rnatasiz. Bilsangiz — loyiha yengilroq, xavfsizroq va o'rnatish tezroq (ta'minot zanjiri darsi).

O'xshatish: yangi telefon. Avval chiroq, kompas va QR o'quvchi uchun alohida ilova o'rnatardingiz. Endi hammasi tizimning o'zida. Eski ilovalar hali ishlaydi, lekin yangi telefonga ularni o'rnatish shart emas.

2. node:sqlite: o'rnatilgan ma'lumotlar bazasi

2.1 SQLite nima

SQLite — bitta faylda yashaydigan ma'lumotlar bazasi. Server kerak emas: dastur faylni o'zi o'qiydi va yozadi. Telefon ilovalari, brauzerlar va ko'p desktop dasturlar ichida SQLite bor. SQL tilini 26-qismda chuqur o'rganasiz — bugun faqat Node'dan qanday ulanishni ko'ramiz.

Node 24.21 ichida SQLite 3.53.4 (runtime darsidagi process.versions ro'yxatida bor). Modul — node:sqlite.

2.2 Birinchi jadval

Blok Node uchun — o'z terminalingizda ishga tushiring:

js
import { DatabaseSync } from "node:sqlite";

const db = new DatabaseSync(":memory:"); // fayl o'rniga xotirada
db.exec(`
  CREATE TABLE kurs (
    sana TEXT, kod TEXT, qiymat REAL,
    PRIMARY KEY (sana, kod)
  )
`);

const insert = db.prepare(
  "INSERT INTO kurs (sana, kod, qiymat) VALUES (?, ?, ?)",
);
insert.run("2026-10-22", "USD", 11965.51);
insert.run("2026-10-23", "USD", 11903.15);
insert.run("2026-10-23", "EUR", 13329.15);

const avg = db.prepare(
  "SELECT kod, AVG(qiymat) AS o, COUNT(*) AS n" +
    " FROM kurs GROUP BY kod",
);
console.log(avg.all());

const one = db.prepare(
  "SELECT qiymat FROM kurs WHERE sana = ? AND kod = ?",
);
console.log(one.get("2026-10-23", "EUR"));
console.log(one.get("2026-10-23", "GBP"));
db.close();

Konsolda:

text
[
  [Object: null prototype] { kod: 'EUR', o: 13329.15, n: 1 },
  [Object: null prototype] { kod: 'USD', o: 11934.33, n: 2 }
]
[Object: null prototype] { qiymat: 13329.15 }
undefined

Qatorma-qator:

  • new DatabaseSync(":memory:") — baza xotirada; dastur tugasa yo'qoladi. Fayl uchun — new DatabaseSync("kurslar.db").
  • db.exec(sql) — natija qaytarmaydigan buyruq (jadval yaratish).
  • db.prepare(sql) — tayyorlangan so'rov (prepared statement): SQL bir marta tahlil qilinadi, ? o'rniga qiymat keyin beriladi.
  • run(...) — yozish; all(...) — hamma qatorlar massivi; get(...) — birinchi qator yoki undefined.
  • [Object: null prototype] — qator obyekti prototipsiz yaratilgan (toString kabi meros metodlari yo'q). Ma'nosi oddiy obyekt bilan bir xil.

Nomi Sync bejiz emas: hamma amallar sinxron. Blocking darsidagi qoida shu yerda ham amal qiladi: CLI va skriptda joiz, ko'p mijozli serverda katta so'rov event loop'ni to'xtatadi.

2.3 Nega ? — xavfsizlik

Qiymatni SQL matniga qo'shib yozish mumkin edi: `… WHERE kod = '${kod}'`. Lekin kod foydalanuvchidan kelsa, u ' OR '1'='1 bo'lishi mumkin — so'rov ma'nosi o'zgaradi. Bu SQL injection — eng mashhur hujumlardan biri, 26-qismda batafsil. ? bilan qiymat hech qachon SQL kodi bo'lib qolmaydi — u faqat ma'lumot.

Diqqat: Kursdagi kod qoidamiz: SQL satrini birlashtirib yozmaymiz, hatto misolda ham. Faqat ? yoki nomli parametr ($kod).

2.4 Holati va qachon kerak

Hujjatga ko'ra node:sqlite — "Stability 1.2 — Release candidate" (24.15.0 dan). Bayroq 23.4.0 / 22.13.0 dan beri kerak emas. Kanon tekshiruvi: Node 24.21 da stderr bo'sh — ogohlantirish chiqmaydi. "Release candidate" — API deyarli tayyor, lekin kichik o'zgarishlar bo'lishi mumkin.

Ehtiyoj Nima tanlash
CLI kesh, sozlama, lokal jurnal node:sqlite yoki oddiy JSON
Desktop ilova (Electron) bazasi node:sqlite
Ko'p foydalanuvchili veb-server PostgreSQL (26-qism)
Eski Node (22.12 va oldin) better-sqlite3

valyuta uchun o'lchov. Kanon node:sqlite ni ishlatmadi. Kesh — bir nechta JSON fayl (kurslar-<kalit>.json, har biri ~25 KB): bitta kalit bo'yicha o'qish va yozish. SQL so'rov kerak emas, faylni qo'lda ochib ko'rish esa qulay. Biz ishga tushish narxini ham solishtirdik (15 marta, mediana; mashina band edi — raqamlar odatdagidan yuqori): bo'sh fayl 192 ms, SQLite faylga bitta yozish 221 ms, JSON faylga yozish 216 ms. Farq shovqin ichida — tezlik emas, ehtiyoj hal qiladi.

Tekshirib ko'ring: valyuta ga "har kuni kursni saqlab boring, keyin 1 yillik o'rtachani ko'rsating" degan talab keldi. JSON fayllar yoki node:sqlite — qaysi biri mos va nega?

Javob

node:sqlite mosroq. 365 kun × bir necha valyuta — minglab yozuv. Yillik o'rtacha — SELECT AVG(qiymat) … WHERE sana BETWEEN ? AND ? bitta so'rov bilan. JSON fayllarda hammasini o'qib, JS'da hisoblash kerak bo'lardi. Hozirgi kesh esa "bitta kalit — bitta javob": u yerda JSON yetadi.

3. Global WebSocket klienti

WebSocket — server bilan doimiy ikki tomonlama ulanish (11-qismda brauzerda ko'rgansiz). Node 22 dan WebSocket global, Node 24 da u brauzerdagi API bilan bir xil. Faqat klient: server tomoni uchun hali ham ws paketi yoki framework kerak (WebSocket va ws — 29-qismda).

Server yo'q portga ulanishga urinsak, hodisalar brauzerdagidek keladi:

js
import { createServer } from "node:net";

// bo'sh port: ochamiz va darhol yopamiz
const tmp = createServer();
await new Promise((ok) => tmp.listen(0, "127.0.0.1", ok));
const port = tmp.address().port;
tmp.close();

const ws = new WebSocket(`ws://127.0.0.1:${port}/`);
ws.addEventListener("error", (e) => console.log("error:", e.type));
ws.addEventListener("close", (e) => console.log("close:", e.code));

Konsolda:

text
error: error
close: 1006

1006 — "g'ayritabiiy yopilish": ulanish hech qachon o'rnatilmadi. Haqiqiy server bilan ishlash xuddi brauzerdagidek:

js
const ws = new WebSocket("wss://example.com/kurslar");
ws.addEventListener("open", () => {
  ws.send(JSON.stringify({ kod: "USD" }));
});
ws.addEventListener("message", (e) => {
  console.log(JSON.parse(e.data));
});

Bu parcha — namuna (example.com da WebSocket server yo'q), biz uni ishga tushirmadik.

4. Brauzerdan kelgan global'lar

Global obyektlar darsida ro'yxatni ko'rgansiz. Ulardan uchtasi kundalik ishda foydali:

js
const pattern = new URLPattern({ pathname: "/json/:kod/:sana/" });
const url =
  "https://cbu.uz/uz/arkhiv-kursov-valyut/json/USD/2026-10-01/";
const m = pattern.exec(url);
console.log(m?.pathname.groups ?? "mos emas");

console.log(navigator.userAgent, navigator.hardwareConcurrency > 0);
console.log(import.meta.filename.endsWith(".mjs"));

Konsolda:

text
mos emas
Node.js/24 true
true

Birinchi qatorga qarang: mos emas! Naqsh /json/… bilan boshlanadi, haqiqiy yo'l esa /uz/arkhiv-kursov-valyut/json/…. URLPattern yo'lni boshidan oxirigacha solishtiradi. Tuzatilgani:

js
const pattern = new URLPattern({ pathname: "/*/json/:kod/:sana/" });
const url =
  "https://cbu.uz/uz/arkhiv-kursov-valyut/json/USD/2026-10-01/";
console.log(pattern.exec(url)?.pathname.groups);

Konsolda:

text
{ '0': 'uz/arkhiv-kursov-valyut', kod: 'USD', sana: '2026-10-01' }

* — istalgan qism (natijada '0' kaliti bilan), :kod va :sana — nomli guruhlar. Kanon o'lchovi ham shu natijani bergan ({ kod: 'USD', sana: '2026-10-01' }). Bu path-to-regexp kabi paketlarning o'rnini bosadi.

  • navigator.userAgent — "Node.js/24"; hardwareConcurrency — mantiqiy yadrolar soni (kanon mashinasida 16). Kodning Node'da ishlayotganini aniqlash uchun ishlatiladi.
  • import.meta.dirname / import.meta.filename — ESM'da __dirname / __filename o'rni (ES Modules darsi).

5. Yangi JS metodlari: V8 13.6

Node 24.21 — V8 13.6. Bu brauzer emas, lekin til imkoniyatlari bir xil dvigateldan keladi. Bu blok toza JS — saytdagi «Ishga tushir» (Chrome) bilan ham sinashingiz mumkin:

js
const gen = async function* () {
  yield 11903.15;
  yield 13329.15;
};
console.log(await Array.fromAsync(gen()));
console.log(RegExp.escape("1.5$"));
const fake = { message: "x" };
console.log(Error.isError(new TypeError("x")), Error.isError(fake));
const parsed = Promise.try(() => JSON.parse("{"));
console.log(await parsed.catch((e) => e.name));
console.log(new Set(["USD", "EUR"]).union(new Set(["EUR", "RUB"])));

Konsolda:

text
[ 11903.15, 13329.15 ]
\x31\.5\$
true false
SyntaxError
Set(3) { 'USD', 'EUR', 'RUB' }
Metod Nima qiladi O'rnini bosadi
Array.fromAsync Async iterator'dan massiv for await + push
RegExp.escape Matnni regex uchun xavfsiz qiladi (. → \.) escape-string-regexp paketi
Error.isError Haqiqiy Error mi (boshqa realm'dan ham) instanceof Error (ishonchsiz)
Promise.try Sinxron xatoni ham Promise'ga o'raydi new Promise(r => r(f()))
Set.union, intersection … To'plam amallari qo'lda sikl, lodash

RegExp.escape("1.5$") dagi \x31 — birinchi raqam ham qochiriladi. Bu ataylab: natija boshqa regex qismiga ulanganda (\1 + 5 kabi) raqam "orqaga havola" bo'lib qolmasin.

5.1 Node 24 da hali yo'q

Biz har birini typeof bilan tekshirdik (Node 24.21.0):

text
Map.prototype.getOrInsert    undefined
Iterator.concat              undefined
Uint8Array.fromBase64        undefined
Math.sumPrecise              undefined
Temporal                     undefined

Ular — TC39 takliflari yoki yangiroq V8 imkoniyatlari. Kod yozishdan oldin aynan sizning Node versiyangizda borligini tekshiring: node -p "typeof Map.prototype.getOrInsert". Maqola "JavaScript'da bor" desa, bu hali Node'da bor degani emas.

5.2 Temporal: bayroq bilan

Temporal darsida uni brauzerda ko'rgansiz. Node 24 da u bayroq ortida:

js
// node --harmony-temporal
const d = Temporal.PlainDate.from("2026-10-23");
console.log(d.add({ days: 3 }).toString(), d.dayOfWeek);

Konsolda:

text
2026-10-26 5

Birinchi qatordagi izoh — zavod tekshiruvchisi uchun bayroq; o'zingiz node --harmony-temporal fayl.mjs deb ishga tushirasiz. dayOfWeek — 5, juma. Node 26.0.0 (2026-05-05) relizida "Temporal API endi sukut bo'yicha yoqilgan". Node 24 da prod kodda bayroqqa tayanmang.

6. Kriptografiya va siqish: qisqa

Ikki imkoniyat alohida darslarda chuqur o'rganilgan, bu yerda faqat "bor" deb belgilaymiz:

  • crypto.argon2Sync — parolni hash'lash uchun zamonaviy algoritm. Kanon o'lchovi: argon2id (19 MiB, 2 o'tish) 31 ms, ogohlantirishsiz. 24.7.0 da qo'shilgan; alohida stability belgisi yo'q, ya'ni node:crypto modulining darajasi — 2 (barqaror). Avval argon2 npm paketi kerak edi (crypto 2 darsi).
  • zlib.zstdCompressSync — Zstandard siqish. Kanon: CBU javobi 25 533 bayt → zstd 5 464 (siqish 87 µs), gzip 4 722 (738 µs) (zlib darsi). Hujjatda: Stability 1 — Experimental, 23.8.0 va 22.15.0 da qo'shilgan.

Mana, zstd ham gzip kabi bir qatorda ishlaydi:

js
import { gzipSync, zstdCompressSync, zstdDecompressSync }
  from "node:zlib";

const row = '{"Ccy":"USD","Rate":"11903.15","Date":"23.10.2026"},';
const text = "[" + row.repeat(74) + "]";
const z = zstdCompressSync(text);
const g = gzipSync(text);
console.log(Buffer.byteLength(text), z.length, g.length);
console.log(zstdDecompressSync(z).toString() === text);

Konsolda:

text
3850 69 98
true

74 marta takrorlangan qator juda yaxshi siqiladi (3 850 → 69 bayt) — haqiqiy ma'lumotda nisbat ancha past (yuqoridagi kanon raqamlari).

6.1 Hujjat bo'yicha holati

"Ishlaydi" va "barqaror" — har xil narsa. Node 24 hujjatini (2026-10 holatiga) tekshirdik:

Imkoniyat Qachondan bor Hujjatdagi holati Node 24.21 da ogohlantirish
node:sqlite 22.5.0 (bayroqsiz — 22.13.0) 1.2 — Release candidate (24.15.0 dan) yo'q
crypto.argon2Sync 24.7.0 alohida belgi yo'q — node:crypto moduli barqaror (2) yo'q
zlib.zstdCompressSync 22.15.0 1 — Experimental yo'q
Temporal — Node 24 da bayroq ortida; Node 26 da sukut bo'yicha —

Ogohlantirish ustunini biz o'zimiz tekshirdik: uchala API'ni Node 24.21.0 da chaqirdik, stderr bo'sh qoldi. Diqqat: zstd ogohlantirishsiz ishlaydi, lekin hujjatda hali Experimental. Ya'ni uning API'si keyingi versiyalarda o'zgarishi mumkin.

7. Qanday kuzatib borasiz?

Node deyarli har oy yangi kichik versiya chiqaradi. Paket qo'shishdan oldin uch qadam:

  1. node -p "typeof X" yoki node -e "import('node:sqlite').then(() => console.log('bor'))" — sizning versiyangizda bormi.
  2. Hujjatdagi Stability belgisi: 0 — eskirgan, 1.x — eksperimental (1.2 — release candidate), 2 — barqaror.
  3. stderr da ExperimentalWarning chiqadimi — prod'da log'ni ifloslaydi.
flowchart TB
  Q["Paket kerak bo'ldi"] --> N{"Node'da bormi?<br/>node -p typeof"}
  N -->|yo'q| P["Paket: faol, kichik,<br/>turlari bor"]
  N -->|bor| S{"Stability?"}
  S -->|"2 yoki 1.2"| U["Node'nikini ishlating"]
  S -->|"1.0 / 1.1"| E["Sinab ko'ring,<br/>prod'da ehtiyot"]

Diagrammaning chap tarmog'i — paket tanlash (paket tanlash darsi), o'ng tarmog'i — Node'ning o'z imkoniyati. Asosiy savol yuqorida: "Node'da bormi?".

8. CLI qadami: kanon nimani ishlatdi

Bu dars uchun valyuta da yangi holat yo'q. Lekin loyiha shu qismda allaqachon Node'ning "yangi" imkoniyatlariga to'la — kanon tajribasi (t43) ro'yxati:

Imkoniyat Qaysi darsda valyuta da
node:test 12-qism 39 ta test (holat 41)
fs.glob fs chuqur keshRoyxati
util.parseArgs, util.styleText util moduli bayroqlar, rangli farq
type stripping TS to'g'ridan node src/bin.ts
--env-file-if-exists, --run --watch, --env-file dev, start
fetch, AbortSignal.any fetch va undici manba.ts

Kirmaganlar va sababi: node:sqlite — kesh "bitta kalit, bitta JSON" (yuqoridagi o'lchov); WebSocket — CBU real vaqt API bermaydi; argon2 — parol yo'q; zstd — kesh siqilmaydi (25 KB, zlib darsidagi qaror). Natija: prod bog'liqlik 0.

9. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
TypeError: Map.prototype.getOrInsert is not a function Node 24 da yo'q Versiyani tekshiring; o'zingiz yozing
ReferenceError: Temporal is not defined Node 24 da bayroqsiz yo'q --harmony-temporal yoki Node 26
Cannot find module 'sqlite' node: prefiksi tushib qoldi import … from "node:sqlite"
SQLite so'rovi serverni sekinlatdi DatabaseSync sinxron Kichik so'rovlar yoki alohida worker
SQL injection Qiymat SQL matniga qo'shildi Faqat ? parametr
WebSocket server yaratib bo'lmadi Node faqat klient beradi ws paketi yoki framework
URLPattern null qaytardi Naqsh yo'lning boshidan mos emas /*/… yoki to'liq yo'l

10. Mashqlar

Yechimlar kurs/mashqlar/24/43-yangi-imkoniyatlar/ da.

1-mashq (oson): bormi?

Node 24.21 da, bayroqsiz:

  • node:sqlite —
  • Temporal —
  • WebSocket server —
  • Map.prototype.getOrInsert —
  • RegExp.escape —
Yechim
  • ha — release candidate, ogohlantirishsiz.
  • yo'q — --harmony-temporal bilan bor; Node 26 da sukut bo'yicha.
  • yo'q — faqat klient (WebSocket global).
  • yo'q — biz typeof bilan tekshirdik: undefined.
  • ha — V8 13.6.

2-mashq (o'rta): kunlik kurslar jurnali

node:sqlite bilan xotiradagi bazada kurs (sana, kod, qiymat) jadvalini yarating. 5 kunlik USD kursini (11980, 11965.51, 11950, 11930, 11903.15; sanalar 2026-10-19 … 2026-10-23) bitta tranzaksiyada yozing (db.exec("BEGIN") … "COMMIT"). Keyin bitta so'rov bilan min, max va o'rtachani (2 xona) chiqaring.

Yechim
js
import { DatabaseSync } from "node:sqlite";

const db = new DatabaseSync(":memory:");
db.exec("CREATE TABLE kurs (sana TEXT, kod TEXT, qiymat REAL)");
const values = [11980, 11965.51, 11950, 11930, 11903.15];
const insert = db.prepare("INSERT INTO kurs VALUES (?, 'USD', ?)");

db.exec("BEGIN");
values.forEach((v, i) => insert.run(`2026-10-${19 + i}`, v));
db.exec("COMMIT");

const stats = db.prepare(`
  SELECT MIN(qiymat) AS min, MAX(qiymat) AS max,
         ROUND(AVG(qiymat), 2) AS avg, COUNT(*) AS n
  FROM kurs WHERE kod = ?
`);
console.log({ ...stats.get("USD") });
db.close();

Konsolda:

text
{ min: 11903.15, max: 11980, avg: 11945.73, n: 5 }

{ ...stats.get(…) } — prototipsiz obyektni oddiy obyektga ko'chiradi, shuning uchun [Object: null prototype] yozuvi chiqmaydi. Tranzaksiya — "hammasi yoki hech biri": o'rtada xato bo'lsa, ROLLBACK bilan qisman yozuv qolmaydi.

3-mashq (qiyin): imkoniyatlar hisoboti

report(features) funksiyasini yozing: features — { nomi: () => qiymat } obyekti. Har biri uchun funksiyani chaqirib, "<nomi>: bor" yoki "<nomi>: yo'q" qatorini qaytarsin (undefined yoki xato — "yo'q"). Oxirida "N/M bor". Bu toza JS — saytda (Chrome) va Node'da natija farq qilishi mumkin: shunisi qiziq.

Yechim
js
function report(features) {
  const lines = [];
  let count = 0;
  for (const [name, probe] of Object.entries(features)) {
    let ok;
    try {
      ok = probe() !== undefined;
    } catch {
      ok = false;
    }
    if (ok) count++;
    lines.push(`${name}: ${ok ? "bor" : "yo'q"}`);
  }
  lines.push(`${count}/${lines.length} bor`);
  return lines.join("\n");
}

console.log(report({
  "Array.fromAsync": () => Array.fromAsync,
  "RegExp.escape": () => RegExp.escape,
  "Error.isError": () => Error.isError,
  "Map.getOrInsert": () => Map.prototype.getOrInsert,
  "Iterator.concat": () => Iterator.concat,
  Temporal: () => globalThis.Temporal,
}));

Konsolda:

text
Array.fromAsync: bor
RegExp.escape: bor
Error.isError: bor
Map.getOrInsert: yo'q
Iterator.concat: yo'q
Temporal: yo'q
3/6 bor

Bu — Node 24.21 natijasi. Saytdagi «Ishga tushir» (Chrome) natijasi boshqacha bo'lishi mumkin. Brauzerlar ba'zi imkoniyatlarni Node'dan oldin oladi. lines.length push dan oldin hisoblanadi — shuning uchun oxirgi qatorda 6, 7 emas. try/catch kerak: ba'zi tekshiruv xato tashlashi mumkin (masalan, Iterator o'zi yo'q eski muhitda).

11. Real ishda

  • Kodni ko'rib chiqishda (code review) tez-tez beriladigan savol: "Bu paket Node'da bor emasmi?". dotenv, node-fetch, uuid (crypto.randomUUID), rimraf (fs.rm({ recursive })), glob (fs.glob) — eng ko'p uchraydigan "keraksiz" paketlar.
  • Electron va desktop ilovalar — node:sqlite lokal baza uchun tabiiy tanlov.
  • CLI vositalar — har paket sovuq startni sekinlashtiradi (Commander o'lchovi); o'rnatilgan imkoniyat — bepul.
  • Intervyu savoli: "Node'ning qaysi yangi versiyasida nima paydo bo'lganini qanday kuzatasiz?" — changelog, node --help, hujjatdagi Stability.

Xulosa

  • node:sqlite — Node 24 da bayroqsiz va ogohlantirishsiz (release candidate); sinxron, faqat ? parametr bilan.
  • WebSocket — global klient (server — yo'q); URLPattern yo'lni boshidan oxirigacha solishtiradi.
  • V8 13.6: Array.fromAsync, RegExp.escape, Error.isError, Promise.try, Set amallari bor; Map.getOrInsert, Iterator.concat, Uint8Array.fromBase64 — Node 24.21 da yo'q.
  • Temporal — Node 24 da --harmony-temporal, Node 26 da sukut bo'yicha.
  • Paket qo'shishdan oldin: versiyangizda bormi, Stability qanday, ogohlantirish bormi.

Keyingi dars: Permission model — Node jarayoniga faqat kerakli papkalarga ruxsat berish va nega --permission Node 24 da tarmoqni cheklamaydi.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Node.js yangi imkoniyatlari: node:sqlite, WebSocket, Temporal va paketsiz yechimlar — IlmHamroh