Node.js tam olarak nedir?
Node.js, bilgisayarınıza kurduğunuz ve JavaScript dosyalarını çalıştıran bir programdır. En sade tanım bu ve aslında doğrusu da bu. Terminale node script.js yazdığınızda Node, dosyayı okur, Google'ın V8 motoruna (Chrome'dan tanıdığımız JavaScript motoru) teslim eder ve çalıştırır. Üstüne de V8'in tek başına yapamayacağı işler için kocaman bir API kütüphanesi eklenmiştir.
V8'in tek bildiği şey JavaScript çalıştırmaktır. Dosya açmayı, TCP soketi dinlemeyi, süreç başlatmayı ya da bir ortam değişkenini okumayı bilmez. İşte Node.js, bütün bu yetenekleri C++ ile yazıp yerleşik modüller olarak JavaScript tarafına sunar.
node --version
node script.js
Node aslında bir dil değil. Framework de değil. Node.js bir runtime — yani V8 motoru + standart kütüphane + modül sistemi + event loop. Hepsi bu kadar.
İlk Node.js Programı
Herhangi bir .js dosyası, geçerli bir Node programıdır. Ne boilerplate var, ne de main fonksiyonu yazmanız gerekiyor:
console.log tarayıcıdaki gibi çalışır. Template literal'ler, Date, diziler, Promise'ler — bildiğin tüm dil özellikleri V8'den geldiği için aynı şekilde davranır. Node'da değişen şey, dilin etrafındaki araçlar oluyor.
Yalnızca Node'da Bulunan Global'ler
Tarayıcıda window, document, localStorage, fetch vardır. Node ise sunucu tarafı bir runtime olduğu için farklı bir global kümesine sahiptir:
process, çalışmakta olan Node sürecini temsil eder. İçinde ortam değişkenleri (process.env), komut satırı argümanları (process.argv) ve süreci sonlandıran metotlar (process.exit(1)) bulunur.__filenameve__dirname, o an çalışan dosyanın ve klasörünün mutlak yolunu verir. (ES modüllerinde bunlar yoktur; onların yerineimport.meta.urlkullanırsın.)global, en üst seviye nesnedir; tarayıcıdakiwindow'un Node'daki karşılığı diyebiliriz.
Node tarafında document ya da window diye bir şey yoktur. Kullanmaya kalkarsan ReferenceError alırsın. Zaten bir kütüphanenin tarayıcı için yazıldığını ve Node'da olduğu gibi çalışmayacağını genelde ilk bu hatadan anlarsın.
Komut Satırı Argümanları ve Ortam Değişkenleri
Node'un en yaygın kullanım alanları — CLI araçları, build script'leri, sunucular — büyük ölçüde argüman ve ortam değişkeni okumaya dayanır. İkisi de process üzerinde yaşar:
process.argv bir dizidir: ilk iki eleman Node binary'sinin yolu ve çalıştırılan script'in yoludur, yani gerçek argümanlar 2. indeksten itibaren başlar. process.env ise ortam değişkenlerini tutan sıradan bir objedir — NODE_ENV, PORT ya da API anahtarlarını buradan okumak artık standart bir yaklaşım.
Node.js Yerleşik Modülleri
Node, require (CommonJS) veya import (ESM) ile erişebildiğiniz bir standart kütüphaneyle birlikte gelir. Modül adlarının başında node: öneki bulunur; böylece bu modüllerin yerleşik olduğu açıkça belli olur:
En sık ihtiyacın olacaklar:
node:fs— dosya okuma/yazma işlemleri.async/awaitkullanmak istersennode:fs/promisessürümüne bak.node:path— dosya yollarını platformdan bağımsız şekilde birleştirmek, çözümlemek ve parse etmek için.node:http/node:https— HTTP sunucusu kurmak ve istek atmak için.node:url— URL parse etmek ve URL oluşturmak için.node:os— çalıştığın makineye dair bilgiler.node:crypto— hash'leme, rastgele byte üretimi, şifreleme.
Bunları ayrıca kurmana gerek yok; Node ile birlikte gelirler. Geri kalan her şey npm üzerinden geliyor.
Node.js event loop kısaca nasıl çalışır?
Node, JavaScript kodunu tek bir thread üzerinde çalıştırır ama aynı anda birçok işi birden yürütebilir. Bunun sırrı event loop'ta. Async bir şey çağırdığında — bir dosya okuma, HTTP isteği, timer — Node asıl işi işletim sistemine (ya da kendi thread pool'una) devreder ve çalışmaya devam eder. İş bittiğinde ilgili callback kuyruğa alınır ve o anki kod bittiğinde loop onu sıraya sokup çalıştırır.
Ekrana yazılan sıra şu şekilde oluşuyor: 1, 4, 2, 3. Önce senkron kod çalışır. Ardından mikro görevler (yani resolve olmuş promise'ler) devreye girer. En son da timer'lar. İşte bu yüzden CPU'yu meşgul eden yavaş bir döngü sunucunuzun tamamını kilitler — sizin kodunuz için tek bir thread var. Node'daki eşzamanlılık hesaplamayla değil, I/O ile ilgilidir.
Minik Bir HTTP Sunucusu
Tüm bu anlattıklarımızın karşılığı şu: çalışan bir web sunucusu birkaç satıra sığıyor:
Framework yok, bağımlılık yok. createServer her istekte çalışan bir fonksiyon alır; listen ise gelen bağlantıları işleyen event loop'u başlatır. Gerçek uygulamalarda bunun üzerine Express ya da Fastify kullanılır, ama altta yatan şey yine aynı yerleşik http modülüdür.
Node.js ve tarayıcı farkı
Neyin ortak olduğunu, neyin olmadığını net bir şekilde ortaya koymakta fayda var:
| İkisinde de çalışır | Sadece Node | Sadece tarayıcı |
|---|---|---|
Dil özellikleri (class'lar, promise'ler, async/await) | fs, http, process, __dirname | window, document, DOM |
console.log | CommonJS require / Node'a özgü ESM ayrıntıları | localStorage, sessionStorage |
fetch (Node 18+) | Dosya sistemine ve ağ soketlerine erişim | Kullanıcı event'leri, render |
setTimeout, setInterval | Child process'ler, stream'ler | History API, navigator |
Modern Node bir sürü tarayıcı API'sini de bünyesine kattı — fetch, URL, AbortController, structuredClone gibi — yani aradaki fark eskisi kadar büyük değil. Ama DOM'un Node'a geleceği yok, dosya sisteminin de tarayıcıya.
Node vs Deno vs Bun
Node hâlâ varsayılan seçenek, ama artık tek JavaScript runtime'ı değil. Deno ve Bun da birer alternatif — Deno, Node'un orijinal yaratıcısından geliyor; Bun ise hıza odaklanan daha yeni bir ekibin işi. Üçü de JavaScript (ve TypeScript'i doğrudan) çalıştırır, test runner ve bundler gibi yerleşik araçlarla gelir. Node'dan ayrıldıkları nokta modülleri, izinleri ve paket kurulumunu ele alış biçimleri.
JavaScript öğrenme açısından dokümantasyon, tutorial ve iş ilanlarının büyük çoğunluğu hâlâ Node ekosisteminde. Ana kavramlar — event loop, modüller, yerleşik API'ler — diğer runtime'lara neredeyse bire bir taşınıyor. Önce Node'u öğrenin; proje gerektirdiğinde diğerlerine geçersiniz.
Scriptleri hızlıca çalıştırma
Geliştirme sırasında kodu çalıştırmanın birkaç pratik yolu var:
# Bir dosyayı çalıştır
node script.js
# Tek satırlık komut çalıştır
node -e "console.log(2 ** 10)"
# REPL'i aç (etkileşimli komut istemi)
node
# Bir dosyayı izle ve kaydedildiğinde yeniden çalıştır (Node 18.11+)
node --watch script.js
REPL, bir dosya oluşturmadan bir metodun ne döndürdüğünü hızlıca görmek istediğinizde çok işinize yarayacak bir karalama defteri gibidir. --watch bayrağı ise geliştirme sırasında tam bir kurtarıcıdır — kaydettiğiniz anda Node betiğinizi otomatik olarak yeniden çalıştırır.
Sırada: Hataları Yakalamak
Kod çalıştırmak bir iştir, işler ters gittiğinde doğru tepki vermek ise bambaşka bir iştir. Dosya okumaları başarısız olur, HTTP istekleri zaman aşımına uğrar, JSON ayrıştırma sırasında istisnalar fırlar. Bir sonraki bölümde try/catch yapısını, hata türlerini ve bozulan şeylerle başa çıkmanın yaygın desenlerini ele alacağız — ki bir Node programında er ya da geç her şey bozulur.
Sıkça Sorulan Sorular
Node.js runtime tam olarak nedir?
Node.js, JavaScript'i tarayıcı dışında çalıştıran bir programdır. Chrome'daki JS'yi de çalıştıran Google'ın V8 motorunu alır, üstüne V8'in tek başına sunamadığı API'leri veren bir C++ katmanı ekler: dosya sistemi erişimi, ağ, process, timer'lar. İşte sunucu, CLI aracı veya build tool'u JavaScript ile yazabilmenin temelinde bu ikili duruyor.
Node ile tarayıcı arasındaki fark ne?
İkisi de JavaScript çalıştırıyor, ama dilin etrafındaki API'ler tamamen farklı. Tarayıcıda window, document ve DOM var. Node tarafında ise process, fs, http, __dirname ve CommonJS/ESM modül sistemi var. Node'da DOM yok, tarayıcıda da dosya sistemi yok — dil ortak, platform değil.
Node.js bir framework mü yoksa runtime mı?
Runtime. Node tek başına size herhangi bir uygulama yapısı dayatmaz; sadece JavaScript'i çalıştırır ve API'ler sunar. Express, Next.js ya da NestJS gibi framework'ler Node'un üzerine inşa edilmiştir. Deno ve Bun ise Node'un rakibi konumundaki alternatif JavaScript runtime'larıdır — aynı rolü üstleniyorlar.
Node'da event loop nasıl çalışır?
Event loop, Node'un tek bir thread üzerinde aynı anda birçok işi yürütmesini sağlayan mekanizmadır. Async bir şey çağırdığınızda — dosya okuma, HTTP isteği, setTimeout — Node işi sisteme devredip çalışmaya devam eder. İş bittiğinde callback kuyruğa girer, event loop da onu alıp çalıştırır. fs.readFile çağrısının programın geri kalanını bloklamamasının sebebi tam olarak budur.