Node.js

Orijinal Yazar(lar) Ryan Dahl
Geliştirici(ler) Çeşitli
İlk Sürüm 27 Mayıs 2009
Stabil Sürüm 12.9.1 / 26 Ağustos 2019
Depo github.com/nodejs/node
Yazılmış C, C++, JavaScript
İşletim Sistemi Linux, macOS, Microsoft Windows, SmartOS, FreeBSD, OpenBSD, IBM AIX
Tip Çalışma Zamanı Ortamı
Lisans MIT lisansı
Web Sitesi nodejs.org

Node.js; JavaScript kodunu bir tarayıcının dışında yürüten açık kaynak, platformlar arası, JavaScript çalışma zamanı ortamıdır. Node.js; geliştiricilerin komut satırı araçları yazmak ve sunucu tarafı komut dosyaları yazmak için JavaScript kullanmasına izin verir; sayfalar kullanıcının web tarayıcısına gönderilmeden önce dinamik web sayfası içeriği üretmek için komut dosyası sunucusu tarafında çalışır. Sonuç olarak Node.js; web ve web uygulama geliştirmelerini, sunucu ve istemci tarafı komut dosyaları için farklı dillerden ziyade tek bir programlama dili etrafında birleştiren “her yerde JavaScript” paradigmasını temsil eder.

.js, JavaScript kodu için standart bir dosya adı uzantısı olsa da “Node.js” adı; bu bağlamdaki belirli bir dosyaya karşılık gelmez ve yalnızca ürünün adıdır. Node.js, zaman uyumsuz G/Ç yapabilen olay odaklı bir mimariye sahiptir. Bu tasarım seçenekleri; birçok giriş/çıkış işleminin yanı sıra gerçek zamanlı Web uygulamaları (örneğin; gerçek zamanlı iletişim programları ve tarayıcı oyunları) ile web uygulamalarında verim ve ölçeklenebilirliği optimize etmeyi amaçlar.

Node.js Foundation tarafından yönetilen Node.js dağıtılmış geliştirme projesi, Linux Foundation’un Collaborative Projects programı tarafından kolaylaştırılmıştır.

Node.js yazılımının kurumsal kullanıcıları GoDaddy, Groupon, IBM, Microsoft, Netflix, PayPal, Rakuten, SAP, Voxer, Walmart ve Yahoo!’dur.

Tarihçe

Node.js ilk olarak 2009 yılında ilk sunucu tarafı JavaScript ortamı olan Netscape’nin LiveWire Pro Web’i tanıtıldıktan yaklaşık on üç yıl sonra Ryan Dahl tarafından yazılmıştır. İlk sürüm sadece Linux ve Mac OS X’i destekledi. Geliştirilmesi ve bakımı Dahl tarafından yönetildi ve daha sonra Joyent tarafından desteklendi.

Dahl; birçok eş zamanlı bağlantıyı (10.000’e kadar ve daha fazlası) ele almak için en popüler web sunucusunun Apache HTTP Server’deki sınırlı olasılıklarını ve kodun tüm işlemi engellediğinde veya eş zamanlı bağlantılarda birden fazla yürütme yığınını ima ettiğinde kod oluşturmanın (sıralı programlama) en yaygın yolunu eleştirdi.

Dahl, projeyi 8 Kasım 2009’da düzenlenen Avrupa JSConf’ta gösterdi. Node.js; Google’nin V8 JavaScript motorunu, bir olay döngüsünü ve düşük seviye bir G/Ç API’sını birleştirdi.

Ocak 2010’da npm adlı Node.js ortamı için bir paket yöneticisi tantıldı. Paket yöneticisi; programcıların Node.js kütüphanelerinin kaynak kodunu yayımlamasını ve paylaşmasını kolaylaştırır ve kütüphanelerin kurulumunu, güncellenmesini ve kaldırılmasını basitleştirmek için tasarlanmıştır.

Haziran 2011’de Microsoft ve Joyent, Node.js’nin yerel bir Windows sürümünü uyguladı. Windows destekleyen ilk Node.js sürümü Temmuz 2011’de yayımlandı.

Ocak 2012’de Dahl projeyi yönetmek için iş arkadaşı ve npm oluşturucusu Isaac Schlueter’i teşvik ederek kenara çekildi. Ocak 2014’te Schlueter, Timothy J. Fontaine’nin projeyi yöneteceğini açıkladı.

