Node.js, JavaScript'i tarayıcının dışında, sunucu tarafında çalıştırmayı sağlayan bir çalışma zamanı ortamıdır (runtime). Web sunucularından komut satırı araçlarına, gerçek zamanlı uygulamalardan mikroservislere kadar geniş bir alanda kullanılır. Bu rehberde Node.js'in ne olduğunu, olay döngüsüne dayalı mimarisini, eşzamansız programlama modelini, npm ekosistemini ve hangi işlerde tercih edildiğini sade ve dengeli biçimde ele alıyoruz.

Node.js Nedir?

Node.js bir programlama dili değil; JavaScript kodunu işletim sistemi seviyesinde çalıştıran bir çalışma zamanı ortamıdır. JavaScript uzun yıllar yalnızca tarayıcı içinde çalışabiliyordu. Node.js, bu dili tarayıcının dışına taşıyarak dosya sistemine erişme, ağ bağlantılarını dinleme, veritabanlarıyla konuşma gibi sunucu işlerini JavaScript ile yapmanın önünü açtı.

Node.js'in çekirdeğinde Google'ın açık kaynaklı V8JavaScript motoru bulunur; bu, Chrome tarayıcısının da kullandığı motordur. V8, JavaScript kodunu yüksek performanslı makine koduna derler. Node.js, V8'in üzerine ağ, dosya sistemi ve süreç yönetimi gibi işletim sistemi yeteneklerini ekleyerek eksiksiz bir sunucu platformu haline getirir. Böylece aynı dil, hem tarayıcıda hem de sunucuda kullanılabilir; bu da ekiplerin tek bir dil etrafında uzmanlaşmasını kolaylaştırır.

Node.js'in Kısa Tarihçesi

Node.js, Ryan Dahl tarafından geliştirildi ve ilk kez 2009 yılında tanıtıldı. Temel motivasyon, o dönemdeki geleneksel sunucuların her bağlantı için ayrı bir iş parçacığı (thread) ayırmasından kaynaklanan ölçekleme sorunlarına daha verimli bir alternatif sunmaktı. Node.js, tek iş parçacıklı ve olay tabanlı bir modelle çok sayıda eşzamanlı bağlantıyı düşük kaynak tüketimiyle yönetmeyi hedefledi.

Zaman içinde npm paket yöneticisi ve büyük bir topluluk projenin etrafında oluştu. Bugün Node.js, tarafsız ve açık bir yönetişim sağlayan OpenJS Foundationçatısı altında geliştirilmektedir. Proje, düzenli sürümler ve uzun dönem destekli (LTS) sürümler yayımlar; üretim ortamları için genellikle LTS sürümlerinin kullanılması önerilir.

Node.js Nasıl Çalışır? Olay Döngüsü

Node.js'in ayırt edici özelliği, olay tabanlı (event-driven)ve engellemeyen (non-blocking) G/Çmodelidir. JavaScript kodu tek bir ana iş parçacığında çalışır, ancak dosya okuma, ağ isteği veya veritabanı sorgusu gibi girdi/çıktı (G/Ç) işlemleri arka planda yürütülür. İşlem tamamlandığında ilgili geri çağırma (callback) sıraya alınır ve olay döngüsü(event loop) tarafından işlenir.

Bu asenkron altyapının önemli bir bölümü libuvadlı C kütüphanesi tarafından sağlanır. libuv, olay döngüsünü ve platformlar arası asenkron G/Ç yeteneklerini yönetir; ayrıca dosya sistemi gibi bazı işlemler için bir iş parçacığı havuzu (thread pool) kullanır. Sonuç olarak Node.js, tek iş parçacıklı görünmesine rağmen çok sayıda eşzamanlı bağlantıyı verimli biçimde ele alabilir.

javascript
// Engellemeyen (non-blocking) dosya okuma ornegi
const fs = require("fs");

console.log("1) Okuma baslatiliyor");

fs.readFile("veri.txt", "utf8", (hata, icerik) => {
  if (hata) throw hata;
  console.log("3) Dosya okundu:", icerik.length, "karakter");
});

console.log("2) Kod calismaya devam ediyor");
// Cikti sirasi: 1) -> 2) -> 3)
// Dosya okunurken program engellenmez.

Eşzamansız Programlama: Callback, Promise ve async/await

Node.js'te eşzamansız işler tarihsel olarak geri çağırmalarla (callback)yazılırdı. İç içe geçen callback'ler zamanla okunması zor bir yapıya ("callback cehennemi") yol açabiliyordu. Modern JavaScript bunu Promiseve async/awaitsöz dizimiyle büyük ölçüde çözer; asenkron kod, senkron koda benzer bir akıcılıkla yazılabilir.

