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.
Organisasi saya pergi dengan Hapi. Inilah sebabnya kami menyukainya.
Hapi adalah:
Jika Anda ingin mendengar langsung dari Eran Hammer (lead Hapi)
Memulai dengan Hapi tidak akan semudah ExpressJs karena Hapi tidak memiliki "kekuatan bintang" yang sama ... tetapi begitu Anda merasa nyaman, Anda akan mendapatkan BANYAK jarak tempuh. Butuh waktu sekitar 2 bulan sebagai peretas baru yang secara tidak bertanggung jawab menggunakan ExpressJ selama beberapa tahun. Jika Anda seorang pengembang backend berpengalaman Anda akan tahu cara membaca dokumen, dan Anda mungkin tidak akan menyadarinya.
Area yang dapat diperbaiki oleh dokumentasi Hapi:
Saya pikir otentikasi akan menjadi bagian yang paling menantang karena Anda harus memutuskan strategi auth apa yang digunakan (Otentikasi Dasar, Cookie, JWT Tokens, OAuth). Meskipun secara teknis bukan masalah Hapi bahwa lanskap sesi / otentikasi begitu terfragmentasi ... tapi saya berharap mereka menyediakan beberapa pegangan untuk ini. Itu akan sangat meningkatkan kebahagiaan pengembang.
Dua yang tersisa sebenarnya tidak terlalu sulit, dokumen hanya bisa ditulis sedikit lebih baik.
sumber
Fakta Singkat tentang Hapi Atau Mengapa Hapi JS?
Hapi adalah konfigurasi-sentris. Ini memiliki otentikasi dan otorisasi yang dibangun ke dalam kerangka kerja. Dilepaskan dalam suasana yang telah teruji perang dan telah benar-benar membuktikan nilainya. Semua modul memiliki cakupan uji 100%. Ia mencatat abstraksi tingkat tertinggi jauh dari inti HTTP. Mudah dikompilasi. melalui arsitektur plugin
Hapi adalah pilihan kinerja yang lebih baik karena Hapi menggunakan mekanisme routing yang berbeda, yang dapat melakukan pencarian lebih cepat, dan mempertimbangkan urutan pendaftaran. Namun demikian, itu sangat terbatas jika dibandingkan dengan Express. Dan berkat sistem plugin Hapi, dimungkinkan untuk mengisolasi berbagai aspek dan layanan yang akan membantu aplikasi dalam banyak cara di masa depan.
Pemakaian
Hapi adalah kerangka kerja yang paling disukai jika dibandingkan dengan Express. Hapi digunakan terutama untuk aplikasi perusahaan skala besar.
Beberapa alasan mengapa pengembang tidak memilih Express saat membuat aplikasi perusahaan adalah:
Rute lebih sulit dibuat di Express
Middleware menghalangi sebagian besar waktu; setiap kali Anda menentukan rute, Anda harus menulis sebanyak mungkin kode.
Hapi akan menjadi pilihan terbaik bagi pengembang yang ingin membangun API RESTful. Hapi memiliki arsitektur layanan-mikro dan juga dimungkinkan untuk mentransfer kontrol dari satu handler ke handler lain berdasarkan parameter tertentu. Dengan plugin Hapi, Anda dapat menikmati tingkat abstraksi yang lebih besar di sekitar HTTP karena Anda dapat membagi logika bisnis menjadi beberapa bagian yang mudah dikelola.
Keuntungan besar lainnya dengan Hapi adalah menyediakan pesan kesalahan terperinci saat Anda salah konfigurasi. Hapi juga memungkinkan Anda mengkonfigurasi ukuran unggahan file Anda secara default. Jika ukuran unggahan maksimum terbatas, Anda dapat mengirim pesan kesalahan kepada pengguna yang menyampaikan bahwa ukuran file terlalu besar. Ini akan melindungi server Anda dari crash karena file unggahan tidak akan lagi mencoba untuk buffer seluruh file.
Apa pun yang dapat Anda capai menggunakan express juga dapat dengan mudah dicapai menggunakan hapi.js.
Hapi.js sangat bergaya dan mengatur kode dengan sangat baik. Jika Anda melihat bagaimana ia melakukan perutean dan menempatkan logika inti dalam pengontrol, Anda pasti akan menyukainya.
Hapi.js secara resmi menyediakan beberapa plugin khusus untuk hapi.js mulai dari autent berbasis token hingga manajemen sesi dan banyak lagi, yang merupakan iklan. Itu tidak berarti npm tradisional tidak dapat digunakan, semuanya didukung oleh hapi.js
Jika Anda kode di hapi.js, kode akan sangat mudah dikelola.
sumber
Saya sudah mulai menggunakan Hapi baru-baru ini dan saya cukup senang dengannya. Alasan saya adalah
Lebih mudah untuk diuji. Sebagai contoh:
server.inject
memungkinkan Anda untuk menjalankan aplikasi dan mendapatkan respons tanpa menjalankan dan mendengarkan.server.info
memberikan uri saat ini, port dll.server.settings
mengakses konfigurasi mis.server.settings.cache
dapatkan penyedia cache saat ini/test
folder untuk bagian mana pun dari aplikasi atau plugin yang didukung untuk melihat saran tentang cara mengejek / menguji / rintisan dll.Ini berfungsi di luar kotak mis . Unggahan file , kembalikan aliran dari titik akhir dll.
Plugin penting dipertahankan bersama dengan perpustakaan inti. misal penguraian template , caching dll. Manfaat tambahannya adalah standar pengkodean yang sama diterapkan pada hal-hal penting.
Kesalahan dan penanganan kesalahan waras. Hapi memvalidasi opsi konfigurasi dan menyimpan tabel rute internal untuk mencegah duplikat rute. Ini cukup berguna saat belajar karena kesalahan dilempar lebih awal daripada perilaku tak terduga yang memerlukan debugging.
sumber
Hanya hal lain untuk ditambahkan, Hapi telah mulai mendukung panggilan 'http2' dari versi 16 dan seterusnya (jika saya tidak salah). Namun, express belum mendukung modul 'http2' secara langsung hingga express 4. Meskipun mereka telah merilis fitur dalam versi alpha express 5.
sumber
sumber