Node.js dosyası nedir? [kapalı]


506

Node.js'nin ne hakkında olduğunu tam olarak anlamıyorum . Belki de çoğunlukla web tabanlı bir iş uygulaması geliştiricisi olduğum için. Nedir ve kullanımı nedir?

Şu ana kadarki anlayışım şudur:

  1. Programlama modeli olay yönelimli, özellikle de G / Ç işlemek için kullanılır .
  2. JavaScript kullanır ve ayrıştırıcı V8'dir .
  3. Eşzamanlı sunucu uygulamaları oluşturmak için kolayca kullanılabilir.

Anladıklarım doğru mu? Cevabınız evet ise, olayı yapan G / Ç'nin faydaları nelerdir, eşzamanlılık için daha mı fazla? Ayrıca, Node.js'nin yönü JavaScript tabanlı (V8 tabanlı) programlama modeli gibi bir çerçeve olmak mı?

Yanıtlar:


213

Bence avantajları:

  1. İnanılmaz derecede hızlı bir sanal makine üzerinde dinamik bir dilde (JavaScript) web geliştirme (V8). Ruby, Python veya Perl'den çok daha hızlıdır.

  2. Tek bir işlemde minimum ek yük ile binlerce eşzamanlı bağlantıyı işleme yeteneği.

  3. JavaScript, birinci sınıf işlev nesneleri ve kapanışları olan olay döngüleri için mükemmeldir. Kullanıcılar, kullanıcı tarafından başlatılan olaylara yanıt vermek için tarayıcıda bu şekilde nasıl kullanıldığını zaten biliyorlar.

  4. Birçok kişi zaten JavaScript biliyor, hatta programcı olduğunu iddia etmeyen insanlar bile. Muhtemelen en popüler programlama dilidir.

  5. Bir web sunucusunda ve tarayıcıda JavaScript kullanmak, denklemin her iki tarafında da aynı şekilde çalışan JSON aracılığıyla veri yapılarını iletebilen iki programlama ortamı arasındaki empedans uyumsuzluğunu azaltır. Yinelenen form doğrulama kodu, sunucu ve istemci vb. Arasında paylaşılabilir.


1
@postfuturist: Aslında birçok alternatife karşı iyi bir performans sergiliyor. Java 6'yı birçok durumda da oldukça kullanışlı bir şekilde atıyor. Temiz!
Adam Crossland

1
@postfuturist Sanırım java 6 -Xint ile karşılaştırdınız. Java 6-server ile karşılaştırmayı deneyin
fedesilva

@iJK yammer.com node.js'nin çalışan bir uygulamasıdır
Gerard Banasig

1
Komik, 10 yıl önce ASP'de JScript yazıyordum, bu yüzden (a) VBScript'in berbatlığından kaçınabilirim, (b) istemci ve sunucuda aynı dili kullanabilir ve (c) kendi ve diğerlerinin JS kütüphanelerini tekrar kullanabilirim tel işleme için ... vb.
Antony Quinn

4
@Neden bu yayını yalnızca "Legacy bullshit" için düzenlediniz? Başından beri yazarsanız 212 kişinin bu gönderiye oy vereceğini sanmıyorum.
Julien Fouilhé

619

Node.js'yi işte kullanıyorum ve çok güçlü buluyorum. Node.js'yi tanımlamak için bir kelime seçmek zorunda kaldım, "ilginç" (tamamen pozitif bir sıfat değil) derim. Topluluk canlı ve büyüyor. JavaScript, tuhaflıklarına rağmen kodlamak için harika bir dil olabilir. Ve günlük olarak "en iyi uygulama" ve iyi yapılandırılmış kod kalıpları hakkındaki kendi anlayışınızı yeniden düşüneceksiniz. Şu anda Node.js'ye akan muazzam bir fikir enerjisi var ve içinde çalışmak sizi tüm bu düşünceye maruz bırakıyor - harika zihinsel halter.

Üretimde Node.js kesinlikle mümkündür, ancak dokümantasyon tarafından vaat edilen "anahtar teslim" dağıtımdan çok uzaktır. Node.js v0.6.x ile, "küme" platforma entegre edildi ve temel yapı taşlarından birini sağladı, ancak benim "production.js" betiğim günlük oluşturmak gibi şeyleri işlemek için hala ~ 150 satır mantık "ciddi" bir üretim hizmeti için, gelen bağlantıları daraltmaya ve Apache'nin PHP için yaptığı her şeyi yapmaya hazır olmanız gerekir . Adil olmak gerekirse, Ruby on Rails'in tam olarak bu sorunu var. İki tamamlayıcı mekanizma ile çözülür: 1) Ruby'yi Raylara / Düğüme Koymak.Apache / Lighttd ). Web sunucusu, statik içeriği etkin bir şekilde sunabilir, giriş günlüğüne erişebilir, URL'leri yeniden yazabilir, SSL'yi sonlandırabilir , erişim kurallarını uygulayabilir ve birden çok alt hizmeti yönetebilir. Gerçek düğüm hizmetine isabet eden istekler için, web sunucusu isteği üzerinden vekalet eder. 2) Alt süreçleri yönetecek, periyodik olarak geri dönüştürecek vb. Unicorn gibi bir çerçeve kullanarak . Tamamen pişmiş gibi görünen bir Node.js hizmet çerçevesi henüz bulamadım; var olabilir, ancak henüz bulamadım ve hala el yapımı "production.js" de ~ 150 satır kullanıyorum.

