23 puan yazan GN⁺ 2025-08-04 | 3 yorum | WhatsApp'ta paylaş
  • Son birkaç yılda Node.js geliştirme ortamı, web standartlarıyla yüksek uyumluluk ve güçlenen yerleşik özellikler açısından köklü bir dönüşüm geçirdi
  • ESM(ES Modules), node: öneki, top-level await gibi modern modül sistemi ve asenkron kalıpların benimsenmesiyle daha sezgisel ve güvenli kod yazmak mümkün hale geldi
  • Fetch API, AbortController, Web Streams gibi özelliklerle mevcut harici kütüphane bağımlılığı azaldı ve birçok işlev yerleşik API'lerle desteklenir oldu
  • Test runner, Watch modu, ortam dosyası desteği gibi yerleşik geliştirme araçlarıyla çalışma kolaylığı ve üretkenlik büyük ölçüde arttı
  • İzin denetimi, diagnostics channel ve tek çalıştırılabilir dosya olarak dağıtıma kadar uzanan güçlendirilmiş güvenlik ve dağıtım altyapısı sayesinde modern Node.js, profesyonel ve genel amaçlı bir platforma dönüşüyor

Node.js'in değişimi ve gelişimi

  • Node.js, başlangıçtaki callback ağırlıklı, CommonJS merkezli yapıdan bugün daha standartlaşmış bir geliştirme ortamına evriliyor
  • Bu değişim yalnızca görünüşte bir yenilik değil, sunucu tarafı JavaScript'in genel geliştirme paradigmasında yaşanan bir dönüşüm

1. Modül sistemi: ES Modules'un standartlaşması

  • CommonJS uzun süre Node.js'te kullanılan yaklaşım olsa da statik analiz, tree shaking gibi konularda sınırlamalara ve web standartlarıyla uyumsuzluk sorununa sahip
  • ESM(ES Modules) yaklaşımı, Node.js'in yeni standardı olarak yerleşti
    • import, export sözdizimi kullanılır
    • Yerleşik modülleri açıkça ayırt etmek için node: öneki getirildi
      • Örnek: import { readFile } from 'node:fs/promises'
      • Yerleşik modül ile npm paketi ayrımı daha net hale geldi
  • Top-level await desteği sayesinde modülün en üst seviyesinde de await kullanılabiliyor
    • Hemen çalışan asenkron fonksiyon sarmalayıcısına artık gerek yok
    • Kod daha doğrusal ve anlaşılır hale geliyor

2. Yerleşik web API'leri: harici bağımlılıkların azalması

  • Fetch API Node.js'e yerleşik olarak geldiği için Axios veya node-fetch gibi harici bağımlılıklar olmadan HTTP isteği yapılabiliyor
  • Fetch, varsayılan olarak zaman aşımı ve iptal işlevlerini (AbortSignal.timeout()) destekler
    • Ayrı bir timeout kütüphanesi olmadan da tutarlı hata yönetimi mümkün
  • AbortController ile dosya, ağ ve farklı asenkron işlerde iptal kalıpları uygulanabiliyor
    • Kullanıcı kesintisi veya zaman aşımı durumları için standart bir yöntem sunuyor

3. Yerleşik test: profesyonel test ortamı

  • Artık Jest, Mocha gibi harici framework'lere gerek kalmadan Node.js yerleşik test runner'ı ile çoğu ihtiyaç karşılanabiliyor
    • node:test ve node:assert ile sezgisel testler yazılabiliyor
  • Test Watch modu, coverage raporlama gibi geliştirme kolaylığı sağlayan özellikler yerleşik olarak sunuluyor
    • Kod her değiştiğinde testler otomatik olarak çalışıyor
    • Node.js 20 ve üzeri sürümlerde deneysel coverage özelliği sunuluyor

4. Evrilen asenkron kalıplar

  • async/await yaygın olarak kullanılsa da modern Node.js'te paralel yürütme ve daha gelişmiş hata yönetimi kalıplarından yararlanmak öne çıkıyor
    • Promise.all() ile paralel işler yürütülür, tek bir try/catch içinde bağlam bilgisi içeren hata işleme yapılır
  • AsyncIterator kullanımıyla sıralı olay işleme ve akış kontrolü daha kolay hale geliyor

5. Gelişmiş stream özellikleri ve web standardı uyumluluğu

  • Stream API artık web standardı olan Streams API ile uyumlu hale geldi
    • Readable.fromWeb, Readable.toWeb ile Node.js ve tarayıcı arasında stream dönüşümü yapılabiliyor
  • Promise tabanlı pipeline fonksiyonuyla sezgisel ve güvenli stream pipeline'ları kurulabiliyor

6. Worker Threads: CPU yoğun işlerde paralel yürütme

  • WorkerThreads sayesinde JS'in tek iş parçacığı sınırı aşılabiliyor ve çok çekirdekli kullanım mümkün oluyor
  • Ana döngüyü bloklamadan karmaşık hesaplamalar veya büyük veri işlemleri gerçekleştirilebiliyor

