Node.js

bilgipedi.com.tr sitesinden
Node.js
Node.js logo.svg
Orijinal yazar(lar)Ryan Dahl
Geliştirici(ler)OpenJS Vakfı
İlk sürüm27 Mayıs 2009; 13 yıl önce
İçinde yazılıC, C++, JavaScript
İşletim sistemiz/OS, Linux, macOS, Microsoft Windows, SmartOS, FreeBSD, OpenBSD, IBM AIX
TipÇalışma zamanı ortamı
LisansMIT Lisansı

Node.js, ölçeklenebilir ağ uygulamaları oluşturmak için tasarlanmış, V8 motoru üzerinde çalışan ve JavaScript kodunu bir web tarayıcısının dışında yürüten açık kaynaklı, platformlar arası, arka uç JavaScript çalışma zamanı ortamıdır. Node.js, geliştiricilerin JavaScript'i komut satırı araçları yazmak ve sunucu tarafında komut dosyası çalıştırmak için kullanmasına olanak tanır - sayfa kullanıcının web tarayıcısına gönderilmeden önce dinamik web sayfası içeriği üretmek için sunucu tarafında komut dosyaları çalıştırır. Sonuç olarak Node.js, sunucu tarafı ve istemci tarafı komut dosyaları için farklı diller yerine web uygulaması geliştirmeyi tek bir programlama dili etrafında birleştiren bir "her yerde JavaScript" paradigmasını temsil eder.

Node.js, eşzamansız I/O yapabilen olay güdümlü bir mimariye sahiptir. Bu tasarım tercihleri, çok sayıda giriş/çıkış işlemi içeren web uygulamalarının yanı sıra gerçek zamanlı Web uygulamaları (örneğin, gerçek zamanlı iletişim programları ve tarayıcı oyunları) için verim ve ölçeklenebilirliği optimize etmeyi amaçlamaktadır.

Node.js dağıtık geliştirme projesi daha önce Node.js Vakfı tarafından yönetiliyordu ve şimdi JS Vakfı ile birleşerek Linux Vakfı'nın İşbirlikçi Projeler programı tarafından kolaylaştırılan OpenJS Vakfı'nı oluşturdu.

Node.js yazılımının kurumsal kullanıcıları arasında GoDaddy, Groupon, IBM, LinkedIn, Microsoft, Netflix, PayPal, Rakuten, SAP, Walmart, Yahoo! ve Amazon Web Services bulunmaktadır.

Node.js, Google V8 JavaScript motorunu kullanarak betik dilini yorumlar ve içerisinde standart olarak dağıtılan kütüphaneler sayesinde ek bir sunucu yazılımına (Apache HTTP Sunucusu, Nginx, IIS vs.) gerek kalmadan uygulamanın Web sunucusu görevini görür.

Tarihçe

Ryan Dahl, Node.js'nin yaratıcısı, 2010 yılında

Node.js ilk olarak Ryan Dahl tarafından 2009 yılında, ilk sunucu tarafı JavaScript ortamı olan Netscape'in LiveWire Pro Web'inin piyasaya sürülmesinden yaklaşık on üç yıl sonra yazılmıştır. İlk sürüm sadece Linux ve Mac OS X'i destekliyordu. Geliştirilmesi ve bakımı Dahl tarafından yürütüldü ve daha sonra Joyent tarafından desteklendi.

Dahl, 2009 yılında en popüler web sunucusu olan Apache HTTP Server'ın çok sayıda eşzamanlı bağlantıyı (10.000 ve daha fazla) idare etme konusundaki sınırlı olanaklarını ve kod oluşturmanın en yaygın yolunu (sıralı programlama) eleştirdi; kod ya tüm süreci engelledi ya da eşzamanlı bağlantılar durumunda birden fazla yürütme yığını anlamına geldi.

Dahl projeyi 8 Kasım 2009'da Avrupa JSConf'unun açılışında tanıttı. Node.js, Google'ın V8 JavaScript motorunu, bir olay döngüsünü ve düşük seviyeli bir I/O API'sini birleştirdi.

Ocak 2010'da Node.js ortamı için npm adı verilen bir paket yöneticisi tanıtıldı. Paket yöneticisi, programcıların Node.js paketlerinin kaynak kodunu yayınlamasını ve paylaşmasını kolaylaştırır ve paketlerin kurulumunu, güncellenmesini ve kaldırılmasını basitleştirmek için tasarlanmıştır.

