Tarkibga o'tish

01 β€” Node.js nima va o'rnatish

🏠 README Β· Keyingi: 02 β€” Modullar: CommonJS va ESM ➑️

Bu bobda: JavaScript hozirgacha sizning ongingizda faqat brauzer bilan bog'liq bo'lsa, shu bob shu tasavvurni ochib tashlaydi. Node.js β€” bu brauzerdan tashqarida, to'g'ridan-to'g'ri kompyuteringizda yoki serverda JavaScript ishga tushiruvchi muhit (runtime). Uning ichida nima borligini (V8 dvigeli, libuv), nega u shu qadar mashhur bo'lganini (bitta tilda butun loyiha, ulkan npm ekotizimi) va uning asinxron, "bloklamaydigan" tabiati nimani anglatishini ko'ramiz. Node.js qachon to'g'ri tanlov, qachon noto'g'ri tanlov ekanini aniqlaymiz. Brauzerdagi JS bilan farqini (DOM yo'q, lekin fayl va tarmoq bor) tushunamiz. Oxirida Node'ni o'rnatamiz, versiyani tekshiramiz, REPL bilan o'ynaymiz va birinchi haqiqiy skriptni β€” buyruq qatoridan ism qabul qiladigan salomlashuvchi CLI'ni β€” yozib ishga tushiramiz.


JavaScript faqat brauzer uchunmi edi?

Ko'pchilik JavaScript bilan brauzerda tanishadi. Sahifaga tugma qo'yasiz, bosilganda alert("Salom!") chiqadi, document.querySelector bilan elementni topasiz, fetch bilan serverdan ma'lumot olasiz. Bularning hammasi brauzer ichida sodir bo'ladi. Tabiiy savol tug'iladi: JavaScript brauzersiz, o'zicha ishlay oladimi?

1995-yilda JavaScript aynan brauzer uchun yaratilgan edi. Yigirma yildan ko'proq vaqt davomida u brauzerdan tashqariga deyarli chiqa olmadi. Server tomonida (foydalanuvchiga sahifa jo'natadigan, ma'lumotlar bazasi bilan ishlaydigan dasturlar) PHP, Python, Java, Ruby kabi tillar hukmronlik qildi.

2009-yilda Rayan Dal (Ryan Dahl) bir g'oyani amalga oshirdi: brauzerning ichidan eng tez JavaScript dvigelini β€” Google'ning V8'ini β€” olib chiqib, uni mustaqil dasturga aylantirsa-chi? Natija Node.js bo'ldi. Endi JavaScript brauzerdan tashqarida, terminalda, serverda β€” xohlagan joyda ishlay oladigan to'liq huquqli til bo'ldi.

Ya'ni Node.js β€” yangi til emas. U siz allaqachon biladigan (yoki o'rganayotgan) JavaScript'ning aynan o'zi, faqat boshqa joyda ishlaydi.

