Node.js nedir? JavaScript çalışma zamanı açıkladı

Ölçeklenebilirlik, gecikme ve verim, web sunucuları için temel performans göstergeleridir. Ölçeklendirmeyi artırırken gecikmeyi düşük ve verimi yüksek tutmak kolay değildir. Node.js, hizmet isteklerine "engellemesiz" bir yaklaşım benimseyerek düşük gecikme ve yüksek işleme hızına ulaşan bir JavaScript çalışma zamanı ortamıdır. Başka bir deyişle, Node.js, G / Ç isteklerinin geri dönmesini beklerken zaman veya kaynak israf etmez.

Her gelen istek veya bağlantı sunucusu için, web sunucuları oluşturma geleneksel yaklaşımda yumurtlar yeni yürütme iş parçacığı bile ya çatallar yeni süreç isteğini işleyebilir ve yanıt göndermek için. Kavramsal olarak, bu çok mantıklıdır, ancak pratikte çok fazla ek yük getirir.

Yumurtlama sırasında ipler gerçekleştikçe daha az bellek çatallamak daha CPU yükü süreçleri , hala verimsiz olabilir. Çok sayıda iş parçacığının varlığı, çok yüklü bir sistemin iş parçacığı zamanlaması ve bağlam anahtarlama için değerli döngüleri harcamasına neden olabilir, bu da gecikme süresi ekler ve ölçeklenebilirlik ve verim üzerinde sınırlar getirir.

Node.js farklı bir yaklaşım benimser. Bağlantıları işlemek için sisteme kayıtlı tek iş parçacıklı bir olay döngüsü çalıştırır ve her yeni bağlantı bir JavaScript geri arama işlevinin çalışmasına neden olur . Geri çağırma işlevi, engellemeyen G / Ç çağrılarıyla istekleri işleyebilir ve gerekirse, engelleme veya CPU yoğun işlemleri yürütmek ve CPU çekirdeklerinde yük dengelemek için bir havuzdan iş parçacıkları oluşturabilir. Düğümün geri çağırma işlevleriyle ölçeklendirmeye yaklaşımı, Apache HTTP Sunucusu, çeşitli Java uygulama sunucuları, IIS ve ASP.NET ve Ruby on Rails dahil olmak üzere iş parçacıklarıyla ölçeklenen çoğu rekabetçi mimariden daha fazla bağlantıyı işlemek için daha az bellek gerektirir.

Node.js, sunuculara ek olarak masaüstü uygulamaları için oldukça yararlıdır. Ayrıca Düğüm uygulamalarının saf JavaScript ile sınırlı olmadığını unutmayın. TypeScript ve CoffeeScript gibi JavaScript'e aktarılan herhangi bir dili kullanabilirsiniz. Node.js, Babel gibi bir ES6'dan ES5'e aktarıcıya ihtiyaç duymadan ECMAScript 2015 (ES6) sözdizimini destekleyen Google Chrome V8 JavaScript motorunu içerir.

Node'un yardımcı programlarının çoğu, npmkomuttan erişilebilen geniş paket kitaplığından gelir . Node paket yöneticisi NPM, kendi web sitesine sahip olmasına rağmen standart Node.js kurulumunun bir parçasıdır.

Bazı JavaScript geçmişi

1995 yılında, o zamanlar Netscape'in yüklenicisi olan Brendan Eich, Web tarayıcılarında çalışacak JavaScript dilini - hikayeye göre 10 günde - yarattı. JavaScript, başlangıçta tarayıcı belge nesne modelinin (DOM) animasyonlarını ve diğer işlemlerini etkinleştirmeyi amaçlıyordu. Kısa süre sonra Netscape Enterprise Server için bir JavaScript sürümü piyasaya sürüldü.

JavaScript adı, o zamanlar Sun'ın Java dilinin çok fazla abartıldığı için pazarlama amacıyla seçildi. Aslında, JavaScript dili, yüzeysel Java benzeri anlambilimle esas olarak Şema ve Öz dillerine dayanıyordu.

Başlangıçta, birçok programcı JavaScript'i "gerçek iş" için işe yaramaz olarak görmezden geldi çünkü yorumlayıcısı derlenmiş dillerden çok daha yavaş bir sıra çalıştırdı. JavaScript'i daha hızlı hale getirmeyi amaçlayan çeşitli araştırma çabaları meyve vermeye başladıkça bu durum değişti. En önemlisi, tam zamanında derleme, satır içi ve dinamik kod optimizasyonu yapan açık kaynaklı Google Chrome V8 JavaScript motoru, aslında bazı yükler için C ++ kodundan daha iyi performans gösterebilir ve çoğu kullanım durumunda Python'dan daha iyi performans gösterir.

JavaScript tabanlı Node.js platformu, 2009 yılında Ryan Dahl tarafından Linux ve MacOS için Apache HTTP Sunucusuna daha ölçeklenebilir bir alternatif olarak tanıtıldı. Isaac Schlueter tarafından yazılan NPM, 2010'da piyasaya sürüldü. Node.js'nin yerel bir Windows sürümü 2011'de piyasaya çıktı.

