İçeriğe geç
Educora
İleri22 dk23 / 27

Node.js temelleri

JavaScript'i tarayıcı dışında çalıştır: Node.js çalışma ortamı, CommonJS ve ES modülleri, npm ve `package.json`, `fs` ve `path` ile dosyalarla çalışma.

Kendini test et
Bu derste öğreneceklerin
  • Node.js'in ne olduğunu ve tarayıcıdaki JavaScript'ten farkını açıklamak
  • npm ile proje oluşturmak, paket kurmak ve package.json içindeki betikleri çalıştırmak
  • ES modüllerini ve yerleşik fs/promises, path, process modüllerini dosyalar ve komut satırı argümanlarıyla çalışmak için kullanmak

2009'a kadar JavaScript yalnızca tarayıcıların içinde yaşıyordu. O yıl Ryan Dahl, Chrome'un V8 motorunu alıp Node.js'i tanıttı: JavaScript'i sunucularda ve sıradan bilgisayarlarda çalıştıran bir ortam. Bugün Node.js'te backend'ler (API'ler), komut satırı araçları ve hatta masaüstü uygulamaları çalışıyor: Vite, ESLint ve Prettier Node.js üzerinde çalışır, VS Code editörü ise Node.js tabanlı Electron ile yapılmıştır.

Node.js nedir

Node.js = V8 motoru + libuv (olay döngüsü ve asenkron girdi/çıktı) + yerleşik modüller (fs, path, http, crypto ve diğerleri). Dil aynı, ortam farklı: document ya da window yoktur, ama dosyalar, ağ ve süreçler vardır. JavaScript kodun yine tanıdık olay döngüsüyle tek bir iş parçacığında çalışır, ağır girdi/çıktıyı ise sistem arka planda yapar.

TarayıcıNode.js
DOMvar (document)yok
Dosyalaryalnızca kullanıcı seçersetam erişim (fs)
Global nesnewindow / globalThisglobal / globalThis
ModüllerES modülleriES modülleri ve CommonJS
Kod nerede çalışırkullanıcının cihazındabir sunucuda ya da kendi bilgisayarında
  1. 1
    Kur

    nodejs.org sitesinden LTS (uzun süreli destek) sürümünü indir ve kur.

  2. 2
    Kontrol et

    Bir terminalde node -v ve npm -v yaz; sürümler görünmeli.

  3. 3
    Bir dosya oluştur

    hello.js adlı bir dosyaya console.log('Hello from Node!'); yaz.

  4. 4
    Çalıştır

    node hello.js. Dosyasız node etkileşimli bir konsol (REPL) açar; çıkmak için .exit.

Modüller: ES ve CommonJS

Node.js'te iki modül sistemi vardır. CommonJS (require ve module.exports) tarihsel olanıdır ve eski projelerde her yerdedir. ES modülleri (import/export) ise tarayıcıdakiyle aynı olan standarttır. Yeni projelerde ES modüllerini seç: package.json'a "type": "module" ekle ya da dosyalara .mjs uzantısı ver. Yerleşik modülleri node: önekiyle içe aktar: 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()}`);
Beklenen çıktı
12.57
Platform: win32
node app.js ile çalıştırıldı; Windows'ta win32, macOS'ta darwin, Linux'ta linux görünür.
CommonJSES modülleri
Dışa aktarmamodule.exports = { circleArea }export function circleArea() {}
İçe aktarmaconst { circleArea } = require('./math')import { circleArea } from './math.js'
Dosyanın klasörü__dirnameimport.meta.dirname
En üst düzeyde awaityokvar

npm ve package.json

npm (Node Package Manager), Node.js ile birlikte gelir ve milyonlarca paketin bulunduğu bir kayıt deposuna erişim sağlar. npm init -y bir package.json oluşturur, npm install dayjs bir bağımlılık, npm install -D vitest ise yalnızca geliştirme için bir bağımlılık ekler. Paketlerin kodu node_modules klasörüne gider, package-lock.json ise tam sürümleri kaydeder. npm run dev, scripts bölümündeki bir komutu çalıştırır; npx ise bir paketin komutunu global kurulum yapmadan çalıştırır.

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"
  }
}
Sürümler major.minor.patch biçimindedir: ^1.11.10, 2.0.0'ın altındaki her yeni sürüme, ~1.11.10 yalnızca 1.11.x yamalarına, 1.11.10 ise yalnızca o sürüme izin verir.

Dosyalar, yollar ve süreç

node:fs/promises, dosyalar için asenkron fonksiyonlar sunar: readFile, writeFile, mkdir, readdir. node:path, yolları hem Windows'ta (\) hem Linux ve macOS'ta (/) doğru kurar. process.argv komut satırı argümanlarını, process.env ise ortam değişkenlerini tutar. Aşağıdaki küçük program notları bir JSON dosyasında saklar.

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);
Beklenen çıktı
Saved note #1: Buy bread
File: notes.json | notes: 1
Saved note #2: Call Leyla
File: notes.json | notes: 2
Önce node notes.js Buy bread, sonra node notes.js Call Leyla çalıştırıldı. ENOENT “böyle bir dosya yok” demektir; ilk çalıştırmada bu normaldir.

Node.js'te bir web sunucusu kurmak için kütüphaneye bile gerek yok; yerleşik node:http modülü yeterlidir. Gerçek projelerde genellikle Express ya da Fastify gibi çatılar kullanılır, ama hepsi bu temelin üzerine kuruludur.

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'));
Beklenen çıktı
Server on http://localhost:3000
Tarayıcıda http://localhost:3000/api/hello adresini aç; yanıt: {"message":"Hello from Node","path":"/api/hello"}. Sunucuyu durdurmak için terminalde Ctrl+C tuşlarına bas.
Alıştırma

Burada process.argv, argv değişkeniyle taklit ediliyor. parseArgs(args) fonksiyonunu yaz: --anahtar değer çiftleri { anahtar: 'değer' } olsun, arkasından değer gelmeyen bir bayrak (--verbose) ise true alsın.

Alıştırma · 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']));
▸ Beklenen çıktı
{ city: 'Baku', days: '3', verbose: true }
{ help: true }
Alıştırma

satisfiesCaret(version, range) fonksiyonunu yaz: ^1.4.0 gibi bir aralık için sürümün major numarası aynı olmalı ve aralıktaki sürümden düşük olmamalı (0.x için özel kuralları dikkate alma).

Alıştırma · 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'));
}
▸ Beklenen çıktı
1.5.2 true
1.4.0 true
2.0.0 false
1.3.9 false

Önemli noktalar

  • Node.js = V8 + olay döngüsü (libuv) + yerleşik modüller: DOM'suz, ama dosyalar, ağ ve süreçlerle JavaScript.
  • Yeni projelerde ES modüllerini kullan ("type": "module", node: öneki); require eski kodlarda kalır.
  • package.json projeyi tanımlar: betikler, dependencies, devDependencies; package-lock.json sürümleri sabitler, node_modules commit edilmez.
  • Semver, major.minor.patch biçimindedir: ^ minor ve patch güncellemelerine, ~ yalnızca patch'lere izin verir.
  • fs/promises, path ve process; dosyalar, taşınabilir yollar, argümanlar ve ortam değişkenleriyle ilgilenir.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Node.js'te varsayılan olarak ne yoktur?