Express gibi çerçevelerin okunması , standart uygulamanın, her şeye sadece bir esnaf Node.js hizmeti aracılığıyla hizmet etmektir ... "app.use (express.static (__ dirname + '/ public'))" . Düşük yük hizmetleri ve geliştirme için, bu muhtemelen iyidir. Ancak, hizmetinize büyük zaman yükü koymaya ve 7/24 çalıştırmaya başlar başlamaz, büyük siteleri, Nginx gibi iyi pişmiş, sertleştirilmiş C kodunu sitelerini önleyen ve tümüyle ele almaya iten motivasyonları hızla keşfedeceksiniz. statik içerik istekleri (... Amazon CloudFront gibi bir CDN ayarlayana kadar ). Bunu biraz esprili ve alçakça olumsuz bir şekilde ele almak için bu adama bakın .

Node.js ayrıca daha fazla hizmet dışı kullanım buluyor. Web içeriği sunmak için başka bir şey kullanıyor olsanız bile , kodunuzu düzenlemek için npm modülleri, tek bir öğeye bağlamak için Browserify ve dağıtım için küçültmek için uglify-js kullanarak, Node.js'yi bir oluşturma aracı olarak kullanabilirsiniz. . Web ile uğraşmak için JavaScript mükemmel bir empedans eşleşmesidir ve sıklıkla onu en kolay saldırı yolu haline getirir. Örneğin, bir grup JSON yanıt yükü ile uğraşmak istiyorsanız , yapılandırılmış verilerin yardımcı kemeri olan alt çizgi CLI modülümü kullanmalısınız .

Artılar ve eksiler:

  • Pro: Bir sunucu için, arka uçta JavaScript yazmak, modern UI kalıplarını öğrenmek için bir "ağ geçidi ilacı" olmuştur. Artık istemci kodu yazmaktan korkmuyorum.
  • Pro: Uygun hata kontrolünü teşvik etme eğilimindedir (err, neredeyse tüm geri aramalar tarafından geri döndürülür, programcıyı işlemesi için yönlendirir; Ayrıca, async.js ve diğer kütüphaneler "bu alt görevlerden herhangi biri başarısız olursa başarısız olur" paradigmasını tipik senkron koddan çok daha iyi işler )
  • Profesyonel: Bazı ilginç ve normalde zor görevler önemsiz hale gelir - uçuştaki görevlerde statü almak, çalışanlar arasında iletişim kurmak veya önbellek durumunu paylaşmak gibi
  • Profesyonel: Büyük bir topluluk ve sağlam bir paket yöneticisine (npm) dayanan tonlarca harika kütüphane
  • Con: JavaScript'in standart bir kütüphanesi yoktur. JSON.parse veya bir npm modülü eklemeyi gerektirmeyen başka bir yerleşik yöntem kullandığınızda garip hissettiren işlevselliği içe aktarmaya alışırsınız. Bu, her şeyin beş sürümü olduğu anlamına gelir. Varsayılan uygulamadan memnun kalmamanız durumunda, Node.js "core" içerisindeki modüllerin bile beş çeşidi daha vardır. Bu hızlı evrime yol açıyor, aynı zamanda bir miktar karışıklığa da yol açıyor.

Basit bir istek başına tek işlem modeline ( LAMP ) karşı:

  • Pro: Binlerce etkin bağlantıya ölçeklenebilir. Çok hızlı ve çok verimli. Bir web filosu için, PHP veya Ruby'ye göre gerekli kutu sayısında 10 kat azalma anlamına gelebilir
  • Pro: Paralel kalıplar yazmak kolaydır. Memcached'dan üç (veya N) damla almanız gerektiğini düşünün . PHP bunu yapmak ... sadece ilk blob, sonra ikinci, sonra üçüncü getirilir kod yazdınız mı? Vay canına, bu yavaş. Memcached için bu özel sorunu gidermek için özel bir PECL modülü var, ancak veritabanı sorgunuza paralel olarak bazı Memcached verilerini almak istiyorsanız? Node.js'de paradigma eşzamansız olduğundan, bir web isteğinin paralel olarak birden çok şey yapması çok doğaldır.
  • Con: Eşzamansız kod temelde eşzamanlı koddan daha karmaşıktır ve ön öğrenme eğrisi, eşzamanlı yürütmenin gerçekte ne anlama geldiğine dair sağlam bir anlayışa sahip olmadan geliştiriciler için zor olabilir. Yine de, kilitli her türlü çok iş parçacıklı kod yazmaktan çok daha az zor.
  • Con: Yoğun bilgi gerektiren bir istek örneğin 100 msn için çalışırsa, aynı Node.js işleminde işlenen diğer isteklerin işlenmesini durduracaktır ... AKA, kooperatif-çoklu görev . Bu, Web Çalışanları kalıbı ile azaltılabilir (pahalı görevlerle başa çıkmak için bir alt süreci döndürmek). Alternatif olarak, çok sayıda Node.js çalışanı kullanabilir ve her birinin aynı anda tek bir isteği işlemesine izin verebilirsiniz (işlem geri dönüşümü olmadığı için hala oldukça verimlidir).
  • Con: Bir üretim sistemi çalıştırmak, Apache + PHP, Perl , Ruby , vb. Gibi bir CGI modelinden çok daha karmaşıktır . İşlenmeyen istisnalar, işlemin tamamlanmasını engelleyerek başarısız işçileri yeniden başlatmak için mantık gerektirir ( kümeye bakın ). Buggy yerel kodlu modüller işlemi zorlaştırabilir. Bir çalışan öldüğünde, gerçekleştirdiği tüm istekler bırakılır, böylece bir buggy API diğer kodlanmış API'lar için hizmeti kolayca düşürebilir.