Node.js nima? (aniq ta'rif)

Ta'rif sodda, lekin har bir so'zi muhim:

Node.js β€” bu JavaScript kodini brauzerdan tashqarida ishga tushiruvchi runtime (ishga tushirish muhiti).

"Runtime" so'zini ochib tashlaylik. Bu β€” kodingiz ishlashi uchun zarur bo'lgan butun atrof-muhit: kodni tushunadigan dvigel, tizim bilan gaplashadigan ko'mak qatlamlari, tayyor kutubxonalar. Brauzer ham JavaScript uchun runtime'dir β€” lekin brauzer sahifalar va foydalanuvchi uchun mo'ljallangan. Node.js esa serverlar, terminal vositalari va kompyuterning o'zi bilan ishlash uchun mo'ljallangan runtime.

Node ichida nima bor? Ikkita asosiy qism:

  • V8 β€” Google yaratgan JavaScript dvigeli. Uning vazifasi: siz yozgan JavaScript matnini kompyuter tushunadigan mashina kodiga o'girib, bajarish. Aytib o'tganimizdek, aynan shu dvigel Google Chrome ichida ham ishlaydi. Demak Node va Chrome JavaScript'ni bir xil tezlik va xulq bilan bajaradi.
  • libuv β€” C tilida yozilgan kutubxona. U Node'ga operatsion tizim bilan gaplashishni o'rgatadi: fayllarni o'qish/yozish, tarmoq ulanishlari, va eng muhimi β€” asinxron, bloklamaydigan I/O va hodisa sikli (event loop). Bu nima ekanini biroz pastda intuitiv tushuntiramiz, chuqur ko'rinishini esa 05-bobda ochamiz.

V8 "JavaScript'ni bajaradi", libuv esa "tashqi dunyo bilan bog'laydi". Ikkalasi birgalikda Node.js'ni tashkil qiladi.

Node.js arxitekturasi: JS kod V8 orqali bajariladi, libuv asinxron I/O va hodisa siklini boshqaradi, eng pastda operatsion tizim resurslari turadi

Diagrammani yuqoridan pastga o'qing: sizning salom.js faylingizdagi JavaScript V8'ga tushadi, V8 uni bajaradi. Kodingiz faylga yozish yoki tarmoqdan ma'lumot olish kabi tashqi ishni so'rasa β€” bu so'rov libuv orqali operatsion tizimga uzatiladi. Operatsion tizim haqiqiy diskka yozadi yoki tarmoqqa chiqadi. Brauzerda bu eng pastki qatlam "sahifa va foydalanuvchi" edi; Node'da esa β€” "operatsion tizim va uning resurslari". Butun farq mana shu pastki qatlamda.

Nega Node.js? (nega bunchalik mashhur?)

Yangi texnologiya faqat "ishlagani" uchun mashhur bo'lmaydi β€” u kishilarning hayotini yengillashtirgani uchun mashhur bo'ladi. Node bir nechta sababga ko'ra dunyoni zabt etdi.

1. Bitta til β€” butun loyiha (full-stack JavaScript). Veb-dastur odatda ikki qismdan iborat: brauzerda ishlaydigan qism (frontend) va serverda ishlaydigan qism (backend). Node'dan oldin frontend'ni JavaScript'da, backend'ni esa boshqa tilda (masalan PHP yoki Python) yozishga to'g'ri kelardi. Bu β€” ikki til, ikki fikrlash tarzi, ba'zan ikki xil dasturchi degani edi. Node bilan ikkala qismni ham JavaScript'da yozish mumkin bo'ldi. Bir tilni chuqur bilsangiz β€” butun ilovani yoza olasiz. Buni "full-stack JavaScript" deyishadi.

2. npm β€” dunyodagi eng katta kod kutubxonasi. Node bilan birga npm (Node Package Manager) keladi. Bu β€” boshqa dasturchilar yozib, bepul ulashgan tayyor "paketlar" ombori. Sana bilan ishlashmi, server qurishmi, rasm tahrirlashmi β€” deyarli har bir vazifa uchun tayyor paket bor. Hozirda npm'da millionlab paket mavjud va u dunyodagi eng katta dasturiy ta'minot ombori hisoblanadi. Bu β€” har safar g'ildirakni qaytadan ixtiro qilmaslik degani.

3. Tez va katta yuk ko'tara oladi. Node'ning asinxron modeli (buni keyingi bo'limda ko'ramiz) uni ayniqsa minglab bir vaqtdagi foydalanuvchilarni boshqarishda samarali qiladi. Shuning uchun Netflix, PayPal, LinkedIn, Uber kabi yirik kompaniyalar o'z serverlarining muhim qismini Node'da quradi.

4. Asboblar ham Node'da. Bugun frontend dunyosining deyarli barcha asboblari β€” React, Vue, Angular qurish vositalari, Vite, Webpack, TypeScript kompilyatori, ESLint, Prettier β€” Node ustida ishlaydi. Demak frontend yozsangiz ham, Node'siz bir qadam ham bosa olmaysiz. Node β€” zamonaviy veb-ishlab chiqishning poydevoridir.

Asinxron, bloklamaydigan β€” bu nima degani?

Bu Node'ning eng o'ziga xos, lekin boshlovchini ko'p chalkashtiradigan jihati. Hozir faqat intuitsiya beramiz β€” to'liq mexanizmni 05-bobda hodisa sikli bilan ochamiz.

Tasavvur qiling, oshxonada bitta oshpaz bor. Unga uchta buyurtma keldi: choy damlash, tuxum qaynatish, non yopish. Ikki ish uslubi bor.

Bloklaydigan (sinxron) uslub: Oshpaz choyni damlab, suv qaynaguncha qo'l qovushtirib kutib turadi. Choy tayyor bo'lgachgina tuxumga o'tadi va yana qaynaguncha kutadi. Har bir mijoz oldingisi tugamaguncha kutishi kerak. Bitta sekin ish butun navbatni to'xtatib qo'yadi.

Bloklamaydigan (asinxron) uslub: Oshpaz choyni gazga qo'yadi-yu, qaynashini kutmasdan darrov tuxumni qo'yadi, keyin nonni tandirga soladi. Endi uchchala ish bir vaqtda "pishmoqda". Qaysi biri tayyor bo'lsa β€” taymer "ding!" qiladi (bu β€” hodisa, event) β€” oshpaz o'sha ishni yakunlaydi. Oshpaz hech qachon bekor turmaydi.

Node aynan ikkinchi oshpaz kabi ishlaydi. "I/O" (Input/Output β€” kirish/chiqish: fayl o'qish, ma'lumotlar bazasiga so'rov, tarmoq so'rovi) β€” bu sekin ishlar. Node ularni boshlab qo'yadi-yu, javobni kutib o'tirmaydi; boshqa ishlar bilan davom etadi. Javob kelganda esa Node uni "hodisa" sifatida qabul qilib, kerakli kodni ishga tushiradi. Shuning uchun Node hodisa-asoslangan (event-driven) deyiladi.

Natija: bitta Node jarayoni minglab foydalanuvchini bir vaqtda xizmat qila oladi β€” chunki u kutish vaqtini behuda sarflamaydi. Bu shuningdek nega Node I/O ko'p ishlarda zo'r, lekin og'ir hisob-kitobda kuchsiz ekanini tushuntiradi (pastda ko'ramiz).