Haziran 2011'de Microsoft ve Joyent, Node.js'in yerel bir Windows sürümünü hayata geçirdi. Windows'u destekleyen ilk Node.js yapısı Temmuz 2011'de yayınlandı.

Ocak 2012'de Dahl kenara çekildi ve iş arkadaşı ve npm yaratıcısı Isaac Schlueter'i projeyi yönetmesi için terfi ettirdi. Ocak 2014'te Schlueter, Timothy J. Fontaine'in projeye liderlik edeceğini açıkladı.

Aralık 2014'te Fedor Indutny, Node.js'nin bir çatalı olan io.js'yi başlattı. Joyent'in yönetişimi konusundaki iç çatışma nedeniyle, io.js ayrı bir teknik komite ile açık bir yönetişim alternatifi olarak oluşturuldu. Node.js'nin aksine, yazarlar io.js'yi Google V8 JavaScript motorunun en son sürümleriyle güncel tutmayı planladılar.

Şubat 2015'te, tarafsız bir Node.js Vakfı oluşturma niyeti duyuruldu. Haziran 2015'te Node.js ve io.js toplulukları Node.js Vakfı altında birlikte çalışmak için oy kullandı.

Eylül 2015'te Node.js v0.12 ve io.js v3.3, Node v4.0 olarak tekrar birleştirildi. Bu birleştirme, V8 ES6 özelliklerini Node.js'ye ve uzun vadeli bir destek sürüm döngüsüne getirdi. 2016 itibariyle, io.js web sitesi geliştiricilerin Node.js'ye geri dönmelerini ve birleştirme nedeniyle io.js'nin başka sürümlerinin planlanmamasını önermektedir.

Şubat 2016'da Node.js 0.10.42 yayınlandı ve Mayıs 2022'de Node.js sürümü Node.js 18.2.0 da yayınlandı.

2019 yılında JS Foundation ve Node.js Foundation birleşerek OpenJS Foundation'ı oluşturdu.

2018 yılında Node.js'in geliştiricisi Ryan Dahl tarafından geliştirilmeye başlanmış. Node.js'ın aksine Javascript'in süperseti olan Typescript ile geliştirilmektedir. Ryan Dahl bir konuşmasında Node.js'i geliştirirken yaptığı hataları tekrarlamak istemediğini belirtmiştir.


Genel bakış

Node.js, JavaScript ve çeşitli temel işlevleri ele alan bir "modüller" koleksiyonu kullanarak Web sunucuları ve ağ araçları oluşturulmasına olanak tanır. Modüller dosya sistemi I/O, ağ (DNS, HTTP, TCP, TLS/SSL veya UDP), ikili veri (tamponlar), kriptografi fonksiyonları, veri akışları ve diğer temel fonksiyonlar için sağlanmıştır. Node.js'nin modülleri, sunucu uygulamaları yazmanın karmaşıklığını azaltmak için tasarlanmış bir API kullanır.

JavaScript, Node.js'nin yerel olarak desteklediği tek dildir, ancak JS'ye derlenebilen birçok dil mevcuttur. Sonuç olarak, Node.js uygulamaları CoffeeScript, Dart, TypeScript, ClojureScript ve diğer dillerde yazılabilir.

Node.js öncelikle Web sunucuları gibi ağ programları oluşturmak için kullanılır. Node.js ve PHP arasındaki en önemli fark, PHP'deki çoğu işlevin tamamlanana kadar bloklanması (komutlar yalnızca önceki komutlar bittikten sonra yürütülür), Node.js işlevlerinin ise bloklanmamasıdır (komutlar eşzamanlı ve hatta paralel olarak yürütülür ve tamamlanma veya başarısızlık sinyali vermek için geri aramalar kullanır).

Node.js resmi olarak Linux, macOS ve Microsoft Windows 8.1 ve Server 2012 (ve sonrası) üzerinde desteklenmekte olup SmartOS ve IBM AIX için 2. kademe desteği ve FreeBSD için deneysel destek bulunmaktadır. OpenBSD de çalışır ve IBM i (AS/400) için LTS sürümleri mevcuttur. Sağlanan kaynak kodu, resmi olarak desteklenenlere benzer işletim sistemleri üzerinde de oluşturulabilir veya NonStop OS ve Unix sunucuları gibi diğerlerini desteklemek için üçüncü taraflarca değiştirilebilir.