Java / C # / C (C? Gerçekten?)

  • Pro: Node.js'de eşzamansız yapmak, başka bir yerde iş parçacığı güvenliği yapmaktan daha kolaydır ve tartışmasız daha fazla fayda sağlar. Node.js, şimdiye kadar çalıştığım en az acı veren asenkron paradigmadır. İyi kütüphanelerle, senkron kod yazmaktan sadece biraz daha zordur.
  • Pro: Çoklu iş parçacığı / kilitleme hatası yok. Doğru, hiçbir engelleme işlemi olmadan uygun bir asenkron iş akışını ifade eden daha ayrıntılı kod yazmaya ön yatırım yaparsınız. Ve bazı testler yazmanız ve işe yarayacağınız şey var (bir komut dosyası dilidir ve şişman parmak değişken adları sadece birim test zamanında yakalanır). AMA, işe başladıktan sonra, heisenbugs için yüzey alanı - sadece bir milyon koşuda bir kez ortaya çıkan garip problemler - bu yüzey alanı çok daha düşük. Node.js kodunu yazan vergiler, kodlama aşamasına büyük oranda yüklenmiştir. Sonra kararlı kod ile sonuçlanma eğilimindedir.
  • Pro: JavaScript işlevselliği ifade etmek için çok daha hafif. Bunu kelimelerle kanıtlamak zordur, ancak JSON , dinamik yazım, lambda gösterimi, prototip kalıtım, hafif modüller, her neyse ... aynı fikirleri ifade etmek için daha az kod alma eğilimindedir.
  • Con: Belki de gerçekten, Java'daki kodlama hizmetlerinden gerçekten hoşlanıyorsunuz?

JavaScript ve node.js başka bir bakış açısı için, kontrol node.js için Java itibaren , Node.js. öğrenme bir Java geliştirici gösterimler ve deneyimlere bir blog yazısı


Modüller Düğümü düşünürken, JavaScript kitaplığı seçiminizin deneyiminizi TANIMLAYACAĞINI unutmayın. Çoğu kişi en az iki tane, eşzamansız bir desen yardımcısı (Step, Futures, Async) ve bir JavaScript şeker modülü ( Underscore.js ) kullanır.

Yardımcı / JavaScript Şekeri:

  • Underscore.js - bunu kullanın. Sadece yap. Kodunuzu _.isString () ve _.isArray () gibi öğelerle güzel ve okunabilir hale getirir. Başka türlü nasıl güvenli kod yazabileceğinizden emin değilim. Ayrıca, gelişmiş komut satırı-fu için, kendi Underscore-CLI'mı inceleyin .

Asenkron Desen Modülleri:

  • Adım - seri ve paralel eylem kombinasyonlarını ifade etmenin çok zarif bir yolu. Benim kişisel tavsiyem. Bkz Gönderimimi Adım kod görünüyor beğenilerinize.
  • Futures - siparişleri gereksinimler yoluyla ifade etmenin çok daha esnek (bu gerçekten iyi bir şey mi?) Yolu. "Başlat a, b, c paralel olarak. A ve B bittiğinde AB'yi başlatın. A ve C bittiğinde AC'yi başlatın." Bu esneklik, iş akışınızdaki hataları önlemek için daha fazla özen gerektirir (asla geri çağırma veya birden çok kez çağırma gibi). Raynos'un vadeli işlemleri kullanma konusundaki yazısına bakın (bu, beni " kazanma " anlamına gelen gönderi).
  • Async - her desen için bir yöntemle daha geleneksel kütüphane. Ben adım adım dini dönüşüm ve daha sonra Async tüm desen tek bir daha okunabilir bir paradigma ile Adım içinde ifade edilebilir olduğunu fark önce başladı.
  • TameJS - OKCupid tarafından yazılan, seri ve paralel iş akışlarını zarif bir şekilde yazmak için yeni bir dil ilkesi "bekliyor" ekleyen bir ön derleyicidir. Desen şaşırtıcı görünüyor, ancak ön derleme gerektiriyor. Bu konuda hala kararımı veriyorum.
  • StreamlineJS - TameJS'ye rakip. Tame'e doğru eğildim, ama kendi kararını verirsin.