Node qachon to'g'ri tanlov, qachon yo'q?

Hech bir texnologiya "har narsa uchun eng yaxshi" emas. Node'ning kuchi va zaifligi uning asinxron tabiatidan kelib chiqadi.

Node mos keladi (I/O ko'p, hisob-kitob kam):

  • Veb-saytlar va REST API'lar β€” so'rovlarning aksariyati ma'lumotlar bazasidan o'qib, javob qaytarishdan iborat (sof I/O). Node bunda a'lo.
  • Real vaqtli ilovalar β€” chat, onlayn o'yin, jonli bildirishnomalar, hamkorlikdagi tahrirchilar. Ko'p ulanishni bir vaqtda ushlab turish β€” Node'ning kuchli tarafi.
  • Mikroservislar va vositalar (CLI) β€” yengil, tez ishga tushadigan dasturlar.

Node mos kelmaydi (CPU ko'p, og'ir hisob-kitob):

  • Og'ir matematik hisob-kitoblar β€” video qayta ishlash, murakkab tasvir tahlili, ilmiy modellashtirish, kriptografik "qazib olish". Bunday vazifa protsessorni uzoq band qiladi. Node'ning bitta asosiy "oshpazi" shu bir ishga bandligida boshqa hech kimga xizmat qila olmaydi β€” navbat to'xtaydi. Bunday ishlar uchun ko'p oqimli (multithread) tillar β€” masalan, Go, Rust, C++, Java β€” ko'pincha to'g'riroq tanlov.

Qoidani sodda eslab qoling: Node ko'p kutib, kam hisoblaydigan ishlarni yaxshi ko'radi. Sizning ishingiz asosan "ma'lumotni u yer-bu yerga ko'chirish" bo'lsa β€” Node ajoyib. Asosan "raqamlarni uzoq xrustlatish" bo'lsa β€” boshqa yo'lni o'ylab ko'ring.

Brauzerdagi JS va Node'dagi JS farqi

Til bir xil, lekin atrof-muhit boshqacha. Bu farqni tushunmaslik boshlovchini ko'p adashtiradi, shuning uchun aniq qaratib o'tamiz.

Brauzerdagi JS va Node'dagi JS: bir xil til, lekin brauzerda DOM/window bor, Node'da esa fs/net/process bor

Brauzerda bor, Node'da yo'q:

  • document, DOM (sahifadagi HTML elementlar) β€” Node'da hech qanday sahifa yo'q, shuning uchun DOM ham yo'q.
  • window, alert(), localStorage β€” bularning hammasi brauzer oynasiga bog'liq, Node'da mavjud emas.
// ❌ Bu kod Node'da xato beradi: brauzer obyektlari yo'q
console.log(document.title);
// ReferenceError: document is not defined

Node'da bor, brauzerda yo'q:

  • fs (file system) β€” fayllarni o'qish va yozish. Brauzerdagi JS xavfsizlik sababli sizning diskingizga erkin kira olmaydi; Node esa kira oladi.
  • net, http β€” server ochish, tarmoq bilan past darajada ishlash.
  • process β€” ishlab turgan jarayon haqida ma'lumot: argumentlar, atrof-muhit o'zgaruvchilari, versiya.
  • os, path, crypto va boshqa ko'plab o'rnatilgan modullar.
// Bu kod faqat Node'da ishlaydi β€” brauzerda fs yo'q
import { readFileSync } from "node:fs";
const matn = readFileSync("eslatma.txt", "utf8");
console.log(matn);

Ikkalasida ham bor: tilning o'zagi β€” let, const, funksiyalar, massivlar, obyektlar, Array.map, Promise, async/await, JSON, va Node 18-versiyadan boshlab β€” global fetch. Demak siz brauzerda o'rgangan JavaScript bilimingizning katta qismi Node'da ham aynan ishlaydi. Faqat "atrofdagi mebel" boshqacha.

Node.js'ni o'rnatish

Endi amaliyotga o'tamiz. Node'ni o'rnatishning eng oddiy yo'li β€” rasmiy saytdan.

  1. nodejs.org saytiga kiring.
  2. Ikkita yuklash tugmasidan LTS belgilangani-ni tanlang. LTS β€” "Long Term Support" (uzoq muddatli qo'llab-quvvatlash) degani: bu eng barqaror, ishlab chiqarish (production) uchun tavsiya etiladigan versiya. Yonidagi "Current" versiya eng so'nggi yangiliklar bilan keladi, lekin barqarorligi kamroq β€” boshlovchi uchun LTS to'g'ri tanlov.
  3. Yuklab olingan o'rnatuvchini ishga tushiring va "Keyingi β†’ Keyingi β†’ Tugatish" tartibida o'rnating. Standart sozlamalar yetarli. Windows'da o'rnatuvchi npm'ni ham, PATH'ni ham avtomatik to'g'rilab beradi.

nvm haqida eslatma. Tajribangiz oshgach, ko'pincha bir nechta Node versiyasini parallel saqlab, loyihalar orasida almashtirish kerak bo'ladi (bir loyiha eski versiyani, boshqasi yangisini talab qilishi mumkin). Buning uchun nvm (Node Version Manager) ishlatiladi: Linux/macOS uchun nvm, Windows uchun nvm-windows. Hozircha bu shart emas β€” rasmiy o'rnatuvchi yetarli. Lekin "nvm" so'zini eshitsangiz, bilingki β€” bu Node versiyalarini boshqarish vositasi.

O'rnatishni tekshirish

O'rnatgach, terminalni (Windows'da PowerShell yoki Command Prompt, macOS/Linux'da Terminal) oching va ikki buyruq yozing:

node -v
npm -v

Quyidagiga o'xshash natija ko'rishingiz kerak (raqamlar sizda boshqacha bo'lishi mumkin):

v24.12.0
11.6.2

Agar versiya raqamlari chiqsa β€” tabriklaymiz, Node ham, npm ham o'rnatildi va ishlayapti. Agar "node is not recognized" yoki "command not found" desa β€” o'rnatish yakunlanmagan yoki terminalni qayta ochish kerak (PATH yangilanishi uchun yangi terminal oyna oching).

Bu kitobdagi barcha kod Node 24 (LTS) da yozilib, ishga tushirib tekshirilgan. Sizda 20 yoki undan yuqori versiya bo'lsa, deyarli hamma narsa aynan ishlaydi.

REPL β€” Node bilan jonli suhbat

Skript yozishdan oldin Node bilan tezda "gaplashib" ko'rishning ajoyib yo'li bor β€” REPL. Bu so'z to'rt qadamning bosh harfidan tuzilgan: Read (o'qish) β€” Eval (baholash) β€” Print (chop etish) β€” Loop (qaytarish). Ya'ni siz bir satr yozasiz, Node uni darrov bajarib, natijani ko'rsatadi, va yana sizdan keyingi satrni so'raydi.

REPL'ni ochish uchun terminalga shunchaki node deb yozing (hech qanday fayl nomisiz):

node

> belgisi paydo bo'ladi β€” Node sizni kutyapti. Endi har qanday JavaScript ifodasini yozib, Enter bosing:

> 2 + 2
4
> const ism = "Oqil"
undefined
> `Salom, ${ism}!`
'Salom, Oqil!'
> [1, 2, 3].map(n => n * 2)
[ 2, 4, 6 ]
> process.version
'v24.12.0'

E'tibor bering, const ism = "Oqil" qatori undefined qaytardi β€” chunki o'zgaruvchi e'lon qilish hech narsa "qaytarmaydi", lekin o'zgaruvchi baribir yaratildi (keyingi qatorda ishlatdik). REPL β€” yangi g'oyani, kichik ifodani yoki o'rnatilgan modulni tezda sinab ko'rish uchun zo'r joy. Hisoblagich sifatida ham ishlatsa bo'ladi.

Chiqish uchun .exit deb yozing yoki ikki marta Ctrl + C bosing.

Birinchi skript β€” node fayl.js

REPL tez sinash uchun yaxshi, lekin haqiqiy dasturlarni faylga yozamiz. Ixtiyoriy joyda papka yarating (masalan node-mashq), uning ichida salom.js nomli fayl oching va shuni yozing:

console.log("Salom, Node.js!");
console.log("Bugun:", new Date().toLocaleDateString("uz-UZ"));
console.log("Node versiyasi:", process.version);
console.log("Platforma:", process.platform);

Endi terminalda o'sha papkaga o'tib, faylni ishga tushiring:

node salom.js

Natija:

Salom, Node.js!
Bugun: 12/06/2026
Node versiyasi: v24.12.0
Platforma: win32

Mana β€” sizning birinchi Node dasturingiz ishladi! console.log brauzerdagi kabi ishlaydi, faqat natija sahifaning konsoliga emas, terminalga chiqadi. process.version va process.platform esa β€” Node'gagina xos: ular ishlab turgan muhit haqida ma'lumot beradi (win32 β€” Windows, linux, darwin β€” macOS).

REAL KEYS: buyruq qatoridan ism qabul qiladigan salomlashuvchi CLI

Endi quruq sintaksisdan haqiqiy mini-vazifaga o'tamiz. Tasavvur qiling, siz jamoangiz uchun kichik bir terminal vositasi yozyapsiz β€” uni ishga tushirganda, foydalanuvchi nomini argument sifatida berib, shaxsiy salom olish kerak. Bu β€” har qanday CLI (Command Line Interface β€” buyruq qatori vositasi) dasturining asosi: foydalanuvchidan kirish ma'lumotini qabul qilish.

Node'da buyruq qatoridan berilgan argumentlar process.argv massivida turadi. Uni tekshirib ko'raylik. argv-korish.js fayl yarating:

console.log(process.argv);

Va ishga tushiring:

node argv-korish.js Oqil 25

Natija (yo'llar sizda boshqacha bo'ladi):

[
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\imomn\\node-mashq\\argv-korish.js',
  'Oqil',
  '25'
]

Diqqat qiling: massivning birinchi ikki elementi har doim band β€” [0] Node'ning o'zining yo'li, [1] esa skript faylining yo'li. Bizga keragi β€” undan keyingilari. Shuning uchun slice(2) bilan birinchi ikkitasini kesib tashlaymiz. Endi to'liq vositani yozamiz β€” salomla.js:

// process.argv β€” buyruq qatori argumentlari massivi.
// [0] = node yo'li, [1] = skript yo'li, [2..] = haqiqiy argumentlar.
const arglar = process.argv.slice(2);

if (arglar.length === 0) {
  console.log("Salom, notanish! Ismingizni kiriting: node salomla.js Oqil");
} else {
  const ism = arglar.join(" ");
  console.log(`Salom, ${ism}! Node.js dunyosiga xush kelibsiz.`);
}

Sinab ko'ramiz β€” uchta holatda:

node salomla.js
# Salom, notanish! Ismingizni kiriting: node salomla.js Oqil

node salomla.js Oqil
# Salom, Oqil! Node.js dunyosiga xush kelibsiz.

node salomla.js Oqil Imomnazarov
# Salom, Oqil Imomnazarov! Node.js dunyosiga xush kelibsiz.

Mana sizning birinchi haqiqiy CLI vositangiz. E'tibor bering, biz arglar.length === 0 bilan kirish yo'qligini ham qayta ishladik β€” bu professional dasturning belgisi: foydalanuvchi noto'g'ri ishlatsa, dastur yiqilmaydi, balki nima qilish kerakligini tushuntiradi. join(" ") esa bir nechta so'zni (ism va familiya) bitta matnga birlashtiradi.

Buni biroz boyitsak β€” vaqtga qarab salomlashadigan versiya vaqt.js:

const arglar = process.argv.slice(2);
const ism = arglar[0] || "do'stim";

const hozir = new Date();
const soat = hozir.getHours();

let salom;
if (soat < 6) salom = "Tunni xayrli o'tkazyapsizmi";
else if (soat < 12) salom = "Xayrli tong";
else if (soat < 18) salom = "Xayrli kun";
else salom = "Xayrli kech";

const vaqt = hozir.toLocaleTimeString("uz-UZ");
console.log(`${salom}, ${ism}! Hozir soat ${vaqt}.`);
node vaqt.js Oqil
# Xayrli kun, Oqil! Hozir soat 12:05:31.

Bu yerda ikkita yangi g'oya bor. arglar[0] || "do'stim" β€” argument berilmasa, "do'stim" qiymatini sukut bo'yicha (default) oladi. Va new Date().getHours() bilan joriy soatga qarab to'g'ri salomlashuvni tanlaymiz. Atigi 12 qator kodda β€” kirish qabul qilish, sukut qiymat, shart, va sana bilan ishlash β€” haqiqiy dasturning to'rt asosiy elementi jamlangan.

npm ekotizimi β€” qisqacha kirish

Node bilan birga o'rnatilgan npm haqida bir og'iz aytib o'tamiz (chuqur foydalanishni keyingi boblarda ko'ramiz). npm ikki narsani anglatadi:

  1. Vosita β€” terminaldagi npm buyrug'i. U bilan loyihaga tashqi paketlar o'rnatasiz, masalan npm install express.
  2. Ombor (registry) β€” npmjs.com saytida joylashgan, millionlab tayyor paket saqlanadigan ulkan kutubxona.

G'oya oddiy: birovning yozgan foydali kodini noldan qaytadan yozmay, bir buyruq bilan loyihangizga qo'shasiz. Masalan, veb-server qurish uchun Express, sanani chiroyli formatlash uchun dayjs, terminalga rangli matn chiqarish uchun chalk kabi paketlar bor. Har bir o'rnatilgan paket loyihangizning node_modules papkasiga tushadi, ro'yxati esa package.json faylida saqlanadi.

Hozircha shuni bilsangiz yetarli: Node β€” dvigel, npm β€” uning ulkan ehtiyot qismlar do'koni. Keyingi boblarda avval modullar (02-bob), keyin npm bilan to'liq ishlashni o'rganamiz va Express bilan haqiqiy server quramiz.

Xulosa

  • Node.js β€” JavaScript'ni brauzerdan tashqarida ishga tushiruvchi runtime. Yangi til emas β€” bu o'sha JavaScript, boshqa joyda.
  • Ichida V8 (JS'ni bajaradigan dvigel) va libuv (tizim bilan ishlash, asinxron I/O, hodisa sikli) bor.
  • Node mashhur, chunki: bitta tilda full-stack, ulkan npm ekotizimi, va asinxron modeli tufayli yuqori yuk ko'tara olishi.
  • Node asinxron va bloklamaydigan: sekin I/O ishlarni kutib o'tirmaydi, shuning uchun I/O ko'p ishlarda (veb, API, real-time) zo'r, lekin og'ir CPU hisob-kitobda kuchsiz.
  • Brauzerdan farqi: DOM/window yo'q, lekin fs/net/process bor. Til o'zagi esa bir xil.
  • O'rnatish: nodejs.org β†’ LTS. Tekshirish: node -v, npm -v. Tez sinash: node (REPL). Skript ishga tushirish: node fayl.js.
  • process.argv bilan buyruq qatori argumentlarini o'qib, oddiy CLI vositalar yozish mumkin (slice(2) ni unutmang).

Keyingi bobda modullarga o'tamiz: kodni bir nechta faylga bo'lib, ularni bir-biriga bog'lashni β€” CommonJS (require) va zamonaviy ESM (import/export) usullarini β€” o'rganamiz.


Mashqlar

Oson

  1. O'z so'zlaringiz bilan bir-ikki jumlada javob bering: "Node.js β€” bu yangi dasturlash tili" degan fikr to'g'rimi? Nega?
  2. Terminalingizda node -v va npm -v buyruqlarini ishga tushiring va chiqqan versiyalarni yozib qo'ying.
  3. REPL'ni oching (node) va quyidagilarni hisoblang: 100 * 12, "Node" + ".js", [5, 3, 9].sort(). Har birining natijasini yozing. Keyin REPL'dan qanday chiqish mumkinligini ayting.
  4. salom.js skriptini yarating, unda o'z ismingiz va sevimli rangingizni console.log bilan chiqaring, node salom.js bilan ishga tushiring.
  5. Quyidagilardan qaysilari brauzerda bor, qaysilari Node'da bor: document, fs, window, process, alert, fetch? Ikki ustunga ajrating (fetch ikkalasida ham borligini eslang).

O'rta

  1. process.argv nima ekanini tushuntiring va nega undan deyarli har doim slice(2) qilinishini ayting.
  2. Quyidagi vazifalardan qaysilariga Node mos, qaysilariga mos emas β€” har biriga sabab yozing: (a) chat ilovasi serveri, (b) 4K videolarni qayta kodlash dasturi, (c) ob-havo API'si, (d) shaxmat dvigeli (har bir yurish uchun millionlab variantni hisoblaydigan).
  3. son.js skript yozing: u buyruq qatoridan ikkita son qabul qilib (node son.js 7 5), ularning yig'indisini chiqarsin. Maslahat: process.argv'dagi argumentlar matn (string) bo'ladi β€” Number() bilan songa o'giring.
  4. "Node bloklamaydi" iborasini oshxonadagi oshpaz misolidan foydalanmasdan, o'z misolingiz bilan tushuntiring.
  5. vaqt.js skriptini shunday o'zgartiring: agar foydalanuvchi nom bermasa "do'stim" emas, "mehmon" deb salomlasin va ekranga joriy sanani ham (toLocaleDateString) qo'shsin.

Qiyin

  1. salom-kop.js CLI yozing: u istalgan miqdordagi ismni qabul qilsin (node salom-kop.js Oqil Ali Vali) va har biriga alohida qatorda salom chiqarsin. Agar hech kim berilmasa, foydalanish yo'riqnomasini ko'rsatsin. Massivni aylanish (for...of yoki forEach) kerak bo'ladi.
  2. kalkulyator.js yozing: u uchta argument oladi β€” son, amal, son (node kalkulyator.js 8 + 3). Qo'llab-quvvatlanadigan amallar: + - x /. To'g'ri natijani chiqarsin (ko'paytirish uchun * o'rniga x ishlatamiz, chunki ko'p terminalda * maxsus belgi). Nolga bo'lish va noma'lum amalni alohida xato xabari bilan qayta ishlang.
Yechim β€” 1

Yo'q, bu fikr noto'g'ri. Node.js β€” yangi til emas, balki JavaScript'ni ishga tushiruvchi muhit (runtime). Til o'sha-o'sha JavaScript: let, const, funksiyalar, massivlar, async/await β€” hammasi bir xil. Faqat kod endi brauzer ichida emas, brauzerdan tashqarida (terminalda, serverda) ishlaydi. Ya'ni Node siz biladigan JavaScript'ga yangi qobiliyat (fayl o'qish, server ochish) qo'shadi, lekin tilning o'zini almashtirmaydi.

Yechim β€” 2
node -v
# v24.12.0

npm -v
# 11.6.2

Sizdagi raqamlar boshqacha bo'lishi mumkin β€” bu normal. Muhimi: ikkala buyruq ham versiya raqami qaytarsa, Node ham, npm ham to'g'ri o'rnatilgan. Agar "node is not recognized" yoki "command not found" chiqsa, terminalni qayta oching (PATH yangilanishi uchun) yoki o'rnatishni qaytadan bajaring.

Yechim β€” 3
> 100 * 12
1200
> "Node" + ".js"
'Node.js'
> [5, 3, 9].sort()
[ 3, 5, 9 ]
  • 100 * 12 β€” oddiy ko'paytirish, natija 1200.
  • "Node" + ".js" β€” ikki matnni ulash (konkatenatsiya), natija 'Node.js'.
  • [5, 3, 9].sort() β€” massivni saralaydi, natija [ 3, 5, 9 ]. (Diqqat: sort() sukut bo'yicha elementlarni matn sifatida saralaydi; bu yerda bir xonali sonlar bo'lgani uchun natija son tartibiga to'g'ri keldi.)

REPL'dan chiqish: .exit deb yozing yoki ikki marta Ctrl + C bosing.

Yechim β€” 4
// salom.js
console.log("Ismim: Oqil");
console.log("Sevimli rangim: ko'k");
node salom.js
# Ismim: Oqil
# Sevimli rangim: ko'k

console.log β€” brauzerdagi kabi ishlaydi, faqat natija sahifa konsoliga emas, terminalga chiqadi. O'z ism va rangingizni qo'ying.

Yechim β€” 5
Faqat brauzerda Faqat Node'da Ikkalasida ham
document, window, alert fs, process fetch
  • document, window, alert β€” brauzer oynasi va sahifaga bog'liq, Node'da yo'q (Node'da sahifa yo'q).
  • fs, process β€” operatsion tizim va jarayon bilan ishlash uchun, brauzerda yo'q (brauzer xavfsizlik sababli diskka erkin kira olmaydi).
  • fetch β€” brauzerda azaldan bor edi, Node'da esa 18-versiyadan boshlab global bo'lib qo'shildi. Demak hozir ikkalasida ham bor.
Yechim β€” 6

process.argv β€” Node dasturi ishga tushganda buyruq qatoridan berilgan barcha argumentlar massivi. Lekin uning birinchi ikki elementi har doim band:

  • process.argv[0] β€” Node ijro etuvchisining (node.exe) yo'li.
  • process.argv[1] β€” ishga tushayotgan skript faylining yo'li.
  • process.argv[2] va keyingilari β€” foydalanuvchi haqiqatan bergan argumentlar.

Bizga deyarli har doim faqat foydalanuvchi argumentlari kerak, shuning uchun slice(2) bilan birinchi ikki (texnik) elementni kesib tashlaymiz va toza ro'yxat olamiz.

// node dastur.js Oqil 25
process.argv.slice(2); // ["Oqil", "25"]
Yechim β€” 7
  • (a) chat ilovasi serveri β€” MOS. Chat β€” bu ko'p ulanishni bir vaqtda ushlab turish va xabarlarni u yer-bu yerga uzatish (sof I/O, real-time). Node'ning eng kuchli tarafi.
  • (b) 4K videolarni qayta kodlash β€” MOS EMAS. Video kodlash β€” protsessorni uzoq band qiladigan og'ir hisob-kitob (CPU-bound). Node'ning bitta asosiy oqimi shu ishga band bo'lib qolib, boshqalarni bloklaydi.
  • (c) ob-havo API'si β€” MOS. API odatda boshqa manbadan (baza yoki tashqi xizmat) ma'lumot olib, javob qaytaradi β€” sof I/O. Node bunda a'lo.
  • (d) shaxmat dvigeli β€” MOS EMAS. Har yurish uchun millionlab variantni hisoblash β€” og'ir CPU ishi. Bunday vazifaga ko'p oqimli tillar (Go, Rust, C++) to'g'riroq.

Umumiy qoida: ko'p kutadigan (I/O) ishlarga Node mos, ko'p hisoblaydigan (CPU) ishlarga mos emas.

Yechim β€” 8
// son.js
const [aMatn, bMatn] = process.argv.slice(2);

if (aMatn === undefined || bMatn === undefined) {
  console.log("Foydalanish: node son.js <son1> <son2>");
  process.exit(1);
}

const a = Number(aMatn);
const b = Number(bMatn);

if (Number.isNaN(a) || Number.isNaN(b)) {
  console.log(`Xato: "${aMatn}" yoki "${bMatn}" son emas.`);
  process.exit(1);
}

console.log(`${a} + ${b} = ${a + b}`);
node son.js 7 5
# 7 + 5 = 12

node son.js 7
# Foydalanish: node son.js <son1> <son2>

node son.js olma 5
# Xato: "olma" yoki "5" son emas.

Asosiy nuqta: process.argv'dagi argumentlar matn (string) bo'ladi. Agar Number() bilan songa o'girmasangiz, "7" + "5" natijasi "75" (matnlar ulanadi) bo'lib qolardi β€” 12 emas. Shuning uchun avval Number() bilan o'giramiz, keyin qo'shamiz. Yetishmagan yoki son bo'lmagan kirishni ham tekshirib qo'yish β€” professional odat.

Yechim β€” 9

Misol β€” restorandagi ofitsiant. Bloklaydigan ofitsiant bitta stolga buyurtma olib, oshxonaga berib, taom tayyor bo'lguncha o'sha stol yonida qo'l qovushtirib turadi; boshqa stollar kutib qoladi. Bloklamaydigan ofitsiant esa buyurtmani oshxonaga uzatadi-yu, darrov keyingi stolga o'tadi, undan keyingisiga; qaysidir taom tayyor bo'lganda (bu β€” hodisa) borib olib keladi. Bitta ofitsiant ko'p stolni samarali xizmat qiladi, chunki u kutish vaqtini behuda sarflamaydi. Node aynan shunday: I/O (fayl, baza, tarmoq) javobini kutib o'tirmasdan boshqa ishlar bilan davom etadi.

(Boshqa mos misollar: kir yuvish mashinasini yoqib qo'yib, kutmasdan ovqat tayyorlash; pochta jo'natib, javob kutmasdan ishni davom ettirish.)

Yechim β€” 10
// vaqt.js
const arglar = process.argv.slice(2);
const ism = arglar[0] || "mehmon";

const hozir = new Date();
const soat = hozir.getHours();

let salom;
if (soat < 6) salom = "Tunni xayrli o'tkazyapsizmi";
else if (soat < 12) salom = "Xayrli tong";
else if (soat < 18) salom = "Xayrli kun";
else salom = "Xayrli kech";

const vaqt = hozir.toLocaleTimeString("uz-UZ");
const sana = hozir.toLocaleDateString("uz-UZ");
console.log(`${salom}, ${ism}! Bugun ${sana}, hozir soat ${vaqt}.`);
node vaqt.js Oqil
# Xayrli kun, Oqil! Bugun 12/06/2026, hozir soat 12:21:08.

node vaqt.js
# Xayrli kun, mehmon! Bugun 12/06/2026, hozir soat 12:21:08.

Ikkita o'zgartirish: "do'stim" o'rniga sukut qiymat "mehmon" qilindi, va toLocaleDateString("uz-UZ") bilan joriy sana qo'shildi. Sana va vaqt sizning kompyuteringizdagi qiymatga qarab boshqacha chiqadi.

Yechim β€” 11
// salom-kop.js
const ismlar = process.argv.slice(2);

if (ismlar.length === 0) {
  console.log("Foydalanish: node salom-kop.js <ism1> <ism2> ...");
  console.log("Masalan:    node salom-kop.js Oqil Ali Vali");
} else {
  for (const ism of ismlar) {
    console.log(`Salom, ${ism}!`);
  }
  console.log(`Jami ${ismlar.length} kishiga salom berildi.`);
}
node salom-kop.js Oqil Ali Vali
# Salom, Oqil!
# Salom, Ali!
# Salom, Vali!
# Jami 3 kishiga salom berildi.

node salom-kop.js
# Foydalanish: node salom-kop.js <ism1> <ism2> ...
# Masalan:    node salom-kop.js Oqil Ali Vali

Asosiy g'oya: slice(2) bilan barcha ismlarni massivga olamiz, for...of bilan har biri ustidan yuramiz. ismlar.length esa nechta kishi borligini beradi β€” bo'sh holatni tekshirish va yakuniy hisob uchun ishlatdik.

Yechim β€” 12
// kalkulyator.js
const [aMatn, amal, bMatn] = process.argv.slice(2);

// 1) Yetarli argument berilganini tekshiramiz
if (aMatn === undefined || amal === undefined || bMatn === undefined) {
  console.log("Foydalanish: node kalkulyator.js <son> <amal> <son>");
  console.log("Amallar: + - x /   Masalan: node kalkulyator.js 8 + 3");
  process.exit(1); // 0 bo'lmagan kod β€” xato bilan tugadi degani
}

// 2) Matnlarni songa o'giramiz va haqiqiy son ekanini tekshiramiz
const a = Number(aMatn);
const b = Number(bMatn);

if (Number.isNaN(a) || Number.isNaN(b)) {
  console.log(`Xato: "${aMatn}" yoki "${bMatn}" son emas.`);
  process.exit(1);
}

// 3) Amalni bajaramiz
let natija;
switch (amal) {
  case "+":
    natija = a + b;
    break;
  case "-":
    natija = a - b;
    break;
  case "x":
    natija = a * b;
    break;
  case "/":
    if (b === 0) {
      console.log("Xato: nolga bo'lib bo'lmaydi.");
      process.exit(1);
    }
    natija = a / b;
    break;
  default:
    console.log(`Xato: "${amal}" noma'lum amal. Faqat + - x / ishlaydi.`);
    process.exit(1);
}

console.log(`${a} ${amal} ${b} = ${natija}`);
node kalkulyator.js 8 + 3
# 8 + 3 = 11

node kalkulyator.js 10 x 4
# 10 x 4 = 40

node kalkulyator.js 9 / 0
# Xato: nolga bo'lib bo'lmaydi.

node kalkulyator.js 5 % 2
# Xato: "%" noma'lum amal. Faqat + - x / ishlaydi.

node kalkulyator.js olma + 3
# Xato: "olma" yoki "3" son emas.

Bu yechimda professional CLI'ning bir nechta muhim odati bor:

  • Massivni "yechib olish" (destructuring): const [aMatn, amal, bMatn] = ... bilan uch argumentni darrov uchta o'zgaruvchiga ajratamiz.
  • Kirishni bosqichma-bosqich tekshirish: avval argument bor-yo'qligini, keyin son ekanini, keyin amalning to'g'riligini, keyin nolga bo'lishni β€” har bir xato holatga alohida, tushunarli xabar.
  • process.exit(1): dastur xato bilan tugaganida 0 dan farqli "chiqish kodi" qaytaramiz. Bu β€” boshqa dasturlar (masalan, skriptlar) sizning vositangiz muvaffaqiyatli ishlaganmi yoki yo'qmi tushunishi uchun. 0 β€” muvaffaqiyat, 0 bo'lmagan har qanday son β€” xato.
  • Number.isNaN: Number("olma") natijasi NaN (Not a Number) bo'ladi; aynan shuni tutib, foydalanuvchini ogohlantiramiz.

🏠 README Β· Keyingi: 02 β€” Modullar: CommonJS va ESM ➑️