Platform mimarisi

Node.js, web sunucularına olay güdümlü programlamayı getirerek JavaScript'te hızlı web sunucularının geliştirilmesini sağlar. Geliştiriciler, bir görevin tamamlandığını bildirmek için geri aramaları kullanan basitleştirilmiş bir olay güdümlü programlama modeli kullanarak iş parçacığı kullanmadan ölçeklenebilir sunucular oluşturabilirler. Node.js, bir komut dosyası dilinin (JavaScript) kolaylığı ile Unix ağ programlamanın gücünü birleştirir.

Node.js, BSD lisansı altında açık kaynaklı olduğu için Google'ın V8 JavaScript motorunun üzerine inşa edilmiştir. HTTP, DNS ve TCP gibi internet temelleri konusunda uzmandır. JavaScript de iyi bilinen bir dil olduğundan Node.js web geliştirme topluluğu için erişilebilir hale gelmiştir.

Endüstri desteği

Node.js için binlerce açık kaynak kütüphanesi bulunmaktadır ve bunların çoğu npm web sitesinde barındırılmaktadır. Node.js topluluğunu destekleyen NodeConf, Node Interactive ve Node Summit'in yanı sıra bir dizi bölgesel etkinlik de dahil olmak üzere çok sayıda geliştirici konferansı ve etkinliği vardır.

Açık kaynak topluluğu, uygulamaların geliştirilmesini hızlandırmak için web çerçeveleri geliştirmiştir. Bu çerçeveler arasında Connect, Express.js, Socket.IO, Feathers.js, Koa.js, Hapi.js, Sails.js, Meteor, Derby ve diğerleri bulunmaktadır. Microsoft .NET gibi diğer diller veya çalışma zamanı ortamları ile 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 sağlar. Bu IDE'ler arasında Atom, Brackets, JetBrains WebStorm, Microsoft Visual Studio (Node.js Tools for Visual Studio veya TypeScript with Node definitions ile) NetBeans, Nodeclipse Enide Studio (Eclipse tabanlı) ve Visual Studio Code bulunmaktadır. Codeanywhere, Codenvy, Cloud9 IDE, Koding ve Node-RED'deki görsel akış editörü gibi bazı çevrimiçi web tabanlı IDE'ler de Node.js'yi desteklemektedir.

Node.js, Jelastic, Google Cloud Platform, AWS Elastic Beanstalk, Joyent ve diğerleri gibi bir dizi bulut barındırma platformunda desteklenmektedir.

Bültenler

Serbest Bırak Durum Kod adı Çıkış tarihi Bakım sonu
0.10.x Yaşam Sonu 2013-03-11 2016-10-31
0.12.x Yaşam Sonu 2015-02-06 2016-12-31
4.x Yaşam Sonu Argon 2015-09-08 2018-04-30
5.x Yaşam Sonu 2015-10-29 2016-06-30
6.x Yaşam Sonu Boron 2016-04-26 2019-04-30
7.x Yaşam Sonu 2016-10-25 2017-06-30
8.x Yaşam Sonu Karbon 2017-05-30 2019-12-31
9.x Yaşam Sonu 2017-10-01 2018-06-30
10.x Yaşam Sonu Dubnium 2018-04-24 2021-04-30
11.x Yaşam Sonu 2018-10-23 2019-06-01
12.x Yaşam Sonu Erbiyum 2019-04-23 2022-04-30
13.x Yaşam Sonu 2019-10-22 2020-06-01
14.x Bakım LTS Fermiyum 2020-04-21 2023-04-30
15.x Yaşam Sonu 2020-10-20 2021-06-01
16.x Aktif LTS Galyum 2021-04-20 2023-09-11
17.x Yaşam Sonu 2021-10-19 2022-06-01
18.x Güncel 2022-04-19 2025-04-30
19.x Planlanan 2022-10-18 2023-06-01
20.x Planlanan 2023-04-18 2026-04-30
Efsane:
Eski sürüm
Eski sürüm, hala korunuyor
En son sürüm
Gelecek sürüm