Veya asenkron kütüphaneler hakkında her şeyi okumak için yazarlarla panel röportajına bakınız .

Web Çerçevesi:

  • Ekspres web sitelerini organize Raylar-esk framework Büyük Yakut. JADE'i HTML / HTML şablonlama motoru olarak kullanır , bu da HTML'yi daha az acı verici, hatta neredeyse zarif hale getirir.
  • jQuery Teknik olarak bir düğüm modülü olmasa da, jQuery hızlı bir şekilde istemci tarafı kullanıcı arayüzü için fiili bir standart haline geliyor. jQuery, daha sonra üzerinde çalışılabilecek DOM öğeleri kümesi (küme işleyicileri, özellikler, stiller, vb.) için 'sorgulamak' için CSS benzeri seçiciler sağlar. Aynı damar boyunca Twitter'ın Bootstrap CSS çerçevesi, MVC deseni için Backbone.js ve tüm JavaScript dosyalarınızı tek bir dosyada birleştirmek için Browserify.js . Bu modüllerin hepsi fiili standartlar haline geliyor, bu yüzden en azından duymadıysanız kontrol etmelisiniz.

Test yapmak:

  • JSHint - Kullanmalı ; İlk başta bunu anlayamadım, anlaşılmaz görünüyor. JSLint, Java gibi derlenmiş bir dille elde ettiğiniz temel doğrulamaların bir kısmını geri ekler. Eşleşmeyen parantez, bildirilmemiş değişkenler, birçok şekil ve büyüklükteki yazım hataları. Ayrıca, "anal mod" olarak adlandırdığım şeylerin çeşitli biçimlerini, beyaz alanın tarzını ve neyi doğrulayamadığınızı da açabilirsiniz. bir "" "kapanışını unuttun ... kodunu çalıştırmak ve rahatsız edici çizgiyi vurmak zorunda kalmadan. "JSHint" daha yapılandırılabilir varyantıdır Douglas Crockford sitesindeki jslint .
  • Mocha'yı tercih etmeye başladığım Vows'a rakip. Her iki çerçeve de temelleri yeterince iyi ele alır, ancak Mocha'da karmaşık kalıpların ifade edilmesi daha kolay olur.
  • Yemin Yemin gerçekten çok zarif. Ve hangi test senaryolarının geçtiğini / başarısız olduğunu gösteren güzel bir rapor (--spec) yazdırır. Öğrenmek için 30 dakika harcayın ve minimum çaba ile modülleriniz için temel testler oluşturabilirsiniz.
  • Zombi - JSDom'u sanal bir "tarayıcı" olarak kullanarak HTML ve JavaScript için başsız test . Çok güçlü şeyler. Tarayıcı içi kodun yıldırım hızında belirleyici testlerini almak için Replay ile birleştirin .
  • Testin "nasıl düşünüleceği" üzerine bir yorum:
    • Test isteğe bağlı değildir. JavaScript gibi dinamik bir dilde, çok az statik kontrol vardır. Örneğin, 4 parametrenin beklendiği bir yönteme iki parametre iletilmesi, kod yürütülene kadar kesilmez. JavaScript hata oluşturmak için oldukça düşük çubuk. Derlenmiş dillerle doğrulama boşluğunu oluşturmak için temel testler gereklidir.
    • Doğrulamayı unutun, kodunuzun yürütülmesini sağlayın. Her yöntem için, ilk doğrulama durumum "hiçbir şey kırılmaz" ve en sık tetiklenen durum budur. Kodunuzun fırlatmadan çalıştığını kanıtlamak, hataların% 80'ini yakalar ve kod güveninizi artırmak için çok fazla şey yapar ve kendinizi geri dönerken ve atladığınız nüanslı doğrulama vakalarını eklersiniz.
    • Küçük başlayın ve atalet bariyerini kırın. Hepimiz tembel ve zamana karşı baskı altındayız ve testi "ekstra iş" olarak görmek kolaydır. Bu yüzden küçük başlayın. Test durumu 0 yazın - modülünüzü yükleyin ve başarıyı bildirin. Kendinizi bu kadar yapmaya zorlarsanız, testin atalet engeli kırılır. Belgeleri okumak da dahil olmak üzere ilk seferinde yapmak <30 dakika. Şimdi test durumu 1'i yazın - yöntemlerinizden birini arayın ve "hiçbir şeyin kesilmediğini", yani bir hata geri almadığınızı doğrulayın. Test senaryosu 1 sizi bir dakikadan az sürmelidir. Atalet kaybolduğunda, test kapsamınızı aşamalı olarak genişletmek kolaylaşır.
    • Şimdi testlerinizi kodunuzla geliştirin. "Doğru" uçtan uca testin sahte sunucularla nasıl görüneceğinden korkmayın. Kod basit başlar ve yeni vakaları ele almak için gelişir; Testler de yapılmalıdır. Kodunuza yeni durumlar ve karmaşıklık ekledikçe, yeni kodu kullanmak için test senaryoları ekleyin. Hataları bulduğunuzda, hatalı kodu kapsamak için doğrulamalar ve / veya yeni durumlar ekleyin. Hata ayıklama yaparken ve bir kod parçasına olan güveninizi kaybettiğinizde, geri dönüp düşündüğünüzü yaptığını kanıtlamak için testler ekleyin. Örnek veri dizelerini (aradığınız diğer hizmetlerden, kazıdığınız web sitelerinden, ne olursa olsun) yakalayın ve bunları ayrıştırma kodunuza besleyin. Burada birkaç örnek, orada doğrulamayı geliştirdi ve son derece güvenilir bir kodla karşılaşacaksınız.

