Express, Koa, Meteor, Sails.js: Kıyametin Dört Çerçevesi
Yayınlanan: 2022-03-11JavaScript, web uygulamalarına yönelik muazzam talep nedeniyle kesinlikle son yıllarda en popüler dillerden biri haline geldi. Birden çok tarayıcı için kodlama yaparken, JavaScript, ön uç geliştiriciler için neredeyse tek seçenektir. Alternatif olarak CoffeeScript, TypeScript veya Dart olduğu iddia edilebilir. Ancak gerçek şu ki, CoffeeScript çoğunlukla sonunda JavaScript'e dönüşen sözdizimsel bir şeker olarak görülüyor. TypeScript, isteğe bağlı statik yazma, sınıflar ve arabirimler gibi çeşitli nesne yönelimli dil özelliklerini içeren bir JavaScript üst kümesidir ve hala ilk günlerindedir. Dart aynı zamanda C benzeri sözdizimine sahip nesne yönelimli bir dildir, ancak yine de ana akım tarayıcılar için JavaScript'i derler.
Node.js'nin doğuşu ve hızlı büyümesiyle birlikte JavaScript artık ön uç geliştirmeyle sınırlı değil ve arka uç geliştirme artık ön uç kodlayıcılar için roket bilimi değil. İnsanlar JavaScript'i her duruma uyan gümüş bir kurşun olarak düşünme eğilimindedir: ön uç, web sunucusu, masaüstü uygulaması, gömülü sistem, veritabanları… liste uzar gider. Aslında, JavaScript'in geniş kitleleri göz önüne alındığında, Node.js+MongoDB+AngularJS/React oldukça büyük miktarda tam yığın web geliştiricisi yaptı. Ancak Node.js, hafif olacak şekilde tasarlanmıştır ve web uygulaması geliştirme hızını artırmak için bir web sunucusu olarak yalnızca temel işlevleri sağlar. Npm paketleri olarak sunulan hazır çerçevelerden biri gerçek dünyada daha iyi bir seçenek olacaktır.
Bu yazıda, geliştiricileri tekerleği tekrar tekrar icat etmekten kurtaran, iyi bilinen ve zaman içinde test edilmiş Node.js çerçevelerinden bazılarını inceleyeceğiz. Daha spesifik olmak gerekirse, bu makalede Express, Koa, Meteor ve Sails.js'ye bir göz atacağız. Bu çerçevelerin her birinin birbirine karşı nasıl yığıldığını anlamaya çalışmak yerine, bu çerçevelerin her birinin üstün olduğu kilit alanları ve çeşitli proje ihtiyaçlarıyla nasıl alakalı olduklarını göreceğiz.
Ekspres: Minimalist Bir Web Çerçevesi
Express'in Node.js işi için en büyük anlaşma olduğunu söylemeye gerek yok. Her Node.js oyuncusu bunu duymuştur ve farkında olsun ya da olmasın kullanıyor. Şu anda 4. neslinde ve onu temel alan veya konseptlerinden ilham alan epeyce Node.js çerçevesi var.
Verim
Çoğu geliştirici, Node.js'yi ham hızı nedeniyle sever ve çerçeve seçimi söz konusu olduğunda, bir mükemmeliyetçi herhangi bir performans tehlikesini küçümseyebilir. Express, temel yönlendirme, ara katman yazılımı, şablon motoru ve statik dosya sunumu gibi web uygulaması özellikleriyle Node.js'nin üzerinde ince bir katman sağlar, böylece Node.js'nin büyük G/Ç performansından ödün verilmez.
Express, minimal, fikirleri olmayan bir çerçevedir. MVC, MVP, MVVM veya kutudan çıkan trendler gibi yaygın tasarım modellerinden hiçbirini uygulamaz. Basitlik hayranları için bu, diğer tüm çerçeveler arasında büyük bir artı çünkü uygulamanızı kendi tercihlerinizle ve gereksiz öğrenme eğrisi olmadan oluşturabilirsiniz. Bu, özellikle tarihsel bir yükü olmayan yeni bir kişisel proje oluştururken avantajlıdır, ancak proje veya geliştirme ekibi büyüdükçe, standardizasyon eksikliği proje/kod yönetimi için fazladan çalışmaya ve en kötü durum senaryosu, sürdürülememesine neden olabilir. .
Jeneratör
Çerçevenin görüşü alınmamış olsa da, belirli proje klasör yapısı oluşturan oluşturucuya sahiptir. Express-generator npm paketini kurduktan ve jeneratör komutuyla uygulama iskeleti oluşturduktan sonra, görüntüleri, ön uç statik JavaScript'i, stil sayfası dosyalarını ve HTML şablon dosyalarını düzenlemenize yardımcı olmak için net bir hiyerarşiye sahip bir uygulama klasörü oluşturulacaktır.
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
ara katman yazılımı
Ara yazılım, temelde hem istek hem de yanıt nesnelerine tam erişime sahip işlevlerdir.
Adından da anlaşılacağı gibi, ara katman yazılımı, kontrolü gerçek iş mantığına veya bir sonraki ara katman yazılımı düzeyine devretmeden önce bazı filtreleme talimatları uygular. Kullanıcı oturum açma durumunu kontrol etme, kullanıcı yetkisini doğrulama veya siteler arası saldırıları önleme gibi bazı yaygın görevler, en iyi şekilde ara yazılım olarak çıkarılır.
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
İster kendi ara katman yazılımınızı özelleştirmek, ister çerçevenin yerleşik ara katman yazılımlarından yararlanmak isteyin, Express uygulaması aslında bir dizi ara katman yazılımı işlevine sahip Node.js'dir. Express, süreci doğal ve sezgisel hale getirdi.
Şablon Motoru
Şablon motorları, geliştiricinin arka uç değişkenlerini HTML dosyalarına gömmesine izin verir ve istendiğinde şablon dosyası, değişkenler gerçek değerleriyle enterpolasyonlu olarak düz HTML biçimine dönüştürülür. Varsayılan olarak, ekspres oluşturucu Pug (başlangıçta Jade olarak bilinir) şablon motorunu kullanır, ancak Mustache ve EJS gibi diğer seçenekler de Express ile sorunsuz bir şekilde çalışır.
Veritabanı Entegrasyonu
Minimal bir çerçeve olarak Express, veritabanı entegrasyonunu paketinde gerekli bir özellik olarak görmez, bu nedenle hiçbir şekilde belirli bir veritabanı kullanımına yönelmez. MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch veya başka bir şey gibi belirli bir veri depolama teknolojisini benimserken, bu sadece belirli npm paketini veritabanı sürücüsü olarak kurmak meselesidir. Bu üçüncü taraf veritabanı sürücüleri, CRUD talimatlarını yaparken birleşik sözdizimine uymazlar, bu da veritabanlarını değiştirmeyi büyük bir güçlük ve hataya açık hale getirir.
Koa: Yeni Nesil JavaScript Özelliklerini Kullanmak
Koa, Express'in arkasındaki ekip tarafından geliştirilmiştir ve amacı, çekirdeğinde herhangi bir ara katman yazılımını bir araya getirmeyerek minimalist Express'i en aza indirmektir. Ara yazılımdan yoksun olmasının dışında Koa, Express'e çok benziyor, hafif ve fikirsiz. Ancak Koa'yı gerçekten öne çıkaran şey, ES6 Jeneratör özelliğini kullanarak geri aramayı tamamen ortadan kaldırma yöntemidir.
Zarif Kontrol Akışı
Javascript asenkron bir programlama dilidir ve dilin kendi içgüdüsü ve Node.js'nin tek iş parçacıklı olay güdümlü mekanizması ile geri arama her yerdedir, bu nedenle kötü şöhretli geri arama cehennemi.
Geri arama iç içe yerleştirmeyi düzleştirmenin bir yolu, Async.js kullanmaktır. Async.js, birden çok işlevi birbirine gömmek zorunda kalmadan eşlemek, paralelleştirmek, seri hale getirmek veya yinelemek için teknikler sağlar ve ardından bir geri arama işleviyle kontrol akışının üzerinden geçer, birlikte gruplandırılmış işlevler için bir geri arama ve bir hata işleme işlevi yeterlidir. bir Async.js yöntemiyle. Yine de Async.js, geri aramaların tamamını silemez. Node.js kodunu Async.js ile yazarken, kodun girintisi hala sağa kayma eğilimi gösterir, ancak o kadar derine değil.
Başka bir temiz yol, o zaman mümkün olan Sözleri kullanmaktır. Ünlü bazı üçüncü taraf Promise kitaplıkları bluebird ve q'dir. JavaScript'in en yeni sürümü olan ES6'da, Promise bir standardizasyon olarak alınmıştır. Uzun lafın kısası, Promise, uygulama bloklarını/fonksiyonlarını bir grup Promise "o zaman" işleviyle bağlayarak işlevlerin sıralı bir şekilde yürütülmesini ve döndürülmesini garanti eder. Bir sonraki "sonra" işlevinin yürütülmesi için her uygulama bloğunun/fonksiyonunun sonunda "çözersiniz" veya kontrol akışının doğrudan hata işlemeye geçmesi için aşağıdaki uygulamayı "reddedersiniz". Bu şekilde, tüm hata işleme işlevlerini tek bir yerde toplar ve geri aramalardan tamamen kurtulursunuz.
Şimdi ES6, masaya bir oyun değiştirici getiriyor - ES6 Generator. Bu kavram JavaScript için yenidir, ancak programlama dünyasında hiç de yeni değildir. ES6 Generator, C'deki kesintiye benzer, kod satırlarını yukarıdan aşağıya kadar çalıştırmak yerine, ES6 Generator, çalıştırma->durdurma ve başka bir şey çalıştırma->geri gelip kalanları bitirmek için bir yol sunar.

