Express, Koa ve Hapi: En iyi Node.js Framework’ü hangisi? [detaylı karşılaştırma]

Atamyrat Abdyrahmanov
SDTR
Published in
5 min readAug 3, 2020

Selamlar 👋🏻,

Bu yazımızda sizinle beraber günümüz teknoloji dünyasında popüler olan Node.js’in framework’larını olabildiğince detaylı bir şekilde inceleyip her framework’un çalışma mantığını beraber öğreniyor olacağız.

Express-vs-Hapi-vs-Koa

Express, Hapi, Koa nedir?

Express developer’ler için basit, performanslı ve kolaylaştırılmış bir şekilde uygulama sunucuları oluşturmayı sağlayan bir Node.js framework’üdür.

Express 2009 senesinden beri geliştirilmekte olup, Github’da +49,000 star’ı ve haftalık yaklaşık 16,000,000 npm indirme oranı ile node.js framework’ları arasında en çok tercih edilen olduğunu gözler önüne sermektedir.

Hapi içerisinde birçok özellikleri barındıran, gerekli konfigurasyonları başka modüllerden faydalanmak yerine içerisindeki yapıyı kod yazmakla düzenlenebilmekte olup kapsamlı bir kullanım alanınını içermeyi amaçlamaktadır.

Hapi 2011 senesinden beri geliştirlmekte olup GitHub’da +12,000 star’ı ve haftalık yaklaşık 300,000 npm indirme oranı bulunmaktadır. Express’e kıyasla daha yeni ve az kullanıcı kitlesine sahip olmasına rağmen Walmart, Disney ve Macy’s gibi çeşitli büyük şirketler tarafından kullanılmaktadır.

Koa Express’in kurucu topluluğu tarafınca geliştirilmiş olup, API ve web uygulama geliştirme sürecinde daha küçük, basit, ve sağlam temel olmayı hedeflemektedir. Ek olarak, Koa asenkron fonksiyonlarına daha çok yer vermekte olup, callback kullanımından kaçınmanıza olanak sağlayarak error-handling sürecini kolaylaştırmaktadır.

Node.js dünyasında yeni bir framework olmasına rağmen, Github’da +29,000 star’ı ve haftalık yaklaşık 615,000 npm indirme oranına sahiptir.

Özet

Kendi projeniz için Node.js framework’ları arasında tercih yaparken, dikkate almanız gereken (tavsiye edilen 😏) kriterler:

  • Kurulumu
  • Temel Yapısı
  • Hello World Örneği
  • Middleware
  • Performans

Kurulumu

Express’in kurulumuna başlamadan, Node.js kurulu olduğundan emin olmalısınız, sonrasından:

$ npm install express 

Hapi’nin kurulumuna başlamadan da aynı şekilde, Node.js kurulu olduğundan emin olmalısınız, sonrasından:

$ npm install Hapi 

Koa kendi içerisinde ES2015 özelliklerine ve asenkron fonksiyonlara yer verdiğinden, node v7.6.0 veya daha yüksek Node.js sürümünün kurulu olduğundan emin olmalısınız (kontrol etmek için node -v), sonrasından:

$ npm install koa          

Temel Yapısı

Basic Setup

Express, Happi ve Koa herbiri farklı özellik ve işlevlere sahip olduğundan herbiri kendi içerisinde özgündür. Bu nedenle, bu kısım diğerlerine kıyasla biraz karışıktır 😓.

Express

Express’in temel kurulumu oldukça basittir. Örnek koda bakmanız yeterlidir:

const express = require('express');const HOST = process.env.HOST || 0.0.0.0;
const PORT = process.env.PORT || 3000;
const app = express();app.listen(HOST, PORT, () => {
console.log(`Express is listening to http://${HOST}:${PORT}`);
});

Hapi

const Hapi = require('@hapi/hapi');const HOST = process.env.HOST || 0.0.0.0;
const PORT = process.env.PORT || 3000;
const server = new Hapi.Server({ port: PORT, host: HOST });

server.start(() => {
console.log(`Hapi is listening to http://${HOST}:${PORT}`);
});

Koa

const Koa = require('koa');
const app = new Koa();
const HOST = process.env.HOST || 0.0.0.0;
const PORT = process.env.PORT || 3000;
app.use(ctx => {
ctx.body = 'Hello Koa';
});
app.listen(HOST, PORT);

Yukarıda da belirttiğimiz gibi, Express ile Koa arasındaki önemli bir farkın callback kullanımından vazgeçmemizi sağladığını bahsetmiştik.