Ayrıca, önerilen Node.js modüllerinin resmi listesine göz atın. Ancak, GitHub'ın Düğüm Modülleri Wiki çok daha eksiksiz ve iyi bir kaynaktır.


Düğüm'ü anlamak için, birkaç temel tasarım seçeneğini dikkate almak yararlı olacaktır:

Node.js OLAY BAZLI ve ASENKRON / BLOK OLMAYAN. Gelen HTTP bağlantısı gibi olaylar, biraz iş yapan ve bir veritabanına bağlanma veya başka bir sunucudan içerik çekme gibi diğer eşzamansız görevleri başlatan bir JavaScript işlevini tetikler. Bu görevler başlatıldıktan sonra, etkinlik işlevi sona erer ve Node.js uyku moduna geri döner. Başka bir şey olur olmaz, veritabanı bağlantısı kurulurken veya içerikle yanıt veren harici sunucu gibi, geri çağırma işlevleri tetiklenir ve daha fazla JavaScript kodu yürütülür, bu da daha fazla eşzamansız görevleri (veritabanı sorgusu gibi) başlatır. Bu yolla Node.js, birden fazla paralel iş akışı için etkinlikleri mutlu bir şekilde araya ekleyerek, herhangi bir zamanda engellenmemiş etkinlikleri çalıştırır. Bu yüzden Node.js binlerce eşzamanlı bağlantıyı yönetmek için harika bir iş çıkarıyor.

Neden bağlantı başına sadece herkes gibi bir işlem / iş parçacığı kullanmıyorsunuz?Node.js'de yeni bir bağlantı sadece çok küçük bir yığın ayırmadır. Yeni bir süreci döndürmek, bazı platformlarda megabayt olarak önemli ölçüde daha fazla bellek gerektirir. Ancak gerçek maliyet, bağlam değiştirme ile ilişkili genel masraftır. 10 ^ 6 çekirdek iş parçacığına sahip olduğunuzda, çekirdek bir sonraki işin kimin yürütmesi gerektiğini anlamak için çok fazla iş yapmak zorundadır. Bir sürü çalışma Linux için bir O (1) zamanlayıcı oluşturmaya başladı, ancak sonunda, CPU zamanı için rekabet eden 10 ^ 6 işlemden daha tek bir olay güdümlü işleme sahip olmak çok daha verimli. Ayrıca, aşırı yük koşulları altında, çok işlemli model çok kötü davranır, kritik yönetim ve yönetim hizmetlerini, özellikle SSHD'yi aç bırakır (yani gerçekten ne kadar vidalandığını anlamak için kutuya bile giremezsiniz).

Node.js olan TEK DİŞLİ ve KİLİDİ ÜCRETSİZ . Node.js, çok kasıtlı bir tasarım seçeneği olarak, işlem başına yalnızca bir iş parçacığına sahiptir. Bu nedenle, birden çok iş parçacığının verilere aynı anda erişmesi temel olarak imkansızdır. Böylece kilit gerekmez. İplikler zordur. Gerçekten çok zor. Buna inanmıyorsanız, yeterince dişli programlama yapmadınız. Doğru kilitleme yapmak zordur ve izlenmesi gerçekten zor olan hatalara neden olur. Kilitleri ve çoklu diş açmayı ortadan kaldırmak, en berbat böcek sınıflarından birini ortadan kaldırır. Bu, düğümün en büyük avantajı olabilir.

Ancak 16 çekirdekli kutumdan nasıl yararlanabilirim?

İki yol:

  1. Görüntü kodlama gibi büyük bilgi işlem görevleri için Node.js, alt işlemleri tetikleyebilir veya ek çalışan işlemlere ileti gönderebilir. Bu tasarımda, ağır bilgi işlem görevleri yapan ve diğer 15 CPU'yu çiğneyen olayların akışını ve N işlemlerini yöneten bir iş parçanız olur.
  2. Bir web hizmetindeki iş hacmini ölçeklemek için, kümeyi kullanarak çekirdek başına bir kutuda birden çok Node.js sunucusu çalıştırmalısınız (Node.js v0.6.x ile, burada bağlı olan resmi "küme" modülü, farklı bir API). Bu yerel Node.js sunucuları, yeni bağlantıları kabul etmek ve bunlar arasındaki yükü dengelemek için bir yuvada rekabet edebilir. Bir bağlantı kabul edildiğinde, bu paylaşılan süreçlerden tek bir tanesine sıkı sıkıya bağlı hale gelir. Teoride, bu kulağa kötü geliyor, ancak pratikte oldukça iyi çalışıyor ve iş parçacığı için güvenli kod yazmanın baş ağrısından kaçınmanıza izin veriyor. Ayrıca, bu, Node.js'nin bellek bant genişliğini daha etkili bir şekilde kullanarak mükemmel CPU önbellek yakınlığı elde ettiği anlamına gelir.

