Ini adalah pertanyaan besar dan membutuhkan jawaban panjang untuk lengkap, jadi saya hanya akan membahas subset dari perbedaan yang paling penting. Mohon maaf bahwa itu masih merupakan jawaban yang panjang.
Bagaimana mereka serupa?
Anda benar ketika mengatakan:
Sebagai contoh dasar, mereka tampak serupa
Kedua kerangka kerja memecahkan masalah dasar yang sama: Menyediakan API yang nyaman untuk membangun server HTTP di node. Dengan kata lain, lebih nyaman daripada menggunakan http
modul asli level bawah saja. The http
modul dapat melakukan segala yang kami inginkan tapi itu membosankan untuk menulis aplikasi dengan.
Untuk mencapai hal ini, mereka berdua menggunakan konsep yang telah ada dalam kerangka kerja web tingkat tinggi untuk waktu yang lama: perutean, penangan, plugin, modul otentikasi. Mereka mungkin tidak selalu memiliki nama yang sama tetapi mereka kira-kira setara.
Sebagian besar contoh dasar terlihat seperti ini:
- Buat rute
- Jalankan fungsi ketika rute diminta, menyiapkan respons
- Tanggapi permintaan itu
Mengekspresikan:
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);
});
}
});
Perbedaannya bukan di sini, bukan? Jadi mengapa memilih satu dari yang lain?
Bagaimana mereka berbeda?
Jawaban sederhananya adalah hapi jauh lebih banyak dan memang lebih banyak di luar kotak. Itu mungkin tidak jelas ketika Anda hanya melihat contoh sederhana dari atas. Sebenarnya, ini disengaja. Kasing sederhana dibuat sederhana. Jadi mari kita periksa beberapa perbedaan besar:
Filsafat
Express dimaksudkan sangat minim. Dengan memberi Anda API kecil dengan hanya sedikit debu di atasnya http
, Anda masih sangat mandiri dalam hal menambahkan fungsionalitas tambahan. Jika Anda ingin membaca isi permintaan yang masuk (tugas yang cukup umum), Anda perlu menginstal modul terpisah . Jika Anda mengharapkan berbagai tipe konten untuk dikirim ke rute itu, Anda juga perlu memeriksa Content-type
tajuk untuk memeriksa yang mana dan menguraikannya sesuai (misalnya, formulir-data vs JSON vs multi-bagian), sering menggunakan modul terpisah .
hapi memiliki serangkaian fitur yang kaya, sering diekspos melalui opsi konfigurasi, daripada membutuhkan kode untuk ditulis. Misalnya, jika kami ingin memastikan bahwa badan permintaan (payload) sepenuhnya terbaca ke dalam memori dan diuraikan dengan tepat (secara otomatis berdasarkan pada tipe konten) sebelum pawang dijalankan, itu hanya opsi sederhana :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
fitur
Anda hanya perlu membandingkan dokumentasi API pada kedua proyek untuk melihat bahwa hapi menawarkan serangkaian fitur yang lebih besar.
hapi mencakup beberapa fitur berikut yang tidak dimiliki Express (sejauh yang saya tahu):
Ekstensibilitas & modularitas
hapi dan Express melakukan ekstensibilitas dengan cara yang sangat berbeda. Dengan Express, Anda memiliki fungsi middleware . Fungsi-fungsi Middleware adalah semacam filter yang Anda susun dan semua permintaan menjalankannya sebelum mengenai handler Anda.
hapi memiliki siklus hidup permintaan dan menawarkan titik ekstensi , yang sebanding dengan fungsi middleware tetapi ada beberapa titik yang ditentukan dalam siklus hidup permintaan.
Salah satu alasan Walmart membuat hapi dan berhenti menggunakan Express adalah frustrasi dengan betapa sulitnya memecah aplikasi Express menjadi bagian-bagian yang terpisah, dan meminta anggota tim yang berbeda untuk bekerja dengan aman di chunk mereka. Untuk alasan ini mereka menciptakan sistem plugin di hapi.
Plugin seperti sub-aplikasi, Anda dapat melakukan semua yang Anda bisa dalam aplikasi hapi, menambahkan rute, ekstensi poin dll. Dalam sebuah plugin Anda dapat yakin bahwa Anda tidak melanggar bagian lain dari aplikasi, karena urutan pendaftaran untuk rute tidak masalah dan Anda tidak dapat membuat rute yang bertentangan. Anda kemudian dapat menggabungkan plugin ini ke server dan menyebarkannya.
Ekosistem
Karena Express memberi Anda begitu sedikit di luar kotak, Anda perlu melihat ke luar ketika Anda perlu menambahkan sesuatu ke proyek Anda. Sering kali ketika bekerja dengan hapi, fitur yang Anda butuhkan adalah built-in atau ada modul yang dibuat oleh tim inti.
Minimal terdengar hebat. Tetapi jika Anda membangun aplikasi produksi yang serius, kemungkinan Anda akan membutuhkan semua ini pada akhirnya.
Keamanan
hapi dirancang oleh tim di Walmart untuk menjalankan lalu lintas Black Friday sehingga keamanan dan stabilitas selalu menjadi perhatian utama. Untuk alasan ini kerangka kerja melakukan banyak hal ekstra seperti membatasi ukuran muatan masuk untuk mencegah melelahkan memori proses Anda. Ia juga memiliki opsi untuk hal-hal seperti penundaan loop acara maks, memori RSS maksimum yang digunakan dan ukuran maksimum tumpukan v8, di luar itu server Anda akan merespons dengan batas waktu 503 alih-alih hanya mogok.
Ringkasan
Evaluasilah mereka berdua sendiri. Pikirkan tentang kebutuhan Anda dan manakah di antara keduanya yang menangani masalah terbesar Anda. Berenanglah di dua komunitas (IRC, Gitter, Github), lihat yang Anda inginkan. Jangan hanya menerima kata-kata saya. Dan selamat melakukan peretasan!
PENOLAKAN: Saya bias sebagai penulis buku tentang hapi dan di atas sebagian besar adalah pendapat pribadi saya.