Questa è una grande domanda e richiede una lunga risposta per essere completa, quindi affronterò solo un sottoinsieme delle differenze più importanti. Chiedo scusa che sia ancora una risposta lunga.
Come sono simili?
Hai perfettamente ragione quando dici:
Per esempi di base sembrano simili
Entrambi i framework stanno risolvendo lo stesso problema di base: fornire un'API conveniente per la creazione di server HTTP nel nodo. Vale a dire, più conveniente rispetto all'utilizzo del http
solo modulo nativo di livello inferiore . Il http
modulo può fare tutto ciò che vogliamo, ma è noioso scrivere applicazioni.
Per raggiungere questo obiettivo, entrambi utilizzano concetti che sono presenti da tempo in framework Web di alto livello: routing, gestori, plug-in, moduli di autenticazione. Potrebbero non avere sempre avuto gli stessi nomi ma sono approssimativamente equivalenti.
La maggior parte degli esempi di base è simile a questa:
- Crea un percorso
- Esegui una funzione quando viene richiesto il percorso, preparando la risposta
- Rispondi alla richiesta
Esprimere:
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);
});
}
});
La differenza non è esattamente rivoluzionaria qui, giusto? Quindi perché scegliere uno sopra l'altro?
Come sono differenti?
La semplice risposta è che hapi è molto di più e fa molto di più immediatamente. Ciò potrebbe non essere chiaro se guardi il semplice esempio dall'alto. In realtà, questo è intenzionale. I casi semplici sono mantenuti semplici. Esaminiamo quindi alcune delle grandi differenze:
Filosofia
Express è pensato per essere molto minimale. Dandoti una piccola API con solo una leggera spolverata in cima http
, sei ancora molto da solo in termini di aggiunta di funzionalità aggiuntive. Se vuoi leggere il corpo di una richiesta in arrivo (un'attività abbastanza comune), devi installare un modulo separato . Se stai aspettando che vari tipi di contenuto vengano inviati a quella route, devi anche controllare l' Content-type
intestazione per verificare quale sia e analizzarla di conseguenza (form-data vs JSON vs multi-part per esempio), spesso usando moduli separati .
hapi ha un ricco set di funzionalità, spesso esposto attraverso opzioni di configurazione, piuttosto che richiedere la scrittura di codice. Ad esempio, se vogliamo assicurarci che un corpo di richiesta (payload) sia completamente letto in memoria e adeguatamente analizzato (basato automaticamente sul tipo di contenuto) prima dell'esecuzione del gestore, è solo una semplice opzione :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Caratteristiche
Devi solo confrontare la documentazione API su entrambi i progetti per vedere che hapi offre un set di funzionalità più ampio.
hapi include alcune delle seguenti funzionalità integrate che Express non (per quanto ne so):
Estensibilità e modularità
hapi ed Express affrontano l'estensibilità in un modo completamente diverso. Con Express hai le funzioni del middleware . Le funzioni del middleware sono un po 'come i filtri che accumuli e tutte le richieste vengono eseguite prima di colpire il gestore.
hapi ha il ciclo di vita della richiesta e offre punti di estensione , che sono paragonabili alle funzioni del middleware ma esistono diversi punti definiti nel ciclo di vita della richiesta.
Uno dei motivi per cui Walmart ha creato hapi e ha smesso di usare Express è stata una frustrazione per quanto fosse difficile dividere un'app Express in parti separate e far sì che diversi membri del team lavorassero in sicurezza sul loro pezzo. Per questo motivo hanno creato il sistema di plugin in hapi.
Un plug-in è come un'applicazione secondaria, puoi fare tutto il possibile in un'app hapi, aggiungere percorsi, punti di estensione ecc. In un plug-in puoi essere sicuro di non interrompere un'altra parte dell'applicazione, perché l'ordine di le registrazioni per le rotte non contano e non è possibile creare rotte in conflitto. È quindi possibile combinare questi plugin in un server e distribuirlo.
Ecosistema
Poiché Express ti offre così poco fuori dagli schemi, devi guardare fuori quando devi aggiungere qualcosa al tuo progetto. Molte volte quando si lavora con hapi, la funzione di cui hai bisogno è integrata o c'è un modulo creato dal team principale.
Il minimo suona alla grande. Ma se stai costruendo un'app di produzione seria, è probabile che alla fine avrai bisogno di tutte queste cose.
Sicurezza
hapi è stato progettato dal team di Walmart per gestire il traffico del Black Friday, quindi la sicurezza e la stabilità sono sempre state al primo posto. Per questo motivo il framework fa molte cose in più come limitare le dimensioni del payload in entrata per evitare di esaurire la memoria del processo. Ha anche opzioni per cose come il ritardo massimo del loop di eventi, la memoria RSS massima utilizzata e la dimensione massima dell'heap v8, oltre la quale il tuo server risponderà con un timeout 503 anziché semplicemente arrestarsi in modo anomalo.
Sommario
Valutali entrambi da soli. Pensa ai tuoi bisogni e quale dei due risponde alle tue maggiori preoccupazioni. Fai un tuffo nelle due comunità (IRC, Gitter, Github), vedi quale preferisci. Non limitarti a prendere la mia parola. E buon hacking!
DISCLAIMER: Sono di parte come autore di un libro su hapi e quanto sopra è in gran parte la mia opinione personale.