Məzmuna keç
Educora
İrəli22 dəq23 / 27

Node.js əsasları

JavaScript-i brauzerdən kənarda işə sal: Node.js mühiti, CommonJS və ES modulları, npm və `package.json`, `fs` və `path` ilə fayllarla iş.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Node.js-in nə olduğunu və brauzerdəki JavaScript-dən fərqini izah etmək
  • npm ilə layihə yaratmaq, paket quraşdırmaq və package.json-dakı skriptləri işə salmaq
  • ES modulları və daxili fs/promises, path, process modulları 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.

BrauzerNode.js
DOMvar (document)yoxdur
Fayllaryalnız istifadəçi seçəndətam çıxış (fs)
Qlobal obyektwindow / globalThisglobal / globalThis
ModullarES modullarıES modulları və CommonJS
Kod harada işləyiristifadəçinin cihazındaserverdə və ya sənin kompüterində
  1. 1
    Quraşdır

    nodejs.org saytından LTS (uzunmüddətli dəstək) versiyasını yüklə və quraşdır.

  2. 2
    Yoxla

    Terminalda node -v və npm -v yaz — versiyalar görünməlidir.

  3. 3
    Fayl yarat

    hello.js faylına console.log('Hello from Node!'); yaz.

  4. 4
    İşə sal

    node hello.js. Faylsız node interaktiv konsol (REPL) açır; çıxmaq üçün .exit yaz.

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'.

JavaScript
// 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()}`);
Gözlənilən nəticə
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.
CommonJSES modulları
Eksportmodule.exports = { circleArea }export function circleArea() {}
İmportconst { circleArea } = require('./math')import { circleArea } from './math.js'
Faylın qovluğu__dirnameimport.meta.dirname
Ən üst səviyyədə awaityoxdurvar

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.

JSON
{
  "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"
  }
}
Versiya formatı 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.

JavaScript
// 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);
Gözlənilən nəticə
Saved note #1: Buy bread
File: notes.json | notes: 1
Saved note #2: Call Leyla
File: notes.json | notes: 2
Əvvəl 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.

JavaScript
// 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'));
Gözlənilən nəticə
Server on http://localhost:3000
Brauzerdə http://localhost:3000/api/hello ünvanını aç — cavab: {"message":"Hello from Node","path":"/api/hello"}. Serveri dayandırmaq üçün terminalda Ctrl+C.
Tapşırıq

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.

Tapşırıq · JavaScript
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 }
Tapşırıq

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).

Tapşırıq · JavaScript
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); require köhnə kodda qalır.
  • package.json layihəni təsvir edir: skriptlər, dependencies, devDependencies; package-lock.json versiyaları sabitləyir, node_modules commit olunmur.
  • Semver major.minor.patch: ^ minor və patch yeniləmələrinə, ~ yalnız patch-ə icazə verir.
  • fs/promises, path və process fayllarla, 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.

1 / 10
Node.js-də susmaya görə nə yoxdur?