Koa, JavaScript asenkron programlama ile başa çıkmak için zarif bir yol sağlamak için ES6 Jeneratörlerini kullanıyor, bu nedenle saf bir Koa uygulamasında geri aramaları göremezsiniz. ES6 Generator'ın Koa'daki tipik bir kullanım durumu, özelleştirilmiş ara katman yazılımının kötü geri aramalar olmadan birbiri ardına yürütülmesine izin veren ara katman yazılımı basamaklamasıdır.
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
Bu son teknoloji tekniğin Async.js, Promise veya olay yayıcı gibi eski usul çözümlerden daha üstün olduğunu iddia eden sonuçlara varamayız, ancak kesin olan bir şey var ki bu yeni konsepte alışmak biraz zaman alıyor. Alışılmadık kontrol akışı dizisiyle, kod hata ayıklaması için ekstra zorluk getirebilir.
Meteor: Web, Mobil ve Masaüstü Çerçevesi
Meteor, hepsi bir arada bir JavaScript çerçevesidir. Express ve Koa'nın sadeleştirme felsefesinden farklı olarak, kendisini tam yığın bir çerçeve, sunucu, mobil, masaüstü ve web uygulamalarını kapsayan eksiksiz bir paket olarak tanımlayarak diğer uç noktaya gider.
Hepsi Bir Arada Paket
Kaputun altına yakından bakarsanız, Meteor'un gerçekten Node.js+Blaze/AngularJS/React+Cordova+MongoDB olduğunu fark edeceksiniz. Node.js ve MongoDB, sırasıyla sunucu tarafı iş mantığı ve veri depolamadan sorumludur. Blaze, AngularJS veya React'ten biri ön uç kullanıcı arayüzü ile ilgilenir. Mobil hibrit uygulamalar için en ünlü HTML çözümü olan Cordova, web sayfalarını mobil görünümlere bağlar.
Veri Senkronizasyonu
Verileri paylaşmak için arka uç ve ön uç için ana süreç aşağıdaki gibidir:
- İstemci, verileri veya belirli bir HTML görünümünü ister
- Sunucu, veritabanından veri alır, bazı şablonlama motorlarını kullanarak verileri HTML görünümüyle karıştırır ve ön uca geri gönderir
- Müşteri, verileri/görünümü kullanıcı dostu bir şekilde işler ve gösterir
Modern bir tek sayfa web uygulaması, yukarıdaki işlemi biraz değiştirir. Örnek olarak AngularJS'yi alın, HTML şablonlarını ön uç JavaScript dosyaları, stil sayfaları ve resimler gibi diğer varlıklarla birlikte statik dosyalar olarak yerleştirir. AngularJS daha sonra Ajax RESTful API kullanarak arka uçtan veri isteyerek verileri HTML şablonlarına doldurur. Her iki durumda da, arka uç geliştiriciler, ön uçtan gelen veri değişikliği isteklerini işlemekten ve değişiklikleri veritabanına kaydetmekten tamamen sorumludur.
Meteor'u diğer çerçevelerden ayıran özelliklerden biri, sunucu ve ön uç/mobil uygulamalar arasındaki veri senkronizasyon mekanizmasıdır. Meteor'da istemci, sunucu veritabanından çoğaltmanın küçük bir kısmı olan, daha önce istemci tarafından talep edilen ve sunucu tarafından yetkilendirilen bir kısım olan mini veritabanı gölge kopyasını tutar. İstemci verilerde herhangi bir değişiklik yapmak istediğinde, herhangi bir CRUD talimatını gerçekleştirmek için sunucu tarafı olarak tutarlı veritabanı API'sini kullanır ve ardından veri değişiklikleri otomatik olarak sunucuya gönderilir ve gerçek veritabanına kaydedilir. Sunucu herhangi bir veri değişikliği tespit ettiğinde, güncellenen verileri bu verilere abone olan belirli istemcilere gönderir. Bu çift yönlü veri senkronizasyonu, herhangi bir manuel müdahale olmaksızın otomatik olarak gerçekleştirilir. Bu sihri yaratmak için Meteor, istemci ve sunucuyu kaputun altına bağlamak için WebSocket'ı kullanıyor, böylece bir uçtaki herhangi bir veri değişikliği anında diğerine yansıtılacak.
Otomasyon Aracı Oluştur
Meteor, HTML/JavaScript/CSS'yi yerel mobil işlevlerle bir araya getiren bir kitaplık olan Cordova'nın yardımıyla Meteor'un Isobuild adlı oluşturma aracını kullanarak yalnızca sunucu ve web uygulaması uygulamalarıyla ilgilenmekle kalmaz, Meteor iOS ve Android uygulamaları oluşturmayı çok kolaylaştırır. Oluşturulan mobil uygulamalar, JavaScript çalıştıran veya bir Web Görünümü içinde HTML sayfaları gösteren karma uygulamalardır. Bu geçici çözüm, yerel mobil uygulamalarla karşılaştırıldığında bazı kullanıcı deneyiminden ödün verebilir, ancak birçoğu için hepsini web uygulamalarıyla aynı kod tabanı altında yönetebilmek oldukça büyük bir satış noktasıdır ve bir ton geliştirme maliyetinden tasarruf sağlar.
Genel olarak, Meteor yüksek oranda otomatikleştirilmiş bir çerçevedir. Bu yüksek seviyeli otomasyon, geliştiricilerin hayatını çok daha kolay hale getirir, ancak tehlikeye atılmış performans ve ölçeklenebilirlik kısıtlamaları ile birlikte gelir. Kullanıcı tabanı büyüdükçe, otomatikleştirilmiş veri senkronizasyonu tekniği, ölçekleme kilit noktası haline gelir. Diğer elle ayarlanmış arka uç teknolojileriyle aynı kapasite ve performansı elde etmek için Meteor genellikle çok daha fazla sunucu donanımı ve bant genişliği kaynağı tüketir. Dolayısıyla, tüm büyük platformlar için bir proje prototipi yapmak isteniyorsa Meteor harika bir başlangıç noktası ve mükemmel bir araç kutusu olabilir, ancak sonunda bir noktada, prototip bir üretim projesi haline gelirse, sistem mimarisinin daha profesyonel bir şekilde yeniden tasarlanması gerekir. müşteri tabanı.
Sails.js: Node.js için Üstün MVC Çerçevesi
Sails.js, Express ile birçok benzerliğe sahiptir. Bu bir proje oluşturucu, ara katman yazılımı ve şablonlama motorudur. Aslında, geliştirmeyi hızlandırmak için Express'in yanı sıra bazı üst düzey işlevler üzerine inşa edilmiştir.
MVC
Sails.js, özünden Model-View-Controller tasarım desenini benimser. Ruby on Rails veya Laravel'den gelenler için bir Sails.js uygulamasının yapısını çok tanıdık bulacaklar. Model, veritabanı tablosu/toplama şemasını yansıtan veri modelini temsil eder, Görünüm, doldurulmuş verilerle HTML görünümüdür, Denetleyici, tüm sunucu tarafı iş mantığını yerleştirdiğiniz yerdir ve veriler ile görünüm arasında bir yapıştırıcı görevi görür.
Gerçek Zamanlı İletişim
İstemcinin her seferinde sunucu verilerini sorgulaması gereken bir HTTP isteği veya sunucuyu boşta moduna geçiren uzun yoklama bağlantısı gibi, Socket.io, istemci ve sunucu arasında çift yönlü olay tabanlı bir iletişim kurar. Sails.js, Socket.io'yu entegre eder ve daha fazla kolaylık sağlamak için bazı daha yüksek soyutlama seviyeli API'lerle tamamlar, böylece Sails.js'yi özellikle sohbet uygulamaları veya çok oyunculu oyunlar oluşturmak için uygun hale getirir.
Veritabanı ORM'si
Arka uç mantığı ile gerçek veritabanı manipülasyonu arasında, Waterline adında bir orta ORM katmanı vardır. Basitçe söylemek gerekirse, bu ORM aracı, geliştiricilerin SQL'e karşı NoSQL, şemaya karşı şemasız vb. çeşitli veritabanı sorgu dilleriyle ilgilenmesine gerek kalmadan farklı veritabanlarına erişmek için tutarlı bir sözdizimi sağlar.
Sails.js, orta düzeyde bir otomasyon derecesine sahiptir. Sunucu tarafı mantığına odaklanır ve üretime hazırdır ve herhangi bir performanstan veya gelecekteki ölçeklenebilirlikten ödün vermeden Express'ten daha hızlı bir gelişme hızı sağlar. Özellikle çok sayıda MVC modeli adanmışları için Sails.js oldukça düzgün bir öğrenme eğrisine sahiptir.
Sarmak
Bu makale, farklı Node.js çerçevelerini sıralamamakta, bunun yerine, Node.js geliştiricilerinin sıfırdan bir proje oluştururken en uygun araç kutusunu seçmelerine yardımcı olmak için kalabalığın arasından sıyrılmak için her çerçevenin parlayan noktalarını listeler.
Peki, web geliştirme için favori Node.js çerçeveniz hangisi? Yukarıda tartıştığımız çerçevelerden başka bir çerçeveyi mi tercih ediyorsunuz? Aşağıdaki yorumlar bölümünde bize bildirin.
- Neden Node.js Kullanmalıyım? Her Duruma Özel Eğitim
- Kabin Ateşi Kodlaması: Bir Node.js Arka Uç Eğitimi
- Node.js/TypeScript REST API Oluşturma, Bölüm 1: Express.js