Node.js, terlemeden gerçekten güçlü şeyler yapmanızı sağlar. Varsayalım ki, çeşitli görevler yapan,komutlar içinbir TCP bağlantı noktasınıdinleyen,bazı görüntüleri kodlayan her ne olursa olsunbir Node.js programınız var. Beş satır kodla, etkin görevlerin geçerli durumunu gösteren HTTP tabanlı bir web yönetimi portalına ekleyebilirsiniz. Bunu yapmak KOLAY:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

Artık bir URL'ye çarpabilir ve çalışan işleminizin durumunu kontrol edebilirsiniz. Birkaç düğme ekleyin ve bir "yönetim portalınız" var. Çalışan bir Perl / Python / Ruby betiğiniz varsa, "yönetim portalına atmak" tam olarak basit değildir.

Ancak JavaScript yavaş / kötü / kötü / şeytanın doğuşu değil mi? JavaScript'in tuhaf tuhaflıkları var, ancak "iyi bölümleri" ile orada çok güçlü bir dil var ve her durumda JavaScript istemcideki (tarayıcı) THE dilidir. JavaScript burada kalmak için; diğer diller bir IL olarak hedefliyor ve dünya standartlarında yetenek en gelişmiş JavaScript motorlarını üretmek için yarışıyor. JavaScript'in tarayıcıdaki rolü nedeniyle, JavaScript'in hızla yanıp sönmesini sağlamak için muazzam miktarda mühendislik çabası atıldı. V8en azından bu ay için en yeni ve en büyük javascript motorudur. Verimlilik VE istikrar açısından diğer kodlama dillerini uçurur (size bakmak, Ruby). Ve sadece Microsoft, Google ve Mozilla'daki sorun üzerinde çalışan büyük ekiplerle daha iyi olacak, en iyi JavaScript motorunu oluşturmak için yarışıyor (Modern motorların tonlarca JIT yaptığı için artık bir JavaScript "yorumlayıcısı" değilbaşlık altında, yalnızca bir kez yürütme kodu için bir geri dönüş olarak yorumlama ile derleme). Evet, hepimiz birkaç tuhaf JavaScript dil seçimini düzeltebilmemizi dileriz, ama gerçekten o kadar da kötü değil. Ve dil o kadar esnek ki, JavaScript'i gerçekten kodlamıyorsunuz, Step veya jQuery kodluyorsunuz - JavaScript'te, kütüphanelerde deneyimi tanımlar. Web uygulamaları oluşturmak için, zaten JavaScript'i bilmeniz gerekir, bu nedenle sunucuda kodlamanın bir tür beceri seti sinerjisi vardır. Bana istemci kodu yazmayı dehşete düşürmedi.

Ayrıca, JavaScript'ten GERÇEKTEN nefret ediyorsanız, CoffeeScript gibi sözdizimsel şeker kullanabilirsiniz . Veya Google Web Araç Seti (GWT) gibi JavaScript kodu oluşturan herhangi bir şey .

JavaScript'ten bahsetmişken, "kapanış" nedir? - Çağrı zincirleri arasında sözlüksel olarak kapsamlı değişkenleri koruduğunuzu söylemenin oldukça süslü bir yolu. ;) Bunun gibi:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

Bir nesneyi saklamak gibi garip bir şey yapmadan "myData" yı nasıl kullanabileceğinizi görüyor musunuz? Java'nın aksine "myData" değişkeninin salt okunur olması gerekmez. Bu güçlü dil özelliği, zaman uyumsuz programlamayı daha az ayrıntılı ve daha az acı verici hale getirir.

Eşzamansız kod yazmak her zaman basit bir tek iş parçacıklı komut dosyası yazmaktan daha karmaşık olacaktır, ancak Node.js ile o kadar zor değildir ve binlerce eşzamanlı bağlantıya verimlilik ve ölçeklenebilirliğe ek olarak çok fazla avantaj elde edersiniz. ..


"'MyData' değişkeni salt okunur olmak zorunda değil" - eşzamanlılık sorunlarını önlemek için çoğu zaman değişmez tutmak isteyeceksiniz gibi görünüyor, değil mi?
Nick

1
@Nick - bu yanlış. "eşzamanlılık sorunları" düğümün tek iş parçacıklı olmasıyla azaltılır. Düğümde kilitleme yoktur. tek iş parçacıklı bir paradigmada gerekli değildir.
Dave Dopson


1
ps, yan not - Ben aslında yazı "topluluk wiki" haline yeterli kez düzenledi (eşik 10 düzenlemedir). Yanlışlıkla bunun bir tür onur olduğunu düşündüm, aslında sadece oylardan gelen itibar kazanımını engellediğinde. Sonunda, CW statüsündeki seçmenlerden biri "unvote" u tıkladı (umarım kazayla :) ve itibarımı kaybettim ... kafam meta.stackexchange.com/questions/129941/… 'u dosyaladım ve "Topluluk" Wiki "aslında. Modlar CW durumunu kaldırabilecek kadar nazikti. :)
Dave Dopson