7. Geliştirici deneyiminde dönüşüm

  • --watch bayrağı ile nodemon olmadan kod değişiklikleri izlenip otomatik yeniden çalıştırma yapılabiliyor
  • --env-file bayrağı ile dotenv gerekmiyor, ortam değişkenleri anında kullanılabiliyor
  • Geliştirme ortamı kurulumu daha sade ve hızlı hale geliyor

8. Yerleşik güvenlik ve performans izleme

  • Deneysel Permission Model ile dosya/ağ erişimi gibi uygulama izinleri sınırlandırılabiliyor
    • En az ayrıcalık ilkesini uygulamak ve güvenlik uyumluluğunu sağlamak kolaylaşıyor
  • perf_hooks ile yerleşik performans ölçümü yapılabiliyor, yavaş işlemler otomatik analiz edilip kaydedilebiliyor

9. Dağıtım ve paketlemenin modernleşmesi

  • SEA(Single Executable Application) desteği sayesinde Node.js ve uygulama tek bir binary olarak dağıtılabiliyor
    • Node.js'in kurulu olmadığı ortamlarda da kolayca dağıtım ve kurulum yapılabiliyor

10. Modern hata yönetimi ve teşhis

  • Yapılandırılmış hata sınıfları ile zengin bağlam ve teşhis bilgileri içeren tutarlı hata nesneleri aktarılabiliyor
  • diagnostics_channel ile özelleştirilmiş olay tabanlı teşhis verileri aktarımı ve izleme otomasyonu yapılabiliyor

11. Modül çözümleme ve paket yönetiminde gelişim

  • Import Maps ile iç yollar ayrı bir namespace altında yönetilebiliyor
    • İç modülleri ayırmak ve refactor işlemlerini kolaylaştırmak mümkün oluyor
  • Dinamik import ile ortam veya yapılandırmaya göre çalışma anında kod yükleme ve code splitting yapılabiliyor

Temel özet ve gelecek görünümü

  • Node.js'te web standartlarına uyum, yerleşik araçlardan azami yararlanma ve modern asenkron kalıpları benimseme kritik önem taşıyor
  • Worker Threads gibi yüksek performanslı paralel işleme yetenekleri ile teşhis/güvenlik özellikleri, platformu profesyonel kullanım için daha da geliştiriyor
  • Tek çalıştırılabilir dosya olarak dağıtım ve modül namespace'leri gibi yeni özelliklerle operasyonel kolaylık ciddi ölçüde artıyor
  • Bu kalıplar, mevcut kodla uyumlu biçimde kademeli olarak uygulanabiliyor
  • 2025 sonrasında da Node.js gelişimini sürdürecek ve burada tanıtılan bu modern kalıplar, geleceğe dönük uygulamaların temeli olacak

3 yorum

 
sanori 2025-08-07

Deno ile proje yapmaya başlarken "vay, böyle şeyler de oluyormuş" demiştim; meğer node.js de benzer şekilde değişiyormuş.

 
dnltmdwhd 2025-08-05

