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.
Mi organización se va con Hapi. Por eso nos gusta.
Hapi es:
Si quieres escuchar directamente de Eran Hammer (el líder de Hapi)
Comenzar a usar Hapi no será tan fácil como ExpressJs porque Hapi no tiene el mismo "poder estelar" ... pero una vez que te sientas cómodo obtendrás MUCHO kilometraje. Me tomó alrededor de ~ 2 meses como un nuevo hacker que irresponsablemente usó ExpressJs durante algunos años. Si eres un desarrollador experimentado de backend, sabrás cómo leer los documentos, y probablemente ni siquiera te des cuenta.
Áreas en las que la documentación de Hapi puede mejorar:
Creo que la autenticación sería la parte más desafiante porque tienes que decidir qué tipo de estrategia de autenticación usar (autenticación básica, cookies, tokens JWT, OAuth). Aunque técnicamente no es un problema de Hapi que el panorama de sesiones / autenticación esté tan fragmentado ... pero desearía que proporcionaran algo de ayuda para esto. Aumentaría enormemente la felicidad del desarrollador.
Los dos restantes no son realmente tan difíciles, los documentos podrían escribirse un poco mejor.
fuente
Datos breves sobre Hapi o ¿Por qué Hapi JS?
Hapi se centra en la configuración. Tiene autenticación y autorización integradas en el marco. Fue lanzado en una atmósfera probada en batalla y realmente ha demostrado su valía. Todos los módulos tienen una cobertura de prueba del 100%. Registra el nivel más alto de abstracción lejos del núcleo HTTP. Fácilmente comparable a través de la arquitectura del complemento
Hapi es una mejor opción en cuanto al rendimiento Hapi utiliza un mecanismo de enrutamiento diferente, que puede realizar búsquedas más rápidas y tener en cuenta el orden de registro. Sin embargo, es bastante limitado en comparación con Express. Y gracias al sistema de complementos Hapi, es posible aislar las diferentes facetas y servicios que ayudarían a la aplicación de muchas maneras en el futuro.
Uso
Hapi es el marco más preferido en comparación con Express. Hapi se utiliza principalmente para aplicaciones empresariales a gran escala.
Algunas razones por las que los desarrolladores no eligen Express al crear aplicaciones empresariales son:
Las rutas son más difíciles de componer en Express
El middleware se interpone en el camino la mayor parte del tiempo; cada vez que defina las rutas, debe escribir tantos números de códigos.
Hapi sería la mejor opción para un desarrollador que busca construir API RESTful. Hapi tiene una arquitectura de microservicio y también es posible transferir el control de un controlador a otro en función de ciertos parámetros. Con el complemento Hapi, puede disfrutar de un mayor nivel de abstracción en torno a HTTP porque puede dividir la lógica empresarial en partes fácilmente manejables.
Otra gran ventaja de Hapi es que proporciona mensajes de error detallados cuando configura incorrectamente. Hapi también le permite configurar el tamaño de carga de su archivo de forma predeterminada. Si el tamaño máximo de carga es limitado, puede enviar un mensaje de error al usuario indicando que el tamaño del archivo es demasiado grande. Esto protegería su servidor de fallas porque las cargas de archivos ya no intentarán almacenar un archivo completo en el búfer.
Lo que pueda lograr con express también se puede lograr fácilmente con hapi.js.
Hapi.js es muy elegante y organiza muy bien el código. Si ve cómo funciona el enrutamiento y coloca la lógica central en los controladores, definitivamente le encantará.
Hapi.js proporciona oficialmente varios complementos exclusivamente para rangos de hapi.js, desde autenticación basada en token hasta gestión de sesión y muchos más, que es un anuncio. No significa que no se pueda usar el npm tradicional, todos son compatibles con hapi.js
Si codifica en hapi.js, un código sería muy fácil de mantener.
fuente
Recientemente comencé a usar Hapi y estoy bastante contento con él. Mis razones son
Más fácil de probar. Por ejemplo:
server.inject
le permite ejecutar la aplicación y obtener una respuesta sin que se ejecute y escuche.server.info
da el uri actual, puerto, etc.server.settings
accede a la configuración, por ejemplo,server.settings.cache
obtiene el proveedor de caché actual/test
carpetas de cualquier parte de la aplicación o complementos compatibles para ver sugerencias sobre cómo simular / probar / stub, etc.Funciona fuera de la caja, por ejemplo , cargas de archivos , flujos de retorno desde puntos finales, etc.
Los complementos esenciales se mantienen junto con la biblioteca principal. por ejemplo , análisis de plantillas , almacenamiento en caché , etc. El beneficio adicional es que los mismos estándares de codificación se aplican en todas las cosas esenciales.
Errores sanos y manejo de errores. Hapi valida las opciones de configuración y mantiene una tabla de rutas interna para evitar rutas duplicadas. Esto es bastante útil durante el aprendizaje porque los errores se lanzan temprano en lugar de comportamientos inesperados que requieren depuración.
fuente
Solo otro punto para agregar, Hapi ha comenzado a admitir llamadas 'http2' desde la versión 16 en adelante (si no me equivoco). Sin embargo, express aún no admite el módulo 'http2' directamente hasta express 4. Aunque han lanzado la función en la versión alfa de express 5.
fuente
fuente