Node.js brauzerdən kənarda JavaScript-i icra edən mühitdir: interfeysləri yazdığınız həmin dili götürür və onu serverdə, terminalda və öz kompüterinizdə işə salmağa imkan verir. Node.js üzərində API-lər və backend-lər, çatlar, konsol utilitləri və demək olar ki, bütün müasir frontend alətləri — npm-dən Vite-a qədər — işləyir. Node-un nədən ibarət olduğunu və brauzerdən nə ilə fərqləndiyini başa düşmək sizi növbəti mövzulardakı bir çox səhvdən qoruyacaq.

Node.js nədən ibarətdir

Node.js dil də, framework də deyil — o, icra mühitidir (runtime): .js faylınızı oxuyan və onu icra edən proqramdır. Onu 2009-cu ildə Rayan Dal (Ryan Dahl) Chrome-un sürətli JavaScript mühərrikini asinxron giriş-çıxış kitabxanası ilə birləşdirərək yaradıb. Node-un daxilində dörd əsas qat var:

KomponentDilNə edir
V8C++Chrome-un JavaScript mühərriki: kodu təhlil edir, maşın koduna kompilyasiya edir (JIT), yaddaşı və zibil yığımını (garbage collection) idarə edir
libuvCEvent loop və asinxron giriş-çıxış: fayllar, şəbəkə, taymerlər, thread pool; Linux, macOS və Windows-da eyni cür işləyir
C++ bağlantıları (bindings)C++JavaScript ilə sistem kitabxanaları arasında «körpü»: fs.readFile çağıranda bağlantı sorğunu libuv-a ötürür
Standart kitabxanaJavaScriptDaxili node:fs, node:http, node:path, node:crypto, node:os və digər modullar

Bundan əlavə, Node-a OpenSSL (şifrələmə və HTTPS), llhttp (HTTP-nin təhlili), undici (fetch-in reallaşdırılması), ICU (dillərin və tarixlərin dəstəyi) və başqa kitabxanalar daxildir. Bütün komponentlərin versiyaları process.versions obyektində saxlanılır — ona «REPL və skriptlərin işə salınması» mövzusunda ətraflı danışacağımız node -p birsətirliyi ilə baxmaq rahatdır:

bash
node -p "process.versions"
text
{
  node: '24.21.0',
  acorn: '8.18.0',
  ...
  openssl: '3.5.8',
  undici: '7.29.1',
  uv: '1.52.1',
  v8: '13.6.233.17-node.53',
  ...
}

Burada görünür ki, Node 24.21 V8 13.6 və libuv 1.52 üzərində işləyir. V8-in versiyası JavaScript-in hansı yeni imkanlarının mövcud olduğunu müəyyən edir: mühərrik sintaksisi dəstəkləyirsə, Node da onu dəstəkləyir.

💡 Sadə desək: V8 JavaScript-i necə icra etməyə, libuv isə proqramı dayandırmadan disk və şəbəkəni necə gözləməyə cavabdehdir. Bunun necə işlədiyini «Node.js-də event loop» mövzusunda araşdıracağıq.

İlk skript

Skript üçün HTML və brauzer lazım deyil — yalnız fayl və terminal. İstənilən qovluqda hello.js faylı yaradın:

js
console.log('Hello from Node.js!');
console.log(2 + 3);
console.log(`Node version: ${process.version}`);
console.log(`Platform: ${process.platform}, architecture: ${process.arch}`);

Onu fayl adı ilə node əmri vasitəsilə işə salın (terminal həmin qovluqda olmalıdır):

bash
node hello.js
text
Hello from Node.js!
5
Node version: v24.21.0
Platform: linux, architecture: x64

console.log mətni DevTools konsoluna deyil, birbaşa terminala çıxarır. process.version — Node-un versiyası, process.platform — əməliyyat sistemi (linux, macOS üçün darwin, Windows üçün win32), process.arch — prosessorun arxitekturasıdır. Sizdə dəyərlər fərqli ola bilər. Fayldakı kod bitəndə və gözləniləcək başqa heç nə qalmayanda Node prosesi özü başa çatdırır.

Node-un bacardığı, brauzerin isə bacarmadığı

Brauzer təhlükəsizlik baxımından səhifəni «qum qutusunda» (sandbox) saxlayır: o, diskdəki faylları sərbəst oxuya və ya istifadəçinin adını öyrənə bilməz. Node-da belə məhdudiyyətlər yoxdur — skriptin sistemdə sizin istifadəçinizlə eyni hüquqları var. Bu nümunəni files.mjs faylında saxlayın (.mjs genişlənməsi Node-a bunun import istifadə edən ES modulu olduğunu bildirir; ətraflı — «Node.js-də ES modulları» mövzusunda):