Oha, artık axios kullanmadan doğrudan fetch ile oluyor.

 
GN⁺ 2025-08-04
Hacker News görüşleri
  • En büyük değişim ESM değil, fetch ve AbortController'ın Node'a gömülü gelmesi; axios ya da node-fetch'i kaldırabildim, Lambda bundle boyutu küçüldü ve cold start gecikmesi de yaklaşık 100 ms kısaldı; alışkanlıkla npm i axios kullananlar için 2025 Node sürümleri bunu bırakma zamanı
    • API çağrıları ve doğrulamayı birlikte kapsayan ts-rest'i tüm stack'te tercih ediyorum; zod/json schema tabanlı kütüphaneler arasında en hafif olanı ve aynı zamanda sağlam type safety sunuyor; HTTP istemcisinde de istediğini takıp kullanabiliyorsun (bun, node motorlarında fastify seçiyorum); bir miktar overhead var ama type safety'yi derleme aşamasına taşımak açısından fazlasıyla değerli bir tercih; daha iyi bir alternatif ya da farklı bir görüşü olan var mı merak ediyorum, bulabildiğim her şeye baktım ama ts-rest hem hafifliği hem de type safety'yi birlikte sağlayabilen tek seçenek gibi göründü
    • fetch sözdizimi ve await response.json gibi ek istisna işleme işleri bana o kadar da cazip gelmedi; axios kullanırken çok daha sezgisel geliyor; örnek kodlarda da axios ile basitçe response.data işlenebiliyor, fetch tarafında ise durumu elle kontrol edip sonra JSON parse etmek gerekiyor, bu yüzden daha zahmetli
    • Bir kütüphane yazarı olarak benim için asıl çok daha zor ve sancılı olan şey ESM'e geçişti, ama buna kesinlikle değen bir yükseltmeydi; fetch harika ama ESM sayesinde gerçekten çok şey kazandık
    • Node fetch, axios'tan çok daha kolay ve sade olduğu için daha iyi; bazı insanların hâlâ neden axios kullandığını bilmiyordum
    • Yerleşik istek kütüphanesi Undici çok heyecan verici görünüyor, bkz. Undici resmi sitesi
  • Artık aşağıdaki gibi dosya sistemi ya da ağ erişim izinlerini kısıtlayarak çalıştırmak mümkün
    # Dosya sistemi erişimini kısıtlama örneği
    node --experimental-permission \
      --allow-fs-read=./data --allow-fs-write=./logs app.js
    
    # Ağ kısıtlama örneği
    node --experimental-permission \
      --allow-net=api.example.com app.js
    
    Deno'dan ilham alınmış gibi duruyor, gerçekten müthiş bir özellik, Deno izin özelliği dokümantasyonu
  • chalk ya da picocolors kurmadan da artık doğrudan metin stillendirmesi yapılabiliyor
    const { styleText } = require('node:util');
    
    bkz. resmi styleText dokümantasyonu
  • Hemen uygulanabilecek çeşitli şeyler öğrendim
    1. Node'a yerleşik test geldiği için artık ille de jest kullanmak gerekmiyor
    2. Node'a watch özelliği de gömülü geldiği için nodemon da gerekmiyor
    • Ben yine de jest tercih ediyorum, çünkü jest-extended kullanılabiliyor
    • Node'un yerleşik test sisteminin kalitesiz olduğunu düşünüyorum; birkaç hafta gerçekten kullanınca nedenini anlıyorsun ve issue açsan da Node ekibi pek ilgilenmiyor
  • Matteo Collina'ya göre Node fetch, içeride Undici'nin fetch'ini kullanıyor; WHATWG web stream'leri oluşturmak zorunda olduğu için doğası gereği Undici'nin request yönteminden daha yavaş,
    bahsedilen YouTube videosu,
    Undici'nin çalışma mekanizmasını anlatan blog yazısı
    • Merak edenler için benchmark'lar burada; yakın zamanda M3 Max MacBook Pro'da yerel ve ağ ortamında test ettim, Undici yerelde en iyisiydi ama ağda Axios daha hızlı sonuç verdi; sebebini tam bilmiyorum ama son bir buçuk yıldaki Undici kullanım deneyimim mükemmeldi, production'da da gayet güvenle kullanılabilir, ancak üstün performansı sonuna kadar almak için duruma göre dikkatli değerlendirme şart
  • Node'un native TypeScript transpiler'ı sayesinde TS kullananlar için karmaşıklık ciddi biçimde azalıyor
    • Aslında transpile etmiyor, sadece tipleri kaldırıyor; TS enum gibi şeyler düzgün çalışmıyor
    • Hâlâ gerçek kullanım için yetersiz; enum benim için sorun değil ama uzantısız yerel dosya import etmek de olmuyor, constructor içinde class property tanımı da yapılamıyor
    • --experimental-strip-types bayrağına da artık gerek yok
  • Bu tür yeni özellikleri çoğu zaman böyle tesadüfen öğreniyorum; tarayıcılarda olduğu gibi "o daha yeni" türü belirsiz bir his var; eskiden sadece C# ile uğraşırken yeni dil özellikleri yazılarını okuyup gerçekten heyecanlanırdım, ama bugünlerde birden fazla dili aynı anda kullanınca tek bir dili bile yakından takip etmek kolay değil; neredeyse tamamen bloglar ve çevreden etkilenilen rastgele bir öğrenme süreci
    • Node(V8) haberlerini sevdiğim için her 2-3 ayda bir release note'ları okuyup bu tür özellikleri takip ediyorum; bazen ECMA proposals'a da bakıyorum; pipeline operator'un mutlaka gelmesini isterim
  • Bir süredir Node ekosisteminden uzaktım, tekrar bakınca gerçekten çok ilginç yeni özelliklerin geldiğini gördüm; bence Deno ve Bun'ın pazarı sarsması, Node geliştiricilerini daha da motive etti
  • Node giderek Bun.js, Deno gibi rakiplerle yarışta küçümsenmeyecek bir konuma geliyor; böyle karşılıklı rekabetin JS runtime'larının gelişimine olumlu etkisi var
    • Değişim yavaş ama net ve sevindirici; yine de Bun'ın $ shell function'ını özlüyorum, JS'yi script dili gibi kullanmak gerçekten çok rahat, ama bir sunucuda iki runtime'ı birlikte çalıştırmak da istemiyorum
  • Tıpkı tarayıcılarda olduğu gibi Node'un yeni özelliklerini de ikiye ayırmak mümkün gibi görünüyor
    1. Tamamen yeni teknoloji
    2. Zaten var olan bir özelliğin üstüne eklenen "şıklaştırma" katmanı
      İnsanların hangisine daha çok ağırlık verdiğini görmek de ilginç
    • Birine göre "şıklaştırma katmanı" olan şey, bir başkası için kullanılabilirlik (ergonomics) olabilir