Aralık 2014’te Fedor Indutny, Node.js’in bir çatalı olan io.js’ye başladı. Joyent’in yönetimi üzerindeki iç çatışma nedeniyle io.js ayrı bir teknik komite ile açık bir yönetim alternatifi olarak oluşturuldu. Node.js’den farklı olarak yazarlar io.js’yi Google V8 JavaScript motorunun son sürümleri ile güncel tutmayı planladılar.

Şubat 2015’te tarafsız bir Node.js Foundation kurma niyetinin açıklandığı bildirildi. Haziran 2015 itibarıyla Node.js ve io.js toplulukları, Node.js Foundation altında birlikte çalışmaya oy verdi.

Eylül 2015’te Node.js v0.12 ve io.js v3.3, tekrar Node v4.0 ile birleştirildi. Bu birleştirme V8 ES6 özelliklerini Node.js’ye ve uzun süreli destek yayın döngüsüne getirdi. 2016 itibarıyla io.js web sitesi; geliştiricilerin Node.js’ye geri dönmelerini ve birleştirme nedeniyle daha fazla io.js sürümünün planlanmamasını önerir.

Genel Bakış

Node.js; JavaScript’i ve çeşitli temel fonksiyonları işleyen bir “modüller” koleksiyonu kullanarak Web sunucuları ve ağ oluşturma araçlarının oluşturulmasına izin verir. Modüller dosya sistemi G/Ç, ağ (DNS, HTTP, TCP, TLS/SSL veya UDP), ikili veri (tamponlar), şifreleme fonksiyonları, veri akışları ve diğer çekirdek fonksiyonlar için sağlanmıştır. Node.js’nin modülleri, yazma sunucusu uygulamalarının karmaşıklığını azaltmak için tasarlanmış bir API kullanır.

Her ne kadar başlangıçta modül sistemi commonjs modül modeline dayanıyor olsa da ECMAScript spesifikasyonundaki son modüllerin tanıtımı, Node.js’de ECMAScript Modules’i varsayılan olarak kullanma yönünü değiştirdi.

Node.js; SmartOS ve IBM AIX için 2. seviye destek ve FreeBSD için deneysel destek ile Linux, macOS ve Microsoft Windows 7 ve Server 2008’de (ve sonrasında) resmî olarak desteklenmektedir. OpenBSD ayrıca çalışır ve IBM i (AS/400) için LTS sürümleri kullanılabilir. Sağlanan kaynak kodu; NonStop OS ve Unix sunucuları gibi diğerlerini desteklemek için resmî olarak desteklenen veya üçüncü taraflarca değiştirilenlere benzer işletim sistemleri üzerine de oluşturulabilir. Alternatif olarak CoffeeScript (bir JavaScript alternatifi), Dart veya TypeScript (kuvvetle yazılan JavaScript formları) veya JavaScript ile derlenebilecek herhangi bir dille yazılabilir.

Node.js ve PHP arasındaki en önemli fark, PHP blokunda çoğu fonksiyonun tamamlanmasına kadar devam etmesi (komutlar sadece önceki komutlar bittikten sonra çalışır) ve Node.js fonksiyonlarının engellenmemesidir (komutlar eş zamanlı veya hatta paralel olarak yürütülür ve tamamlanma veya başarısızlık sinyalini vermek için geri çağrılar kullanır).

Platform Mimarisi

Node.js, hızlı web sunucularının JavaScript’te geliştirilmesine olanak tanıyarak web tabanlı sunuculara olaya dayalı programlama sağlar. Geliştiriciler, bir işin tamamlandığını bildirmek için geri çağrıları kullanan basitleştirilmiş bir olay odaklı programlama modelini kullanarak iş parçacığı kullanmadan ölçeklenebilir sunucular oluşturabilirler. Node.js, bir kodlama dilinin (JavaScript) kolaylığını Unix ağ programlamanın gücüyle birleştirir.

Node.js, BSD lisansı altında açık kaynak olduğundan Google V8 JavaScript motorunda kuruldu. HTTP, DNS, TCP gibi internet temelleri konusunda uzmandır. JavaScript aynı zamanda iyi bilinen bir dildi ve Node.js’yi web geliştirme topluluğu için erişilebilir hâle getirdi.

Endüstri Desteği

Node.js için çoğu npm web sitesinde barındırılan binlerce açık kaynak kütüphane var. Node.js geliştirici topluluğunun iki ana posta listesi ve freenode’deki IRC kanalı #node.js var. NodeConf, Node Interactive ve Node Summit dâhil olmak üzere Node.js topluluğunu destekleyen çok sayıda geliştirici konferansı ve etkinliği ve ayrıca bir dizi bölgesel etkinlik de var.