js
import { writeFile, readFile } from 'node:fs/promises';
import os from 'node:os';

await writeFile('note.txt', 'Written by Node.js');  // diskdə fayl yaradırıq
const text = await readFile('note.txt', 'utf8');    // onu geri oxuyuruq
console.log(text);

console.log(`OS: ${os.type()}, CPU cores: ${os.availableParallelism()}`);
console.log(`Home folder: ${os.homedir()}`);
text
Written by Node.js
OS: Linux, CPU cores: 4
Home folder: /home/aysel

İşə saldıqdan sonra skriptin yanında note.txt faylı yaranacaq. Daxili modullar node: prefiksi ilə qoşulur — belə olduqda dərhal görünür ki, bu npm paketi deyil, Node-un bir hissəsidir. node:fs/promises modulu fayllarla, node:os isə sistem haqqında məlumatla işləyir.

Node.js və brauzer: ortaq dil, fərqli mühit

Dil eynidir — ECMAScript standartı: dəyişənlər, funksiyalar, siniflər, promise-lər, async/await eyni cür işləyir. Fərqlənən mühitdir — mühitin verdiyi qlobal obyektlər və API-lər toplusu:

BrauzerNode.js
Qlobal obyektwindow (və globalThis)globalThis (köhnə adı — global)
Səhifə və DOMdocument, querySelector, klik hadisələriyoxdur
Dialoqlaralert, prompt, confirmyoxdur
Fayl sistemiyoxdur (yalnız istifadəçinin fayl seçməsi ilə)node:fs
Proses haqqında məlumatyoxdurprocess: versiya, mühit dəyişənləri, arqumentlər
Binar verilənlərArrayBuffer, Blobeyni + Buffer
Ortaq Web API-lərfetch, URL, setTimeout, console, structuredClone, AbortControllereyniləri

Bunu praktikada yoxlayaq. globals.js faylı:

js
console.log(typeof window);          // → undefined
console.log(typeof document);        // → undefined
console.log(typeof globalThis);      // → object
console.log(globalThis === global);  // → true
console.log(typeof process, typeof Buffer);          // → object function
console.log(typeof fetch, typeof setTimeout);        // → function function

globalThis qlobal obyektin hər yerdə — brauzerdə, Node-da, worker-lərdə — işləyən standart adıdır. Hər iki mühitdə işləməli olan kod yazanda ondan istifadə edin. Bir çox Web API (fetch, URL, TextEncoder, AbortController, crypto.randomUUID) Node-a daxil edilib və brauzerdəki kimi davranır, ona görə də frontend biliklərinizi birbaşa tətbiq edə bilərsiniz.

⚠️ Skriptin fayllara və şəbəkəyə tam çıxışı olduğu üçün yalnız etibar etdiyiniz kodu işə salın. Təsadüfi repozitoriyadan götürülmüş skript ev qovluğunuzdakı açarları oxuya və ya faylları silə bilər — burada brauzerin «qum qutusu» yoxdur.

Node.js harada tətbiq olunur

Node proqramın çox gözlədiyi yerdə xüsusilə yaxşıdır: verilənlər bazasının cavabını, faylı, şəbəkəni. Bir əməliyyat gözləyərkən Node digərlərinə xidmət edir, buna görə də bir proses minlərlə eyni vaxtlı bağlantını saxlaya bilir. Minimal veb server belə görünür (server.mjs faylı):

js
import { createServer } from 'node:http';

const server = createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
  res.end(`Hello from Node.js ${process.version}!\n`);
});

server.listen(3000, () => {
  console.log('Server is running at http://localhost:3000');
});

node server.mjs əmrini işə salın və brauzerdə http://localhost:3000 ünvanını açın — Hello from Node.js v24.21.0! görəcəksiniz. hello.js-dən fərqli olaraq bu proses başa çatmır: siz Ctrl+C basana qədər server yeni sorğuları gözləyir. http modulunu ayrıca bölmədə ətraflı öyrənəcəyik.

Tipik tətbiq sahələri:

  • API-lər və backend-lər — Express, Fastify, NestJS üzərində REST və GraphQL serverləri.
  • Real vaxt — WebSocket və Socket.IO ilə çatlar, bildirişlər, birgə redaktə, onlayn oyunlar.
  • CLI utilitləri — npm, ESLint, Prettier, TypeScript kompilyatoru və yüzlərlə digər alət Node üçün yazılıb.
  • SSR və fullstack framework-lər — Next.js, Nuxt, Astro səhifələri Node vasitəsilə serverdə render edir.
  • Build alətləri — Vite, webpack, Rollup: istənilən müasir frontend layihəsi Node-da yığılır.
  • Desktop — Electron (VS Code onun üzərində hazırlanıb) Node-u və Chromium-u birləşdirir.