javascript
// Promise tabanli API ve async/await
const fs = require("fs/promises");

async function dosyayiOku() {
  try {
    const icerik = await fs.readFile("veri.txt", "utf8");
    console.log("Uzunluk:", icerik.length);
  } catch (hata) {
    console.error("Hata:", hata.message);
  }
}

dosyayiOku();

Modül Sistemi: CommonJS ve ES Modülleri

Node.js iki modül sistemini destekler. Tarihsel olarak varsayılan sistem, requireve module.exportskullanan CommonJS'tir. Daha yeni standart ise dilin resmi modül biçimi olan ES Modülleri (ESM)'dir; importve exportanahtar kelimelerini kullanır. Bir projenin hangi sistemi kullandığı, dosya uzantısı veya package.jsoniçindeki ayarlarla belirlenir.

ÖzellikCommonJSES Modülleri (ESM)
İçe aktarmarequire()import
Dışa aktarmamodule.exportsexport
Yükleme biçimiEşzamanlı (senkron)Eşzamansız uyumlu
Tipik dosya uzantısı.js / .cjs.mjs / .js (type: module)

İlk Node.js Sunucusu

Node.js'in mantığını anlamanın en hızlı yolu, birkaç satırla küçük bir HTTP sunucusu yazmaktır. Aşağıdaki örnek, standart httpmodülünü kullanarak gelen her isteğe basit bir yanıt döndürür. Ek bir çatı veya paket gerektirmez; yalnızca Node.js'in kendisi yeterlidir.

javascript
// Minimal HTTP sunucusu
const http = require("http");

const sunucu = http.createServer((istek, yanit) => {
  yanit.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
  yanit.end("Merhaba, Node.js!");
});

sunucu.listen(3000, () => {
  console.log("Sunucu 3000 portunda calisiyor");
});

Gerçek projelerde çoğu geliştirici, yönlendirme (routing), ara katman (middleware) ve hata yönetimi gibi ihtiyaçları kolaylaştırdığı için doğrudan httpmodülü yerine Express veya Fastify gibi bir çatı kullanır. Yine de bu örnek, Node.js'in ağ katmanına ne kadar yakın çalıştığını iyi gösterir.

npm ve Paket Ekosistemi

Node.js'in en büyük güçlerinden biri, geniş paket ekosistemidir. Varsayılan paket yöneticisi npm'dir (Node Package Manager) ve üçüncü taraf paketler npm kayıt defterinde (registry) yayımlanır. Projenin bağımlılıkları ve komut dosyaları package.jsondosyasında tutulur. Yarn ve pnpm gibi alternatif paket yöneticileri de yaygın olarak kullanılır.

bash
# Yeni bir proje baslat
npm init -y

# Bir paket kur (calisma zamani bagimliligi)
npm install express

# Gelistirme bagimliligi olarak kur
npm install --save-dev nodemon

# package.json'daki bir script'i calistir
npm run start

Node.js Nerelerde Kullanılır?

Node.js, özellikle G/Ç yoğun ve yüksek eşzamanlılık gerektiren işlerde parlar. Aşağıdaki tablo başlıca kullanım alanlarını ve bu alanlarda sık başvurulan araçları özetler.

AlanÖrnek kullanımYaygın araçlar
Web API ve sunucularREST ve GraphQL servisleriExpress, Fastify, NestJS
Gerçek zamanlı uygulamalarSohbet, bildirim, canlı gösterge panelleriSocket.IO, WebSocket
MikroservislerKüçük, bağımsız servislerNestJS, Fastify
Komut satırı araçlarıOtomasyon ve geliştirici araçlarıStandart kütüphane, Commander
Derleme/araç zinciriÖn yüz varlıklarının paketlenmesiVite, webpack, esbuild

Sunucu tarafında Node.js, farklı güçlü seçeneklerden yalnızca biridir. Aynı katmanda değerlendirilen diğer diller için PHP Nedir?ve Python Nedir?yazılarımıza göz atabilirsiniz. Yüksek eşzamanlılık ve derlenmiş performans arayanlar için Go (Golang) Nedir?yazısı da iyi bir karşılaştırma sunar.

Node.js'in Güçlü ve Zayıf Yönleri

Her teknoloji gibi Node.js de her iş için ideal değildir. Kararınızı verirken güçlü ve sınırlı yönlerini birlikte değerlendirmek yerinde olur.