Joyent, Node.js geliştirme çabalarına yıllarca sahip oldu, onu yönetti ve destekledi. 2015 yılında, Node.js projesi Node.js Vakfı'na devredildi ve vakfın teknik yönlendirme komitesi tarafından yönetildi. Node.js ayrıca bir Linux Foundation Collaborative Project olarak benimsendi. 2019'da Node.js Vakfı ve JS Vakfı, OpenJS Vakfı'nı oluşturmak için birleşti.

Temel Node.js mimarisi

Node.js üst düzeyde, Google V8 JavaScript motorunu, tek iş parçacıklı, engellemeyen bir olay döngüsünü ve düşük düzeyli bir G / Ç API'sini birleştirir. Aşağıda gösterilen sadeleştirilmiş örnek kod =>, geri aramalar için ES6 ok işlevlerini (şişman ok operatörü kullanılarak bildirilen anonim Lambda işlevleri) kullanarak temel HTTP sunucu modelini gösterir .

Kodun başlangıcı HTTP modülünü yükler, sunucu hostnamedeğişkenini localhost(127.0.0.1) olarak ayarlar ve portdeğişkeni 3000 olarak ayarlar. Daha sonra bir sunucu ve bir geri arama işlevi oluşturur, bu durumda her zaman aynı şeyi döndüren kalın bir ok işlevi herhangi bir isteğe yanıt: statusCode200 (başarılı), içerik türü düz metin ve bir metin yanıtı ”Hello World\n”. Son olarak, sunucuya localhost3000 numaralı bağlantı noktasını (bir soket aracılığıyla) dinlemesini söyler ve sunucu dinlemeye başladığında konsolda bir günlük mesajı yazdırmak için bir geri arama tanımlar. Bu kodu, nodekomutu kullanarak bir terminalde veya konsolda çalıştırırsanız ve ardından aynı makinedeki herhangi bir Web tarayıcısını kullanarak localhost: 3000'e göz atarsanız, tarayıcınızda "Merhaba Dünya" görürsünüz. Sunucuyu durdurmak için terminal penceresinde Control-C tuşlarına basın.

Bu örnekte yapılan her çağrının eşzamansız olduğunu ve engellemediğini unutmayın. Geri çağırma işlevleri olaylara yanıt olarak çağrılır. Geri createServerarama, bir istemci isteği olayını işler ve bir yanıt döndürür. Geri listenarama, listeningolayı işler .

Node.js kitaplığı

Aşağıdaki şekilde sol tarafta görebileceğiniz gibi, Node.js kitaplığında geniş bir işlevsellik yelpazesine sahiptir. Daha önce örnek kodda kullandığımız HTTP modülü, şeklin sağ tarafında da görebileceğiniz gibi hem istemci hem de sunucu sınıflarını içerir. TLS veya SSL kullanan HTTPS sunucusu işlevselliği ayrı bir modülde yaşar.

Tek iş parçacıklı bir olay döngüsünün doğasında olan bir sorun, olay döngüsü iş parçacığı yalnızca tek bir CPU çekirdeği kullanacağı için dikey ölçeklemenin olmamasıdır. Bu arada, modern CPU yongaları genellikle sekiz veya daha fazla çekirdeği açığa çıkarır ve modern sunucu raflarında genellikle birden fazla CPU yongası bulunur. Tek iş parçacıklı bir uygulama, sağlam bir sunucu rafındaki 24'ün üzerinde çekirdekten tam olarak yararlanmayacaktır.

Bazı ek programlama gerektirse de bunu düzeltebilirsiniz. Başlangıç ​​olarak, Node.js alt süreçleri ortaya çıkarabilir ve sistem popen(3)çağrısının çalışma şekline benzer şekilde child_process.spawn() ve ilgili yöntemleri kullanarak üst ve alt süreçler arasında kanallar sağlayabilir .

Küme modülü, ölçeklenebilir sunucular oluşturmak için çocuk süreç modülünden bile daha ilginçtir. cluster.fork()Kullanarak, ebeveynin sunucu bağlantı noktalarını paylaşmak yöntem yumurtlar işçi süreçleri child_process.spawn()kapsar altında. Küme yöneticisi, varsayılan olarak çalışan işlem yüklerine duyarlı bir döngüsel algoritma kullanarak gelen bağlantıları çalışanları arasında dağıtır.

Node.js'nin yönlendirme mantığı sağlamadığını unutmayın. Durumu bir kümedeki bağlantılar arasında korumak istiyorsanız, oturum ve oturum açma nesnelerinizi çalışan RAM'i dışında bir yerde tutmanız gerekir.

Node.js paket ekosistemi