Açık kaynak topluluğu, uygulamaların geliştirilmesini hızlandırmak için web yazılım iskeletleri geliştirdi. Bu yazılım iskeletleri arasında Connect, Express.js, Socket.IO, Feathers.js, Koa.js, Hapi.js, Sails.js, Meteor, Derby ve diğerleri sayılabilir. Diğer dillerle veya Microsoft .NET gibi çalışma zamanı ortamlarıyla arayüz oluşturmak için çeşitli paketler de oluşturulmuştur.

Modern masaüstü IDE’leri; özellikle Node.js uygulamaları için düzenleme ve hata ayıklama özellikleri sunar. Bu IDE’ler Atom, Brackets, JetBrains WebStorm, Microsoft Visual Studio (with Node.js Tools for Visual Studio, or TypeScript with Node definitions,) NetBeans, Nodeclipse Enide Studio (Eclipse tabanlı) ve Visual Studio Code’yi içerir. Bazı çevrim içi web tabanlı IDE’ler ayrıca Codeanywhere, Codenvy, Cloud9 IDE, Koding ve Node-RED’deki görsel akış düzenleyicisi gibi Node.js’yi de destekler.

Sürümler

Node.js’nin yeni majör sürümleri GitHub master şubesinden altı ayda bir kesiliyor. Çift numaralı sürümler Nisan ayında, tek sayılı sürümler ise Ekim ayında kesilir. Yeni bir tek sayılı sürüm çıktığında önceki çift sürüm, bu sürüme LTS olarak atanan tarihten 18 ay boyunca aktif destek veren Long Term Support (LTS)’a geçiş yapar. Bu 18 aylık sürenin dolmasından sonra bir LTS sürümü ek 12 aylık bakım desteği alır. Aktif bir sürüm, geçerli sürümdeki birkaç hafta içinde değişiklik yaptıktan birkaç hafta sonra değişikliklerin non-breaking backports’unu alır. Bir bakım sürümü yalnızca kritik düzeltmeleri ve dokümantasyon güncellemelerini alır. LTS Working Group, Node.js Foundation’un Technical Steering Committee ile iş birliği içinde strateji ve politika yönetir.

Teknik Detaylar

Node.js, gelen istekleri olay döngüsü adı verilen bir döngüde işleyen bir JavaScript çalışma zamanı ortamıdır.

Threading

Node.js; engelleme yapmayan G/Ç çağrıları kullanarak tek bir iş parçacığı olay döngüsünde çalışır ve iş parçacığı bağlamı değiştirme maliyetine neden olmadan on binlerce eş zamanlı bağlantıyı desteklemesini sağlar. Gözlemci modelini kullanan tüm istekler arasında tek bir iş parçacğı paylaşmanın tasarımı, G/Ç gerçekleştiren herhangi bir fonksiyonun geri çağırma kullanması gereken yüksek derecede eş zamanlı uygulamalar oluşturmak için tasarlanmıştır. Tek iş parçacıklı olay döngüsünü barındırmak için Node.js libuv kütüphanesini kullanır; bu da sırayla engelleyici olmayan eş zamansız G/Ç işlemlerinden bazılarını işleyen sabit boyutlu bir iş parçacığı havuzu kullanır.

Bir iş parçacığı havuzu, Node.js’de paralel görevlerin yürütülmesini yönetiyor. Ana iş parçacığı fonksiyonu çağrıları, iş parçacığı havuzunda iş parçacığı çekip yürüten paylaşılan görev sırasına görevler gönderir. Doğası gereği bloklanmayan sistem fonksiyonları; ağ oluşturma gibi çekirdek tarafı, blokaj yapmayan soketlere çevrilirken dosya giriş/çıkış gibi sistem fonksiyonlarını kendiliğinden bloke ederek çalışırlar. İş parçacığı havuzundaki bir iş parçacığı bir görevi tamamladığında bunun ana iş parçacığını bildirir, bu da sırayla kayıtlı geri aramayı uyandırır ve yürütür.

Bu tek iş parçacıklı yaklaşımın bir dezavantajı; Node.js’nin küme, StrongLoop Process Manager veya pm2 gibi ek bir modül kullanmadan çalıştığı makinenin CPU çekirdeği sayısını artırarak dikey ölçeklendirmeye izin vermemesidir. Ancak geliştiriciler, libuv thread havuzundaki varsayılan thread sayısını artırabilir. Sunucu işletim sisteminin (OS [operating system]) bu iş parçacıklarını birden fazla çekirdeğe dağıtacağı muhtemeldir. Diğer bir problem; uzun ömürlü hesaplamalar ve diğer CPU bağlı görevlerin tamamlanana kadar tüm olay döngüsünü dondurmasıdır.

