Bu büyük bir soru ve uzun bir cevabın tamamlanmasını gerektiriyor, bu yüzden en önemli farklılıkların bir alt kümesini ele alacağım. Hala uzun bir cevap olduğu için özür dileriz.
Nasıl benzerler?
Söylediğinizde kesinlikle haklısınız:
Temel örnekler için benzer görünüyorlar
Her iki çerçeve de aynı temel sorunu çözüyor: Düğümde HTTP sunucuları oluşturmak için uygun bir API sağlamak. Yani, alt düzey yerel http
modülü tek başına kullanmaktan daha uygundur . http
Modül istediğimiz her şeyi yapabilir ama birlikte yazma uygulamalarına sıkıcı bu.
Bunu başarmak için her ikisi de uzun süredir yüksek seviyeli web çerçevelerinde bulunan kavramları kullanıyor: yönlendirme, işleyiciler, eklentiler, kimlik doğrulama modülleri. Her zaman aynı isimlere sahip olmayabilirler ama kabaca eşdeğerler.
Temel örneklerin çoğu şuna benzer:
- Bir rota oluşturun
- Rota talep edildiğinde yanıtı hazırlayarak bir işlevi çalıştırın
- Talebe cevap verin
Hızlı:
app.get('/', function (req, res) {
getSomeValue(function (obj) {
res.json({an: 'object'});
});
});
hapi:
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
getSomeValue(function (obj) {
reply(obj);
});
}
});
Fark burada tam olarak çığır açıcı değil değil mi? Öyleyse neden birini diğerine tercih edesiniz?
Nasıl farklılar?
Basit cevap, hapi'nin çok daha fazlası olduğu ve çok daha fazlasını kutudan çıkaracağıdır. Yukarıdan basit bir örneğe baktığınızda bu net olmayabilir. Aslında, bu kasıtlıdır. Basit durumlar basit tutulur. Öyleyse bazı büyük farkları inceleyelim:
Felsefe
Ekspres çok minimum düzeyde olacak şekilde tasarlanmıştır. Üstünde ince bir tozlanma ile size küçük bir API vererek http
, ek işlevsellik eklemek açısından hala kendi başınızasınız. Gelen bir talebin metnini okumak istiyorsanız (oldukça yaygın bir görev), ayrı bir modül kurmanız gerekir . Bu rotaya çeşitli içerik türlerinin gönderilmesini bekliyorsanız, Content-type
başlığın hangisi olduğunu kontrol etmek ve buna göre ayrıştırmak için başlığı da kontrol etmeniz gerekir (örneğin, JSON ve çok parçalı form), genellikle ayrı modüller kullanarak .
hapi, kod yazılmasını gerektirmek yerine, genellikle yapılandırma seçenekleriyle açığa çıkan zengin bir özellik setine sahiptir. Örneğin, işleyici çalıştırılmadan önce bir istek gövdesinin (yük) belleğe tam olarak okunduğundan ve uygun şekilde ayrıştırıldığından (içerik türüne göre otomatik olarak) emin olmak istiyorsak, bu sadece basit bir seçenektir :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Özellikleri
Hapi'nin daha büyük bir özellik seti sunduğunu görmek için her iki projedeki API belgelerini karşılaştırmanız yeterlidir.
hapi, Express'te bulunmayan aşağıdaki özelliklerden bazılarını içerir (bildiğim kadarıyla):
Genişletilebilirlik ve modülerlik
hapi ve Express, genişletilebilirliği oldukça farklı bir şekilde ele alıyor. Express ile ara yazılım işlevlerine sahipsiniz . Ara yazılım işlevleri, istiflediğiniz filtreler gibidir ve tüm istekler, işleyicinize ulaşmadan önce bunların üzerinden geçer.
hapi, istek yaşam döngüsüne sahiptir ve ara yazılım işlevleriyle karşılaştırılabilir, ancak istek yaşam döngüsünde birkaç tanımlı nokta bulunan uzantı noktaları sunar .
Walmart'ın hapi oluşturup Express'i kullanmayı bırakmasının nedenlerinden biri, bir Express uygulamasını ayrı parçalara bölmenin ve farklı ekip üyelerinin yığınları üzerinde güvenli bir şekilde çalışmasını sağlamanın ne kadar zor olduğuyla ilgili bir hayal kırıklığı oldu. Bu nedenle hapi'de eklenti sistemini oluşturdular .
Bir eklenti bir alt uygulama gibidir, bir hapi uygulamasında yapabileceğiniz her şeyi yapabilir, rotalar, uzantı noktaları vb. Ekleyebilirsiniz. Bir eklentide uygulamanın başka bir bölümünü bozmadığınızdan emin olabilirsiniz, çünkü rota kayıtları önemli değildir ve çakışan rotalar oluşturamazsınız. Daha sonra bu eklentileri bir sunucuda birleştirebilir ve dağıtabilirsiniz.
Ekosistem
Express size kutudan çok az şey verdiğinden, projenize bir şey eklemeniz gerektiğinde dışarıya bakmanız gerekir. Hapi ile çalışırken çoğu zaman ihtiyacınız olan özellik ya yerleşiktir ya da çekirdek ekip tarafından oluşturulmuş bir modül vardır.
Minimal sesler harika. Ancak ciddi bir prodüksiyon uygulaması oluşturuyorsanız, muhtemelen tüm bunlara eninde sonunda ihtiyacınız olacak.
Güvenlik
hapi, Walmart ekibi tarafından Kara Cuma trafiğini yürütmek üzere tasarlandı, bu nedenle güvenlik ve istikrar her zaman en önemli endişe kaynağı oldu. Bu nedenle çerçeve, işlem belleğinizin tükenmesini önlemek için gelen yük boyutunu sınırlamak gibi fazladan birçok şey yapar. Ayrıca, maksimum olay döngü gecikmesi, kullanılan maksimum RSS belleği ve v8 yığınının maksimum boyutu gibi seçeneklere de sahiptir; bunun ötesinde sunucunuz, yalnızca çökme yerine 503 zaman aşımı ile yanıt verir.
özet
İkisini de kendiniz değerlendirin. İhtiyaçlarınızı ve ikisinden hangisinin en büyük endişelerinizi karşıladığını düşünün. İki topluluğa (IRC, Gitter, Github) dalın, hangisini tercih ettiğinizi görün. Sadece sözümü dinleme. Ve mutlu hackler!
SORUMLULUK REDDİ: Hapi üzerine bir kitabın yazarı olarak önyargılıyım ve yukarıdakiler büyük ölçüde kişisel görüşüm.