NPM kayıt defteri, 1,2 milyondan fazla ücretsiz, yeniden kullanılabilir Node.js kodu paketini barındırır ve bu da onu dünyadaki en büyük yazılım kayıt defteri yapar. NPM paketlerinin çoğunun (esasen bir package.json dosyasıyla tanımlanan bir programı içeren klasörler veya NPM kayıt defteri öğelerinin) birden çok modül ( requiredeyimlerle yüklediğiniz programlar ) içerdiğini unutmayın . İki terimi karıştırmak kolaydır, ancak bu bağlamda belirli anlamları vardır ve değiştirilmemeleri gerekir.

NPM, belirli bir projenin yerel bağımlılıkları olan paketleri ve aynı zamanda küresel olarak yüklenmiş JavaScript araçlarını yönetebilir. Yerel bir proje için bağımlılık yöneticisi olarak kullanıldığında, NPM bir projenin tüm bağımlılıklarını package.json dosyası aracılığıyla tek bir komutla kurabilir. Global kurulumlar için kullanıldığında, NPM genellikle sistem (sudo) ayrıcalıkları gerektirir.

Sen yok olması kamu NPM kayıt erişmek için NPM komut satırını kullanmak. Facebook'un Yarn gibi diğer paket yöneticileri, alternatif müşteri tarafı deneyimleri sunar. Ayrıca NPM web sitesini kullanarak paketleri arayabilir ve tarayabilirsiniz.

Neden bir NPM paketi kullanmak istersiniz? Çoğu durumda, NPM komut satırı aracılığıyla bir paket kurmak, ortamınızda çalışan bir modülün en son kararlı sürümünü elde etmek için en hızlı ve en uygun yoldur ve genellikle kaynak havuzunu klonlamaktan ve depodan bir kurulum oluşturmaktan daha az iş gerektirir. En son sürümü istemiyorsanız, NPM'ye bir sürüm numarası belirtebilirsiniz, bu özellikle bir paket başka bir pakete bağlı olduğunda ve bağımlılığın daha yeni bir sürümüyle bozulabilirse yararlıdır.

Örneğin, minimal ve esnek bir Node.js web uygulaması çerçevesi olan Express çerçevesi, tek ve çok sayfalı ve karma web uygulamaları oluşturmak için güçlü bir özellikler kümesi sağlar. Kolayca klonlanabilir Expresscode deposu //github.com/expressjs/express adresinde ve Express dokümantasyonu //expressjs.com/ adresinde bulunurken, Express'i kullanmaya başlamanın hızlı bir yolu, onu önceden başlatılmış bir yerel çalışma geliştirmeye yüklemektir. npmkomut içeren dizin , örneğin:

$ npm hızlı yükle — kaydet

—saveNPM 5.0 ve sonraki varsayılan olarak aslında seçeneği, kurulumdan sonra package.json dosyasında bağımlılıklar listesine Express modülü eklemek için paket yöneticisini söyler.

Bir başka hızlı bir yolu yürütülebilir yüklemeye Express kullanmaya başlamak için jeneratörexpress(1) global ve sonra yeni bir çalışma klasörde yerel uygulama oluşturmak için kullanabilirsiniz:

$ npm install -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

Bu başarıldığında, gerekli tüm bağımlılıkları kurmak için NPM'yi kullanabilir ve oluşturucu tarafından oluşturulan package.json dosyasının içeriğine bağlı olarak sunucuyu başlatabilirsiniz:

$ npm yükleme

$ npm başlangıç

NPM'deki milyondan fazla paketten öne çıkan noktaları seçmek zor, ancak birkaç kategori öne çıkıyor. Express, Node.js çerçevelerinin en eski ve en belirgin örneğidir. NPM deposundaki diğer bir büyük kategori, bir modül paketleyicisi olan browsererify dahil JavaScript geliştirme araçlarıdır; tarayıcı paket yöneticisi bower; grunt, JavaScript görev koşucusu; ve yutkunma, akış oluşturma sistemi. Son olarak, kurumsal Node.js geliştiricileri için önemli bir kategori, redis, mongoose, firebase ve pg, PostgreSQL istemcisi gibi popüler modüller dahil olmak üzere 8.000'den fazla bulunan veritabanı istemcileridir.

Özetlemek gerekirse, Node.js, sunucular ve uygulamalar için platformlar arası bir JavaScript çalışma zamanı ortamıdır. Tek iş parçacıklı, engellemeyen bir olay döngüsü, Google Chrome V8 JavaScript motoru ve düşük seviyeli bir G / Ç API'si üzerine kurulmuştur. Küme modülü dahil olmak üzere çeşitli teknikler, Node.js uygulamalarının tek bir CPU çekirdeğinin ötesine ölçeklenmesini sağlar. Node.js, temel işlevinin ötesinde, NPM havuzunda kayıtlı ve sürümleri olan ve NPM komut satırı veya Yarn gibi bir alternatif kullanılarak kurulabilen bir milyondan fazla paketten oluşan bir ekosisteme ilham verdi.