Node.js'in yeni ana sürümleri her altı ayda bir GitHub ana dalından kesilir. Çift numaralı sürümler Nisan ayında, tek numaralı sürümler ise Ekim ayında kesilir. Yeni bir tek sürüm yayınlandığında, önceki çift sürüm Uzun Süreli Desteğe (LTS) geçiş yapar ve bu sürüm LTS olarak belirlendiği tarihten itibaren 18 ay aktif destek sağlar. Bu 18 ay sona erdikten sonra, bir LTS sürümü 12 aylık ek bir bakım desteği alır. Aktif bir sürüm, mevcut sürümde yer aldıktan birkaç hafta sonra değişikliklerin kırıcı olmayan backport'larını alır. Bir bakım sürümü yalnızca kritik düzeltmeleri ve belge güncellemelerini alır. LTS Çalışma Grubu, Node.js Vakfı'nın Teknik Yönlendirme Komitesi ile işbirliği içinde strateji ve politikayı yönetir.

Teknik ayrıntılar

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

Dahili

Node.js, asenkron olayları işlemek için kaputun altında libuv kullanır. Libuv, hem Windows hem de Linux, macOS, OSS on NonStop ve Unix gibi POSIX tabanlı sistemlerde ağ ve dosya sistemi işlevselliği için bir soyutlama katmanıdır.

İş parçacığı

Node.js, tek iş parçacıklı bir olay döngüsü üzerinde çalışır ve bloklamayan G/Ç çağrıları kullanarak iş parçacığı bağlamı değiştirme maliyetine katlanmadan on binlerce eş zamanlı bağlantıyı desteklemesine olanak tanır. Gözlemci modelini kullanan tüm istekler arasında tek bir iş parçacığını paylaşma tasarımı, G/Ç gerçekleştiren herhangi bir işlevin bir geri arama kullanması gereken yüksek eşzamanlı uygulamalar oluşturmak için tasarlanmıştır. Tek iş parçacıklı olay döngüsüne uyum sağlamak için Node.js, libuv kütüphanesini kullanır; bu kütüphane de bazı bloklamayan asenkron G/Ç işlemlerini gerçekleştiren sabit boyutlu bir iş parçacığı havuzu kullanır.

Node.js'de paralel görevlerin yürütülmesini bir iş parçacığı havuzu yönetir. Ana iş parçacığı işlev çağrısı, iş parçacığı havuzundaki iş parçacıklarının çekip yürüttüğü paylaşılan görev kuyruğuna görevler gönderir. Ağ oluşturma gibi doğası gereği bloklamayan sistem işlevleri çekirdek tarafında bloklamayan soketlere çevrilirken, dosya G/Ç gibi doğası gereği bloklayan sistem işlevleri kendi iş parçacıklarında bloklama şeklinde çalışır. İş parçacığı havuzundaki bir iş parçacığı bir görevi tamamladığında, bunu ana iş parçacığına bildirir, o da uyanır ve kayıtlı geri aramayı yürütür.

Bu tek iş parçacıklı yaklaşımın bir dezavantajı, Node.js'nin cluster, StrongLoop Process Manager veya pm2 gibi ek bir modül kullanmadan üzerinde çalıştığı makinenin CPU çekirdeği sayısını artırarak dikey ölçeklendirmeye izin vermemesidir. Ancak geliştiriciler libuv iş parçacığı havuzundaki varsayılan iş parçacığı sayısını artırabilirler. Sunucu işletim sisteminin (OS) bu iş parçacıklarını birden fazla çekirdeğe dağıtması muhtemeldir. Diğer bir sorun ise uzun süren hesaplamaların ve diğer CPU'ya 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 geliştirilmiş olan bir JavaScript yürütme motorudur. Daha sonra 2008 yılında Google tarafından açık kaynaklı hale getirilmiştir. C++ dilinde yazılan V8, JavaScript kaynak kodunu çalışma zamanında yerel makine koduna derler. 2016 itibariyle, bir bayt kodu yorumlayıcısı olan Ignition'ı da içerir.

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ükler, üçü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österebilir.

Birleşik API

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

Olay döngüsü

