Esta es una gran pregunta y requiere una respuesta larga para ser completa, por lo que solo abordaré un subconjunto de las diferencias más importantes. Disculpas porque todavía es una respuesta larga.
¿En qué se parecen?
Tienes toda la razón cuando dices:
Para ejemplos básicos parecen similares
Ambos marcos resuelven el mismo problema básico: proporcionar una API conveniente para construir servidores HTTP en el nodo. Es decir, más conveniente que usar http
solo el módulo nativo de nivel inferior . El http
módulo puede hacer todo lo que queramos, pero es tedioso escribir aplicaciones.
Para lograr esto, ambos utilizan conceptos que han existido en marcos web de alto nivel durante mucho tiempo: enrutamiento, controladores, complementos, módulos de autenticación. Puede que no siempre hayan tenido los mismos nombres, pero son más o menos equivalentes.
La mayoría de los ejemplos básicos se parecen a esto:
- Crea una ruta
- Ejecute una función cuando se solicite la ruta, preparando la respuesta
- Responder a la solicitud
Rápido:
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 diferencia no es exactamente innovadora aquí ¿verdad? Entonces, ¿por qué elegir uno sobre el otro?
¿En qué se diferencian?
La respuesta simple es hapi es mucho más y hace mucho más fuera de la caja. Eso podría no estar claro cuando solo mira el ejemplo simple de arriba. De hecho, esto es intencional. Los casos simples se mantienen simples. Así que examinemos algunas de las grandes diferencias:
Filosofía
Express pretende ser muy mínimo. Al darle una pequeña API con solo una fina capa de polvo encima http
, todavía está muy solo en términos de agregar funcionalidad adicional. Si desea leer el cuerpo de una solicitud entrante (una tarea bastante común), debe instalar un módulo separado . Si espera que se envíen varios tipos de contenido a esa ruta, también debe verificar el Content-type
encabezado para verificar cuál es y analizarlo en consecuencia (datos de formulario vs JSON vs multiparte, por ejemplo), a menudo utilizando módulos separados .
hapi tiene un rico conjunto de características, a menudo expuesto a través de opciones de configuración, en lugar de requerir que se escriba código. Por ejemplo, si queremos asegurarnos de que el cuerpo de una solicitud (carga útil) se lea completamente en la memoria y se analice de manera adecuada (automáticamente según el tipo de contenido) antes de ejecutar el controlador, es solo una opción simple :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Caracteristicas
Solo necesita comparar la documentación de la API en ambos proyectos para ver que hapi ofrece un conjunto de características más grande.
hapi incluye algunas de las siguientes características integradas que Express no incluye (que yo sepa):
Extensibilidad y modularidad.
hapi y Express abordan la extensibilidad de una manera muy diferente. Con Express, tiene funciones de middleware . Las funciones de middleware son como filtros que apila y todas las solicitudes se ejecutan antes de llegar a su controlador.
hapi tiene el ciclo de vida de la solicitud y ofrece puntos de extensión , que son comparables a las funciones de middleware pero existen varios puntos definidos en el ciclo de vida de la solicitud.
Una de las razones por las que Walmart construyó hapi y dejó de usar Express fue la frustración con lo difícil que era dividir una aplicación Express en partes separadas, y hacer que diferentes miembros del equipo trabajen de manera segura en su parte. Por esta razón, crearon el sistema de complementos en hapi.
Un complemento es como una sub-aplicación, puedes hacer todo lo que puedas en una aplicación hapi, agregar rutas, puntos de extensión, etc. En un complemento puedes estar seguro de que no estás rompiendo otra parte de la aplicación, porque el orden de los registros para rutas no importan y no puede crear rutas conflictivas. Luego puede combinar estos complementos en un servidor e implementarlo.
Ecosistema
Debido a que Express le brinda tan poco de forma inmediata, debe mirar hacia afuera cuando necesita agregar algo a su proyecto. Muchas veces cuando trabajas con hapi, la función que necesitas está integrada o hay un módulo creado por el equipo central.
Minimal suena genial. Pero si está creando una aplicación de producción seria, es probable que eventualmente necesite todo esto.
Seguridad
hapi fue diseñado por el equipo de Walmart para ejecutar el tráfico del Black Friday, por lo que la seguridad y la estabilidad siempre han sido una de las principales preocupaciones. Por esta razón, el marco hace muchas cosas adicionales, como limitar el tamaño de la carga útil entrante para evitar agotar la memoria de su proceso. También tiene opciones para cosas como el retraso máximo del bucle de eventos, la memoria RSS máxima utilizada y el tamaño máximo del montón v8, más allá del cual su servidor responderá con un tiempo de espera 503 en lugar de simplemente fallar.
Resumen
Evalúalos a ambos tú mismo. Piense en sus necesidades y cuál de las dos aborda sus mayores preocupaciones. Date un chapuzón en las dos comunidades (IRC, Gitter, Github), mira cuál prefieres. No solo tomes mi palabra. ¡Y feliz pirateo!
DESCARGO DE RESPONSABILIDAD: Soy parcial como autor de un libro sobre hapi y lo anterior es en gran parte mi opinión personal.