Güçlü yönlerSınırlamalar
Yüksek eşzamanlılıkta verimli G/Ç yönetimiCPU yoğun işlerde tek iş parçacığı bir darboğaz olabilir
Ön yüz ve arka yüzde aynı dil (JavaScript)Eşzamansız model, yeni başlayanlar için öğrenme eğrisi getirir
Çok geniş npm paket ekosistemiPaket bağımlılıklarının denetimi ve güvenliği dikkat ister
Gerçek zamanlı uygulamalar için uygun mimariAğır sayısal hesaplamada derlenmiş dillerin gerisinde kalabilir

Çok Çekirdekli Ölçekleme: cluster ve worker_threads

Node.js varsayılan olarak tek bir iş parçacığında JavaScript çalıştırdığı için, çok çekirdekli bir sunucunun tüm gücünü tek bir süreçle kullanamaz. Bu sınırı aşmak için standart kütüphane iki temel yaklaşım sunar.

  • clustermodülü: Aynı portu paylaşan birden fazla Node.js süreci başlatarak gelen bağlantıları çekirdekler arasında dağıtır.
  • worker_threadsmodülü: CPU yoğun görevleri ana iş parçacığından ayrı iş parçacıklarına taşıyarak olay döngüsünün bloke olmasını önler.
  • Süreç yöneticileri (örneğin PM2) ve konteyner orkestrasyonu (örneğin Kubernetes): Üretimde birden çok örneği çalıştırmayı ve yeniden başlatmayı yönetir.

Popüler Çatılar ve Araçlar

Node.js ekosistemi, farklı ihtiyaçlara yönelik olgun çatılar ve araçlar barındırır. Öne çıkanlardan bazıları şunlardır:

  • Express: Minimal ve yaygın kullanılan web çatısı.
  • Fastify: Düşük ek yük hedefleyen modern web çatısı.
  • NestJS: TypeScript odaklı, kurumsal yapıya uygun çatı.
  • Socket.IO: Gerçek zamanlı, çift yönlü iletişim kütüphanesi.
  • TypeScript: Node.js projelerinde statik tip desteği için sık kullanılır.

Güvenlik ve İyi Pratikler

Node.js uygulamaları büyük ölçüde üçüncü taraf paketlere dayandığı için, güvenlik yalnızca kendi kodunuzla sınırlı değildir. Bağımlılık zincirini denetlemek ve temel iyi pratiklere uymak, üretim ortamında istikrarı doğrudan etkiler.

  • Bağımlılıkları güncel tutun ve npm auditgibi araçlarla bilinen açıkları düzenli olarak tarayın.
  • Gizli bilgileri (API anahtarları, veritabanı parolaları) kodun içine değil ortam değişkenlerine koyun.
  • Gelen tüm verileri doğrulayın ve temizleyin; kullanıcı girdisine asla koşulsuz güvenmeyin.
  • Yeni paket eklerken bakım durumunu, indirilme sayısını ve bağımlılık sayısını değerlendirin.
  • Hataları merkezi biçimde yakalayın ve olay döngüsünü bloke eden uzun işlemlerden kaçının.

Node.js Alternatifleri

Son yıllarda JavaScript ve TypeScript kodunu sunucuda çalıştırmak için alternatif çalışma zamanları da ortaya çıktı. Deno(Node.js'in de yaratıcısı olan Ryan Dahl tarafından başlatıldı) güvenlik ve yerleşik araçlara odaklanır. Bunise hız ve tümleşik bir araç zinciri iddiasıyla dikkat çeker. Node.js, olgunluğu ve geniş ekosistemiyle bu alanda hâlâ en yaygın seçenektir; alternatifleri değerlendirirken proje gereksinimlerinizi ve ekip deneyiminizi göz önünde bulundurun.

Sık Sorulan Sorular

Node.js bir programlama dili mi?

Hayır. Node.js bir çalışma zamanı ortamıdır; programlama dili JavaScript'tir. Node.js, JavaScript'in tarayıcı dışında çalışmasını sağlar.

Node.js tek iş parçacıklıysa nasıl yüksek performans sağlar?

JavaScript tek iş parçacığında çalışsa da G/Ç işlemleri arka planda ve engellemeyen biçimde yürütülür. Program bir işlemi beklerken bloke olmadığı için tek bir süreç çok sayıda eşzamanlı bağlantıyı yönetebilir. Çok çekirdek kullanımı için clusterveya worker_threadsdevreye girer.

Hangi Node.js sürümünü kullanmalıyım?

Üretim ortamları için genellikle uzun dönem destekli (LTS) sürümler önerilir; bunlar daha uzun süre güvenlik güncellemesi alır ve kararlılığa öncelik verir. En yeni özellikleri denemek isteyenler güncel (Current) sürümü tercih edebilir.