1
@John - hata ayıklama yorumum kesinlikle vanilya asnyc için de geçerlidir. Hata ayıklamayı kırmak için tek yapmam gereken "process.nextTick (...)" içine bazı işlev çağrıları sarmak. Sonra atıldığında, yığın izlemim process.nextTick ile başlar; çok yararlı değil. Gerçekten bilmek istiyorum: "hangi yığın planlanan process.nextTick?" Bu veriyi "nedensel zincirler" olarak adlandırıyorum ve Java istisna işlemede bana "nedenBy" yi hatırlatıyor ... düşük seviyeli kod atıyor, orta seviye kodu LL istisnasını yakalar ve FrameworkMethodFailedException'ı atar - LL'den yığın kod kaybolur.
Dave Dopson

85

V8 , JavaScript'in bir uygulamasıdır. Bağımsız JavaScript uygulamalarını çalıştırmanızı sağlar (diğer şeylerin yanı sıra).

Node.js, V8 için yazılmış ve G / Ç olayı yapan bir kütüphanedir. Bu kavram açıklamaya biraz daha zordur ve birinin benden daha iyi bir açıklama ile cevap verecektir eminim ... özü ziyade bazı giriş veya çıkış yapıyor ve bunun gerçekleşmesi için beklemek yerine, sadece o olduğu yok beklemek bitirmesi için. Örneğin, bir dosyanın son düzenlenme zamanını isteyin:

// Pseudo code
stat( 'somefile' )

Bu birkaç milisaniye sürebilir veya birkaç saniye sürebilir. Olaylı G / Ç ile isteği iptal edersiniz ve beklemek yerine istek bittiğinde çalışacak bir geri arama eklersiniz :

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

Bu, tarayıcıdaki JavaScript koduna çok benzer (örneğin, Ajax stili işlevselliği ile).

Daha fazla bilgi için, Node.js'nin kütüphane / platforma girişimi olan gerçekten heyecan verici makalesine göz atmalısınız ... Oldukça iyi buldum.


4
IO kilitler kullanmadan, iş parçacığı, süreç, kapaklar kullanılarak nasıl uygulanır? Ve kavramların fonksiyonel programlama ve Erlang ile oldukça benzer olduğunu hissediyorum.
Jeff

1
Bildiğim kadarıyla basit bir olay döngüsü olarak uygulandı. v8, tıpkı herhangi bir javascript uygulaması gibi geri arama / vb işlevine sahiptir.
rfunduk

2
Node.js'nin IO olay döngüsü, herhangi bir zamanda en fazla bir şeyin yapıldığı anlamına gelir. İki önemli kazanım görüyorum: İplik değiştirme yükü yok, bu nedenle node.js çok hızlı ve ikinci olarak Java'nın kötü şöhretli olduğu birçok tipik eşzamanlılık hatası mümkün değil.
nalply

1
"IO ... kapatılmadan nasıl uygulanır?" JavaScript kapanışları destekler ve node.js'de her zaman kullanılırlar (buradaki örnekte anonim işlevler ans).
panzi

@panzi: Jeffrey, node.js'nin 'onsuz' uygulandığı şeyler listesine kapaklar dahil ettiğini fark etmedi. Açıkçası javascript her işlevi onun kapsamı etrafında bir kapatma :)
rfunduk

35

Node.js , sunucu tarafı JavaScript kodu için oluşturulmuş açık kaynaklı bir komut satırı aracıdır. Bir tarball indirebilir , kaynağı derleyebilir ve yükleyebilirsiniz. JavaScript programlarını çalıştırmanıza izin verir.

JavaScript, Google tarafından geliştirilen ve Chrome tarayıcıda kullanılan bir JavaScript motoru olan V8 tarafından yürütülür . Ağa ve dosya sistemine erişmek için bir JavaScript API'sı kullanır.

Performansı ve paralel işlemler gerçekleştirme yeteneği ile popülerdir.

Node.js'yi anlamak , şimdiye kadar bulduğum en iyi node.js açıklamasıdır .

Aşağıda konuyla ilgili bazı iyi makaleler bulunmaktadır.


13

Kapaklar, oluşturulduğu bağlamda kod yürütmenin bir yoludur.

Bunun eşzamanlılık için anlamı, değişkenleri tanımlayabilmeniz, ardından engellemesiz bir G / Ç işlevini başlatabilmeniz ve geri çağrılması için anonim bir işlev göndermenizdir.

Görev tamamlandığında, geri çağrı işlevi değişkenlerle bağlamda yürütülür, bu kapatmadır.

Kilitlenmeyen G / Ç ile uygulamalar yazmak için kapanmaların bu kadar iyi olmasının nedeni, eşzamansız çalışan işlevlerin bağlamını yönetmenin çok kolay olmasıdır.


8