V8

V8, başlangıçta Google Chrome için oluşturulmuş JavaScript yürütme motorudur. Daha sonra 2008’de Google tarafından açık kaynak olarak yayımlanmıştır. C++ ile yazılmış V8, JavaScript kaynak kodunu çalışma zamanı sırasında önceden (AOT [ahead of time]) yorumlamak yerine yerel makine koduna derler.

Node.js, zaman uyumsuz olayları işlemek için libuv kullanır. Libuv hem Windows hem de POSIX tabanlı sistemlerde Linux, macOS, NonStop’ta OSS ve Unix gibi ağ ve dosya sistemi fonksiyonelliği için bir soyutlama katmanıdır.

Node.js’nin temel fonksiyonelliği bir JavaScript kütüphanesinde bulunur. C++ ile yazılmış Node.js bağlantıları; bu teknolojileri birbirine ve işletim sistemine bağlar.

Paket Yönetimi

npm, Node.js sunucu platformu için önceden yüklenmiş paket yöneticisidir. Node.js programlarını npm kayıt defterinden yükleyerek üçüncü taraf Node.js programlarının kurulumunu ve yönetimini düzenler. Npm kayıt defterindeki paketler Lodash gibi basit yardımcı kütüphanelerden Grunt gibi görev koşucularına kadar çeşitlilik gösterir.

Birleşik API

Node.js bir tarayıcı, JSON verilerini (Postgres, MongoDB veya CouchDB gibi) destekleyen bir veri tabanı ve birleşik bir JavaScript geliştirme yığını için JSON ile birleştirilebilir. MVC, MVP, MVVM vb. gibi esas olarak sunucu tarafı geliştirme modellerinin uyarlanmasıyla Node.js; aynı model ve hizmet arayüzünün istemci tarafı ile sunucu tarafı arasında yeniden kullanılmasına izin verir.

Olay Döngüsü

Node.js işletim sistemine kayıt olur, böylece işletim sistemi bağlantılarını bildirir ve geri çağrı yapar. Node.js çalışma zamanında her bağlantı küçük bir yığın ayırmasıdır. Geleneksel olarak nispeten ağır işletim sistemleri veya her bağlantıyı işleyen iş parçacıkları. Node.js, işlemler veya iş parçacıkları yerine ölçeklenebilirlik için bir olay döngüsü kullanır. Diğer olaya dayalı sunucuların aksine Node.js’nin olay döngüsünün açıkça çağrılması gerekmez. Bunun yerine geri çağrılar tanımlanır ve sunucu, geri çağrı tanımının sonunda olay döngüsüne otomatik olarak girer. Node.js, daha sonra yapılacak geri çağrı olmadığında olay döngüsünden çıkar.

Proje Yönetimi

2015 yılında Node.js topluluğunun çeşitli şubeleri, satıcı tarafsız Node.js Foundation altında çalışmaya başladı. Kuruluşun belirtilen amacı “yaygın benimsemeyi sağlamak ve Node.js’nin başarısına yatırım yapılan bir ekosistemin katılımını, teknik katkısını ve uzun vadeli bir yönetim için bir yazılım iskeleti teşvik eden açık bir yönetişim modeli ile Node.js ve diğer ilgili modüllerin geliştirilmesini hızlandırmaya yardımcı olmaktır”.

Node.js Foundation Technical Steering Committee (TSC), Node.js Foundation’un teknik yönetim organıdır. TSC; bağımlı Node.js deposunun yanı sıra bağımlı ve bitişik projelerden de sorumludur. Genel olarak TSC bu projelerin yönetimini çalışma gruplarına veya komitelere devreder. Uzun dönem destekli sürümleri yöneten LTS grubu böyle bir gruptur. Diğer güncel gruplar arasında Website, Streams, Build, Diagnostics, i18n, Evangelism, Docker, Addon API, Benchmarking, Post-mortem, Intl, Documentation ve Testing yer almaktadır.

Ayrıca Bakınız

Free and open-source software portal

References

  • This work, “Çalışma Zamanı Ortamı Node.js Nedir?”, is a derivative of “Node.js” by Wikiwand, used under CC BY-SA. “Çalışma Zamanı Ortamı Node.js Nedir?” is licensed under CC BY-SA by The FLOSS Information.