Hello World Örneği

Her bir framework’un çalışma mantığını iyice anlayabilmemiz adına ‘Hello World’ örneğine bakalım.

  • Bu örnek, ‘Hello World’ yanıtını veren Express sunucusu oluşturmanın sade bir örneği:
const express = require('express');
const app = express();
const HOST = process.env.HOST || 'localhost';
const PORT = process.env.PORT || 8080;
app.get('/api/v1', (req, res) => res.send('Hello World!'));app.listen(HOST, PORT,() =>
console.log(`Example app listening on port ${port}!`) );
  • Aşağıdaki örnek ‘Hello World’ yanıtını veren Hapi sunucusu oluşturmanın sade bir örneği:
'use strict';const Hapi = require('@hapi/hapi');// Port ve host adresine göre sunucu oluştur
const server = Hapi.servers({
host: process.env.HOST || 'localhost',
port: process.env.PORT || 8080
});
// yeni route ekle
server.route({
method:'GET',
path:'/api/v1',
handler:
function(request,h) {
return'hello world';
}
});
// Sunucuyu başlat
const start = async function() {
try {
await server.start();
} catch (err) {
console.log(err);
process.exit(1);
}
console.log('Server running at:', server.info.uri);
};
start();
  • Aşağıdaki örnek ‘Hello World’ yanıtını veren Koa sunucusu oluşturmanın sade bir örneği:
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(process.env.PORT || 8080);

Middleware

Node.js developerlar’ın alışkın oldukları en büyük temel kavramlardan biri de middleware’dir. Kısaca, middleware fonksiyonlar sunucuya gelen istek ve sunucudan geriye dönen cevap arasında işlem gören fonksiyonlardır.

Her bir framework’u kullanarak sunucuya istekte bulunma zamanını kaydeden örneği uygulayalım ve framework’ların çalışma mantığını beraber anlamaya çalışalım 👻.

Express

Middleware Express sunucusuna dahil etmek, app.use() fonksiyonunu kullanarak nesne içerisine eklemememiz yeterlidir, örneğin:

app.use((req, res, next) => {
console.log(`Time: ${Date.now()}`);
next();
})

Hapi

Middleware eklemek için onRequestuzantısından faydalanıyoruz, örn:

server.ext('onRequest', (request, h) => {
console.log(`Time: ${Date.now()}`);
return h.continue;
});

Koa

app.use(async (ctx, next) => {
console.log(`Time: ${Date.now()}`);
await next();
});

Performans

National system to track energy performance

Express kendi içerisine bilindik Node.js özelliklerini dahil ederek, temel bir web sunucu özelliklerinde var olması gereken bir katmanı oluşturur.

Express’in performansını arttırmak için takip edilmesi gereken best practice’ler şunlardır:

  • Gzip kullanımı ️️️🗜️ ️️
  • Senkron fonksiyonlar yerine, olabildiğince asenkron fonksiyon kullanımı
  • Loglama sürecinin doğru yönetimi (Örn: debugging (hata ayıklama) yapmak için debug, uygulama içi işlemlerin loglanması için ise winston veya bunyan modüllerinden faydalanılmalıdır)
  • Try-catch veya promise’lerden faydalanılması ve böylece ortaya çıkacak olan beklenmedik sonuçların doğru/düzgün bir şekilde ele alınması
  • Bir process manager (örn: pm2/forever) veya systemd/upstart gibi init sistemlerin birinden faydalanarak uygulamanızın otomatik bir şekilde yeniden başlatıldığından emin olunması
  • Sunucu’ya yapılan istekleri cache’leyerek sonradan gelecek aynı isteklerde tekrar tekrar işlemlerin gerçekleştirilmesinin önlenmesi (Nginx veya Varnish gibi caching sunucularından faydalanabilirsiniz)
  • Nginx veya HAProxy gibi load balancer’lerden faydalanılması (böylece birden fazla sunucu örneğini çalıştırmanıza ve sunucuya gelen trafiği parçalamanıza yardımcı olacaktır)
  • Sunucuya gelen isteklerde destekleyici niteliğinde işlemleri gerçekleştirmek için reverse proxy (örn: Nginx) kullanımı

Koa ile yüksek performansa sahip web sunucuları oluşturmanız mümkündür. Bunun öncelikli nedeni ise size callback kullanımından vazgeçmenize olanak sağlamasıdır. Error’lar ile daha hızlı baş edebilmenizi sağlayarak, kod yönetim sürecinizi kolaylaştırmaktadır.

--

--