- Node.js-in nə olduğunu və brauzerdəki JavaScript-dən fərqini izah etmək
npmilə layihə yaratmaq, paket quraşdırmaq vəpackage.json-dakı skriptləri işə salmaq- ES modulları və daxili
fs/promises,path,processmodulları ilə fayllarla və əmr sətri arqumentləri ilə işləmək
2009-cu ilə qədər JavaScript yalnız brauzerlərin içində yaşayırdı. Həmin il Rayan Dal (Ryan Dahl) Chrome-un V8 mühərrikini götürüb Node.js-i təqdim etdi — JavaScript-i serverlərdə və adi kompüterdə işə salan mühit. Bu gün Node.js-də backend-lər (API-lər), əmr sətri alətləri, hətta masaüstü proqramlar işləyir: Vite, ESLint və Prettier Node.js-də işləyir, VS Code redaktoru isə Node.js-ə əsaslanan Electron üzərində qurulub.
Node.js nədir
Node.js = V8 mühərriki + libuv (hadisə dövrü və asinxron giriş-çıxış) + daxili modullar (fs, path, http, crypto və s.). Dil eynidir, mühit fərqlidir: document və window yoxdur, əvəzində fayllar, şəbəkə və proseslər var. Sənin JavaScript kodun yenə bir axında və tanış hadisə dövrü ilə işləyir, ağır giriş-çıxışı isə sistem arxa planda görür.
| Brauzer | Node.js | |
|---|---|---|
| DOM | var (document) | yoxdur |
| Fayllar | yalnız istifadəçi seçəndə | tam çıxış (fs) |
| Qlobal obyekt | window / globalThis | global / globalThis |
| Modullar | ES modulları | ES modulları və CommonJS |
| Kod harada işləyir | istifadəçinin cihazında | serverdə və ya sənin kompüterində |
- 1Quraşdır
nodejs.org saytından LTS (uzunmüddətli dəstək) versiyasını yüklə və quraşdır.
- 2Yoxla
Terminalda
node -vvənpm -vyaz — versiyalar görünməlidir. - 3Fayl yarat
hello.jsfaylınaconsole.log('Hello from Node!');yaz. - 4İşə sal
node hello.js. Faylsıznodeinteraktiv konsol (REPL) açır; çıxmaq üçün.exityaz.
Modullar: ES və CommonJS
Node.js-də iki modul sistemi var. CommonJS (require və module.exports) — tarixi sistemdir və köhnə layihələrdə hər yerdədir. ES modulları (import/export) — brauzerdəki ilə eyni olan standartdır. Yeni layihələrdə ES modullarını seç: package.json-a "type": "module" əlavə et və ya fayllara .mjs uzantısı ver. Daxili modulları node: prefiksi ilə import et: import fs from 'node:fs'.
// math.js
export const PI = 3.14159;
export function circleArea(r) {
return PI * r * r;
}
// app.js
import { circleArea } from './math.js';
import os from 'node:os';
console.log(circleArea(2).toFixed(2));
console.log(`Platform: ${os.platform()}`);12.57 Platform: win32
node app.js ilə işə salınıb; Windows-da win32, macOS-də darwin, Linux-da linux görünür.| CommonJS | ES modulları | |
|---|---|---|
| Eksport | module.exports = { circleArea } | export function circleArea() {} |
| İmport | const { circleArea } = require('./math') | import { circleArea } from './math.js' |
| Faylın qovluğu | __dirname | import.meta.dirname |
Ən üst səviyyədə await | yoxdur | var |
npm və package.json
npm (Node Package Manager) Node.js ilə birlikdə gəlir və milyonlarla paketi olan reyestrə çıxış verir. npm init -y package.json yaradır, npm install dayjs asılılıq, npm install -D vitest isə yalnız inkişaf üçün asılılıq əlavə edir. Paketlərin kodu node_modules qovluğuna düşür, package-lock.json isə dəqiq versiyaları qeyd edir. npm run dev scripts bölməsindəki əmri işə salır, npx isə paketin əmrini qlobal quraşdırmadan icra edir.
{
"name": "notes-cli",
"version": "1.0.0",
"type": "module",
"scripts": {
"start": "node notes.js",
"test": "vitest"
},
"dependencies": {
"dayjs": "^1.11.10"
},
"devDependencies": {
"vitest": "^2.1.0"
}
}major.minor.patch-dir: ^1.11.10 2.0.0-dan aşağı istənilən yeni versiyaya icazə verir, ~1.11.10 yalnız 1.11.x yamalarına, 1.11.10 isə yalnız bu versiyaya.Fayllar, yollar və proses
node:fs/promises fayllar üçün asinxron funksiyalar verir: readFile, writeFile, mkdir, readdir. node:path yolları Windows-da (\) da, Linux və macOS-də (/) da düzgün qurur. process.argv əmr sətrinin arqumentlərini, process.env mühit dəyişənlərini saxlayır. Aşağıdakı kiçik proqram qeydləri JSON faylında saxlayır.
// notes.js
import { readFile, writeFile, mkdir } from 'node:fs/promises';
import path from 'node:path';
const dir = path.join(import.meta.dirname, 'data');
const file = path.join(dir, 'notes.json');
await mkdir(dir, { recursive: true });
let notes = [];
try {
notes = JSON.parse(await readFile(file, 'utf8'));
} catch (error) {
if (error.code !== 'ENOENT') throw error;
}
const text = process.argv.slice(2).join(' ') || 'Empty note';
notes.push({ id: notes.length + 1, text });
await writeFile(file, JSON.stringify(notes, null, 2));
console.log(`Saved note #${notes.length}: ${text}`);
console.log('File:', path.basename(file), '| notes:', notes.length);Saved note #1: Buy bread File: notes.json | notes: 1 Saved note #2: Call Leyla File: notes.json | notes: 2
node notes.js Buy bread, sonra node notes.js Call Leyla icra olunub. ENOENT «fayl yoxdur» deməkdir — ilk işə salınmada bu, normal haldır.Node.js-də veb-server qurmaq üçün kitabxana belə lazım deyil — daxili node:http modulu kifayətdir. Real layihələrdə adətən Express və ya Fastify kimi freymvorklar işlədilir, amma hamısı bu əsasın üzərində qurulub.
// server.js
import http from 'node:http';
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Hello from Node', path: req.url }));
});
server.listen(3000, () => console.log('Server on http://localhost:3000'));Server on http://localhost:3000
http://localhost:3000/api/hello ünvanını aç — cavab: {"message":"Hello from Node","path":"/api/hello"}. Serveri dayandırmaq üçün terminalda Ctrl+C.process.argv massivi burada argv dəyişəni ilə təqlid olunub. parseArgs(args) funksiyasını yaz: --açar dəyər cütləri { açar: 'dəyər' } olsun, arxasınca dəyər gəlməyən bayraq (--verbose) isə true alsın.
const argv = ['node', 'app.js', '--city', 'Baku', '--days', '3', '--verbose'];
function parseArgs(args) {
const options = {};
// walk through args; --key value → options[key] = value, lone --flag → true
return options;
}
console.log(parseArgs(argv.slice(2)));
console.log(parseArgs(['--help']));▸ Gözlənilən nəticə
{ city: 'Baku', days: '3', verbose: true }
{ help: true }satisfiesCaret(version, range) funksiyasını yaz: ^1.4.0 kimi aralıq üçün versiya eyni major nömrəyə malik olmalı və aralıqdakı versiyadan kiçik olmamalıdır (0.x üçün xüsusi qaydaları nəzərə alma).
function satisfiesCaret(version, range) {
// compare major, then minor, then patch
}
for (const version of ['1.5.2', '1.4.0', '2.0.0', '1.3.9']) {
console.log(version, satisfiesCaret(version, '^1.4.0'));
}▸ Gözlənilən nəticə
1.5.2 true 1.4.0 true 2.0.0 false 1.3.9 false
Əsas fikirlər
- Node.js = V8 + hadisə dövrü (libuv) + daxili modullar: DOM-suz, amma fayllar, şəbəkə və proseslərlə JavaScript.
- Yeni layihələrdə ES modullarını işlət (
"type": "module",node:prefiksi);requireköhnə kodda qalır. package.jsonlayihəni təsvir edir: skriptlər,dependencies,devDependencies;package-lock.jsonversiyaları sabitləyir,node_modulescommit olunmur.- Semver
major.minor.patch:^minor və patch yeniləmələrinə,~yalnız patch-ə icazə verir. fs/promises,pathvəprocessfayllarla, daşına bilən yollarla, arqumentlərlə və mühit dəyişənləri ilə işləyir.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.