Node harada zəifdir

Node-da JavaScript bir əsas thread-də icra olunur. Kod uzun müddət nəsə hesablayırsa — videonu sıxırsa, mürəkkəb riyazi hesablamalar aparırsa, böyük şəkilləri emal edirsə — thread məşğul olur və bütün digər sorğular gözləyir. Belə tapşırıqlar üçün Node-da worker_threads var (kursun ayrıca mövzusu) və ya hesablamaları başqa dildə yazılmış servisə çıxarırlar. Meyar sadədir: çoxlu giriş-çıxış və şəbəkə — Node əla uyğundur; hər sorğuda ağır hesablamalar — başqa yanaşma lazımdır.

Tipik səhvlər

1. Node-da brauzer obyektləri. document və ya window olan kod dərhal çökür:

js
document.querySelector('h1'); // ❌ ReferenceError: document is not defined

Node-da səhifə və DOM yoxdur. Qlobal obyekt üçün globalThis istifadə edin, DOM ilə işləyən kodu isə brauzerdə işə salın.

2. Frontend kodunda Node modulları. Əks vəziyyət: HTML səhifəyə qoşulmuş skriptdə import fs from 'node:fs' işləməyəcək — brauzerin fayl sisteminə çıxışı yoxdur. Server kodu və brauzer kodu eyni dildə yazılsa da, fərqli mühitlərdə yaşayır.

3. «Node.js framework-dür» və ya «dildir». Node icra mühitidir. Dil JavaScript-dir (və ya JavaScript-ə kompilyasiya olunan TypeScript). Framework-lər — Express, Fastify, NestJS — Node üzərində işləyən npm paketləridir.

4. Sorğu emalçısında ağır hesablamalar. HTTP sorğusunun emalçısında bir neçə saniyəlik dövr serveri bütün istifadəçilər üçün «dondurur». Belə tapşırıqları worker thread-lərə, fon tapşırıqları növbələrinə və ya ayrıca servislərə çıxarırlar.

Xülasə

  • Node.js brauzerdən kənarda JavaScript icra mühitidir, dil və ya framework deyil.
  • Node-un əsası: V8 mühərriki JavaScript-i icra edir, libuv event loop və asinxron giriş-çıxışa cavabdehdir, C++ bağlantıları onları standart kitabxana ilə əlaqələndirir.
  • Skript node fayl.js əmri ilə işə salınır; komponentlərin versiyaları process.version və process.versions-dadır.
  • Node-da window, document və alert yoxdur, əvəzində globalThis, process, Buffer və fayllara, şəbəkəyə, ƏS-ə çıxış var.
  • Bir çox Web API (fetch, URL, setTimeout, AbortController) brauzerdəki kimi işləyir.
  • Node çoxlu giriş-çıxış tələb edən tapşırıqlarda (API, real vaxt, CLI, SSR, build) güclü, əsas thread-dəki ağır hesablamalarda isə zəifdir.

Praktika

  1. Node-un versiyasını, V8 və libuv versiyalarını, platformanı və prosessorun arxitekturasını V8: 13.6.233.17-node.53 kimi səliqəli sətirlərlə çıxaran about.js yaradın.
  2. İcra mühitini müəyyən edən env-check.js yazın: typeof window !== 'undefined' olarsa «Browser», typeof process !== 'undefined' olarsa «Node.js» çıxarsın. Onu Node-da işə salın, eyni kodu isə brauzerin DevTools konsoluna yapışdırın.
  3. Platforma, nüvələrin sayı, gigabaytla boş yaddaşın həcmi və ev qovluğu ilə obyekt toplayan və onu system-info.json faylında saxlayan system-info.mjs yazın.
  4. Kiçik tapşırıq: server.mjs-i elə təkmilləşdirin ki, server / ünvanında salamla, /info ünvanında isə Node versiyası, platforma və prosesin iş vaxtı (process.uptime()) olan JSON ilə cavab versin.

💡 3-cü tapşırıqda os.freemem() (baytlar), JSON.stringify(data, null, 2) və node:fs/promises-dən writeFile lazım olacaq. 4-cü tapşırıqda sorğunun ünvanı req.url-dədir, JSON üçün isə Content-Type: application/json başlığını göndərin.