İki iyi örnek, şablonları nasıl yönettiğinize ve şablonlarla aşamalı geliştirmeleri nasıl kullandığınıza ilişkindir. Mükemmel çalışması için birkaç JavaScript kod parçasına ihtiyacınız var.

Bu makaleleri izlemenizi ve okumanızı önemle tavsiye ederim:

Herhangi bir dili seçin ve HTML dosya şablonlarınızı nasıl yöneteceğinizi ve DOM yapınızdaki tek bir CSS sınıf adını güncellemek için ne yapmanız gerektiğini hatırlamaya çalışın (örneğin, bir kullanıcı bir menü öğesini tıkladı ve "seçildi" ve sayfanın içeriğini güncelleyin).

Node.js ile istemci tarafı JavaScript kodunda yapmak kadar basittir. DOM düğümünüzü alın ve CSS sınıfınızı buna uygulayın. DOM düğümünüzü ve innerHTML içeriğinizi alın (bunu yapmak için ek JavaScript koduna ihtiyacınız olacaktır. Daha fazla bilgi için makaleyi okuyun).

Başka bir iyi örnek, web sayfanızı hem JavaScript açıkken hem de aynı kod parçasıyla uyumlu hale getirebilmenizdir. JavaScript'te, kullanıcılarınızın bir takvim kullanarak herhangi bir tarihi almasını sağlayacak bir tarih seçiminiz olduğunu düşünün. JavaScript'iniz AÇIK veya KAPALI iken çalışmasını sağlamak için aynı JavaScript kodunu yazabilir (veya kullanabilirsiniz).


7

Node.js'nin olay odaklı modelini en iyi açıklayan çok iyi bir fast food yer benzetmesi var, Node.js, Doktor Ofisleri ve Fast Food Restoranlarının tam makalesine bakın - Olay Tabanlı Programlamayı Anlama

İşte bir özet:

Fast food eklemi geleneksel iplik bazlı bir modeli takip ettiyse, yemeğinizi sipariş edip alıncaya kadar sırada beklersiniz. Arkanızdaki kişi, siparişiniz bitene kadar sipariş veremezdi. Olaya dayalı bir modelde, yemeğinizi sipariş edip beklemek için hattan çıkarsınız. Böylece herkes sipariş verebilir.

Node.js olay güdümlüdür, ancak çoğu web sunucusu iş parçacığı tabanlıdır.York, Node.js'nin nasıl çalıştığını açıklar:

  • Web tarayıcınızı bir Node.js web sunucusunda "/about.html" isteğinde bulunmak için kullanırsınız.

  • Node.js sunucusu isteğinizi kabul eder ve bu dosyayı diskten almak için bir işlev çağırır.

  • Node.js sunucusu dosyanın alınmasını beklerken bir sonraki web isteğine hizmet eder.

  • Dosya alındığında, Node.js sunucuları kuyruğuna eklenen bir geri arama işlevi vardır.

  • Node.js sunucusu, bu durumda "/about.html" sayfasını görüntüleyip web tarayıcınıza geri göndereceği işlevi yürütür.


6

Eh, bunu anlıyorum

  • Düğümün amacı, ölçeklenebilir ağ programları oluşturmak için kolay bir yol sağlamaktır.
  • Düğüm, tasarımda Ruby'nin Event Machine veya Python's Twisted gibi sistemlere benzer ve bunlardan etkilenir.
  • V8 javascript için geliştirilmiş I / O.

Benim için bu üç varsayımda da haklı olduğunuz anlamına geliyor. Kütüphane kesinlikle umut verici görünüyor!


1
Sayfa hakkında bulduğum çoğu zaman oldukça belirsiz.
Jeff

6

Ayrıca, Google'ın V8'inin ÇOK hızlı olduğunu da unutmayın. Aslında JavaScript kodunu derlenmiş ikili performans ile makine koduna dönüştürür. Yani diğer tüm harika şeylerle birlikte, ÇOK hızlı.


3

S: Programlama modeli, özellikle G / Ç'yi kullanma biçiminde olay güdümlüdür .

Doğru. Geri çağrıları kullanır, bu nedenle dosya sistemine erişmek için yapılan herhangi bir istek, dosya sistemine bir isteğin gönderilmesine neden olur ve ardından Node.js bir sonraki isteğini işlemeye başlar. Yalnızca dosya sisteminden bir yanıt aldığında G / Ç isteği hakkında endişelenir ve geri çağırma kodunu çalıştırır. Ancak, senkronize G / Ç istekleri (yani, engelleme istekleri) yapmak mümkündür. Asenkron (geri aramalar) veya senkron (bekleme) arasında seçim yapmak geliştiriciye bağlıdır.

S: JavaScript kullanıyor ve ayrıştırıcı V8.

Evet

S: Eşzamanlı sunucu uygulamaları oluşturmak için kolayca kullanılabilir.

Evet, ancak çok fazla JavaScript'i elle kodlamanız gerekir. Tam çevrimiçi belgeler ve örnek bir uygulama ile birlikte gelen http://www.easynodejs.com/ gibi bir çerçeveye bakmak daha iyi olabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.