Node.js işletim sistemine kaydolur, böylece işletim sistemi bağlantıları bildirir ve bir geri arama yayınlar. Node.js çalışma zamanı içinde, her bağlantı küçük bir yığın tahsisidir. Geleneksel olarak, nispeten ağır işletim sistemi süreçleri veya iş parçacıkları her bağlantıyı ele alır. Node.js ölçeklenebilirlik için süreçler veya iş parçacıkları yerine bir olay döngüsü kullanır. Diğer olay güdümlü sunucuların aksine, Node.js'nin olay döngüsünün açıkça çağrılması gerekmez. Bunun yerine, geri aramalar tanımlanır ve sunucu geri arama tanımının sonunda otomatik olarak olay döngüsüne girer. Node.js, gerçekleştirilecek başka geri arama olmadığında olay döngüsünden çıkar.

WebAssembly

Node.js WebAssembly'yi destekler ve Node 14'ten itibaren WebAssembly Sistem Arayüzü olan WASI'nin deneysel desteğine sahiptir.

Yerel bağlamalar

Node.js, C/C++ ile yazılmış kaynak kodundan yüklenebilir (içe aktarılabilir) .node modülleri üretmek için kullanılabilen N-API adlı C tabanlı bir API aracılığıyla "eklentiler" oluşturmak için bir yol sağlar. Modüller doğrudan belleğe yüklenebilir ve JS ortamından basit CommonJS modülleri olarak çalıştırılabilir. N-API uygulaması, kullanıcıların Node.js'ye özgü başlıkları kendi yerel kaynak kodlarına aktarmalarını (#include) gerektiren dahili C/C++ Node.js ve V8 nesnelerine dayanır. Node.js platformu sürekli olarak geliştiğinden, API uyumluluğu değişikliklere tabidir ve bazen yeni bir sürümle bozulabilir (sonuç olarak, modüllerin doğru çalışması için belirli Node.js sürümlerine göre oluşturulması gerekir). Bu sorunu çözmek için üçüncü taraflar, API'nin üzerine sorunu kısmen hafifleten açık kaynaklı С/С++ sarmalayıcıları eklediler. Arayüzleri basitleştirirler, ancak bir yan etki olarak bakımcıların uğraşması gereken karmaşıklığı da beraberinde getirebilirler. Node.js'nin temel işlevselliği bir JavaScript yerleşik kütüphanesinde bulunsa da, C++ ile yazılmış modüller yetenekleri geliştirmek ve uygulamaların performansını artırmak için kullanılabilir.

Bu tür modülleri üretmek için uygun bir C++ derleyicisine ve gerekli başlıklara sahip olmak gerekir (ikincisi genellikle Node.js'nin kendisiyle birlikte gönderilir): gcc, clang veya MSVC++.

N-API, Java Native Interface'e benzer.

Proje yönetimi

2015 yılında, Node.js topluluğunun çeşitli kolları, satıcıdan bağımsız Node.js Vakfı altında çalışmaya başladı. Kuruluşun belirtilen amacı "Node.js'nin başarısına yatırım yapan bir ekosistem tarafından katılımı, teknik katkıyı ve uzun vadeli yönetim için bir çerçeveyi teşvik eden açık bir yönetişim modeli aracılığıyla Node.js ve diğer ilgili modüllerin yaygın olarak benimsenmesini sağlamak ve gelişimini hızlandırmaya yardımcı olmaktır."

Node.js Vakfı Teknik Yönlendirme Komitesi (TSC), Node.js Vakfı'nın teknik yönetim organıdır. TSC, çekirdek 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 vadeli desteklenen sürümleri yöneten LTS grubu böyle bir gruptur. Diğer mevcut gruplar arasında Web Sitesi, Akışlar, Derleme, Teşhis, i18n, Evangelizm, Docker, Eklenti API, Kıyaslama, Ölüm Sonrası, Uluslararası, Dokümantasyon ve Test yer almaktadır.

Ağustos 2017'de TSC üyelerinin üçte biri, projenin davranış kurallarıyla ilgili bir anlaşmazlık nedeniyle istifa etti.

Alternatifler

io.js

io.js logosu

io.js, Node.js'ten türetilmiş, yönetim şekli olarak anonim şirket tarzı bir yönetimden ziyade açık yönetimi tercih eden bir projedir. Aralık 2014'te geliştirilmeye başlanan io.js, 15 Mayıs 2015'te Node.js ile Node Foundation çatısı altında yeniden birleşme kararı almıştır.