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:
| Komponent | Dil | Nə edir |
|---|---|---|
| V8 | C++ | 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 |
| libuv | C | Event 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 kitabxana | JavaScript | Daxili 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:
node -p "process.versions"{
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:
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):
node hello.jsHello from Node.js!
5
Node version: v24.21.0
Platform: linux, architecture: x64console.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):
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()}`);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:
| Brauzer | Node.js | |
|---|---|---|
| Qlobal obyekt | window (və globalThis) | globalThis (köhnə adı — global) |
| Səhifə və DOM | document, querySelector, klik hadisələri | yoxdur |
| Dialoqlar | alert, prompt, confirm | yoxdur |
| Fayl sistemi | yoxdur (yalnız istifadəçinin fayl seçməsi ilə) | node:fs |
| Proses haqqında məlumat | yoxdur | process: versiya, mühit dəyişənləri, arqumentlər |
| Binar verilənlər | ArrayBuffer, Blob | eyni + Buffer |
| Ortaq Web API-lər | fetch, URL, setTimeout, console, structuredClone, AbortController | eyniləri |
Bunu praktikada yoxlayaq. globals.js faylı:
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 functionglobalThis 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ı):
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:
document.querySelector('h1'); // ❌ ReferenceError: document is not definedNode-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.versionvəprocess.versions-dadır. - Node-da
window,documentvəalertyoxdur, əvəzindəglobalThis,process,Buffervə 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
- Node-un versiyasını, V8 və libuv versiyalarını, platformanı və prosessorun arxitekturasını
V8: 13.6.233.17-node.53kimi səliqəli sətirlərlə çıxaranabout.jsyaradın. - İcra mühitini müəyyən edən
env-check.jsyazı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. - Platforma, nüvələrin sayı, gigabaytla boş yaddaşın həcmi və ev qovluğu ilə obyekt toplayan və onu
system-info.jsonfaylında saxlayansystem-info.mjsyazın. - 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ənwriteFilelazım olacaq. 4-cü tapşırıqda sorğunun ünvanıreq.url-dədir, JSON üçün isəContent-Type: application/jsonbaşlığını göndərin.