Essa é uma grande pergunta e requer uma resposta longa para ser concluída; portanto, abordarei apenas um subconjunto das diferenças mais importantes. Desculpas por ainda ser uma resposta longa.
Como eles são semelhantes?
Você está absolutamente certo quando diz:
Para exemplos básicos, eles parecem semelhantes
Ambas as estruturas estão resolvendo o mesmo problema básico: Fornecer uma API conveniente para a construção de servidores HTTP no nó. Ou seja, mais conveniente do que usar o http
módulo nativo de nível inferior sozinho. O http
módulo pode fazer tudo o que queremos, mas é entediante escrever aplicativos.
Para conseguir isso, os dois usam conceitos que existem há muito tempo em estruturas da Web de alto nível: roteamento, manipuladores, plugins, módulos de autenticação. Eles podem nem sempre ter o mesmo nome, mas são aproximadamente equivalentes.
A maioria dos exemplos básicos se parece com isso:
- Crie uma rota
- Execute uma função quando a rota for solicitada, preparando a resposta
- Responder ao pedido
Expressar:
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);
});
}
});
A diferença não é exatamente inovadora aqui, certo? Então, por que escolher um sobre o outro?
Como eles são diferentes?
A resposta simples é que há muito mais e faz muito mais fora da caixa. Isso pode não ficar claro quando você olha apenas o exemplo simples de cima. De fato, isso é intencional. Os casos simples são mantidos simples. Então, vamos examinar algumas das grandes diferenças:
Filosofia
Express pretende ser muito mínimo. Ao fornecer uma pequena API com apenas uma fina camada de poeira http
, você ainda estará por conta própria em termos de adição de funcionalidade adicional. Se você quiser ler o corpo de uma solicitação recebida (uma tarefa bastante comum), precisará instalar um módulo separado . Se você espera que vários tipos de conteúdo sejam enviados para essa rota, também é necessário verificar o Content-type
cabeçalho para verificar qual é e analisá-lo adequadamente (dados do formulário vs JSON vs várias partes, por exemplo), geralmente usando módulos separados .
O hapi possui um rico conjunto de recursos, geralmente exposto por meio de opções de configuração, em vez de exigir que o código seja gravado. Por exemplo, se queremos garantir que um corpo de solicitação (carga útil) seja totalmente lido na memória e analisado adequadamente (automaticamente com base no tipo de conteúdo) antes da execução do manipulador, é apenas uma opção simples :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Recursos
Você só precisa comparar a documentação da API nos dois projetos para ver que o hapi oferece um conjunto maior de recursos.
O hapi inclui alguns dos seguintes recursos internos que o Express não inclui (tanto quanto eu sei):
Extensibilidade e modularidade
O hapi e o Express estudam a extensibilidade de uma maneira bem diferente. Com o Express, você tem funções de middleware . As funções de middleware são como filtros que você empilha e todas as solicitações são executadas antes de acessar seu manipulador.
O hapi possui o ciclo de vida da solicitação e oferece pontos de extensão , que são comparáveis às funções do middleware, mas existem vários pontos definidos no ciclo de vida da solicitação.
Uma das razões pelas quais o Walmart criou o hapi e parou de usar o Express foi uma frustração com a dificuldade de dividir um aplicativo Express em partes separadas, e fazer com que diferentes membros da equipe trabalhassem com segurança em seu bloco. Por esse motivo, eles criaram o sistema de plugins no hapi.
Um plug-in é como um sub-aplicativo, você pode fazer tudo o que puder em um aplicativo hapi, adicionar rotas, pontos de extensões etc. Em um plug-in, você pode ter certeza de que não está quebrando outra parte do aplicativo, porque a ordem de os registros de rotas não importam e você não pode criar rotas conflitantes. Você pode combinar esses plugins em um servidor e implantá-lo.
Ecossistema
Como o Express oferece muito pouco, você precisa olhar para fora quando precisar adicionar algo ao seu projeto. Muitas vezes, ao trabalhar com o hapi, o recurso que você precisa está embutido ou existe um módulo criado pela equipe principal.
Mínimo parece ótimo. Mas se você estiver criando um aplicativo de produção sério, as chances são de que você precisará de todas essas coisas eventualmente.
Segurança
O hapi foi projetado pela equipe do Walmart para administrar o tráfego da Black Friday, de modo que a segurança e a estabilidade sempre foram uma das principais preocupações. Por esse motivo, a estrutura faz muitas coisas extras, como limitar o tamanho da carga útil recebida para evitar o esgotamento da memória do processo. Ele também tem opções para coisas como atraso máximo do loop de eventos, memória RSS máxima usada e tamanho máximo do heap da v8, além do qual o servidor responderá com um tempo limite de 503 em vez de apenas travar.
Resumo
Avalie os dois você mesmo. Pense em suas necessidades e qual dos dois atende às suas maiores preocupações. Dê um mergulho nas duas comunidades (IRC, Gitter, Github), veja qual você prefere. Não aceite apenas minha palavra. E hacking feliz!
AVISO LEGAL: Sou tendencioso como autor de um livro sobre o hapi e o que foi exposto acima é em grande parte minha opinião pessoal.
Minha organização está indo com a Hapi. É por isso que gostamos.
Hapi é:
Se você quiser ouvir diretamente de Eran Hammer (líder de Hapi)
Começar com o Hapi não será tão fácil quanto o ExpressJs, porque o Hapi não tem o mesmo "poder estelar" ... mas, quando você se sentir confortável, terá MUITA milhagem. Demorei cerca de 2 meses como um novo hacker que usou ExpressJs de forma irresponsável por alguns anos. Se você é um desenvolvedor de back-end experiente, saberá ler os documentos e provavelmente nem perceberá isso.
Áreas em que a documentação do Hapi pode melhorar:
Eu acho que a autenticação seria a parte mais desafiadora, porque você precisa decidir qual tipo de estratégia de autenticação usar (autenticação básica, cookies, toques JWT, OAuth). Embora tecnicamente não seja problema da Hapi que o cenário de sessões / autenticação seja tão fragmentado ... mas eu desejo que eles tenham fornecido alguma ajuda para isso. Aumentaria bastante a felicidade do desenvolvedor.
Os dois restantes não são realmente tão difíceis, os documentos podem ser escritos um pouco melhor.
fonte
Fatos rápidos sobre o Hapi ou por que o Hapi JS?
O Hapi é centralizado na configuração. Possui autenticação e autorização incorporadas na estrutura. Foi lançado em uma atmosfera testada em batalha e realmente provou seu valor. Todos os módulos têm 100% de cobertura de teste. Registra o nível mais alto de abstração fora do HTTP principal. através da arquitetura do plugin
O Hapi é uma escolha melhor em termos de desempenho. O Hapi usa um mecanismo de roteamento diferente, que pode fazer pesquisas mais rápidas e levar em consideração o pedido de registro. No entanto, é bastante limitado quando comparado ao Express. E, graças ao sistema de plug-in Hapi, é possível isolar as diferentes facetas e serviços que ajudariam o aplicativo de várias maneiras no futuro.
Uso
Hapi é a estrutura mais preferida quando comparada ao Express. O Hapi é usado principalmente para aplicativos corporativos em larga escala.
Algumas razões pelas quais os desenvolvedores não escolhem o Express ao criar aplicativos corporativos são:
As rotas são mais difíceis de compor no Express
O middleware atrapalha a maior parte do tempo; toda vez que você definir as rotas, precisará escrever o maior número de códigos.
O Hapi seria a melhor opção para um desenvolvedor que deseja criar uma API RESTful. O Hapi possui arquitetura de microsserviço e também é possível transferir o controle de um manipulador para outro com base em determinados parâmetros. Com o plug-in Hapi, você pode desfrutar de um nível maior de abstração em torno do HTTP porque pode dividir a lógica de negócios em partes facilmente gerenciáveis.
Outra grande vantagem do Hapi é que ele fornece mensagens de erro detalhadas quando você configura incorretamente. O Hapi também permite que você configure o tamanho do upload do arquivo por padrão. Se o tamanho máximo de upload for limitado, você poderá enviar uma mensagem de erro ao usuário informando que o tamanho do arquivo é muito grande. Isso protegeria seu servidor contra falhas, porque os uploads de arquivos não tentarão mais armazenar em buffer um arquivo inteiro.
Tudo o que você pode conseguir usando o express também pode ser facilmente alcançado usando hapi.js.
O Hapi.js é muito estiloso e organiza muito bem o código. Se você ver como ele faz o roteamento e coloca a lógica principal nos controladores, certamente vai adorar.
O Hapi.js fornece oficialmente vários plugins exclusivamente para os intervalos do hapi.js. de autenticação baseada em token a gerenciamento de sessões e muito mais, que é um anúncio. Isso não significa que o npm tradicional não possa ser usado, todos eles são suportados pelo hapi.js
Se você codificar em hapi.js, um código seria muito sustentável.
fonte
Comecei a usar o Hapi recentemente e estou muito feliz com isso. Minhas razões são
Mais fácil de testar. Por exemplo:
server.inject
permite que você execute o aplicativo e obtenha uma resposta sem executá-lo e ouvi-lo.server.info
dá a uri atual, porta etc.server.settings
acessa a configuração, por exemplo,server.settings.cache
obtém o provedor de cache atual/test
pastas qualquer parte do aplicativo ou plug-ins suportados para ver sugestões de como simular / testar / stub etc.Funciona imediatamente , por exemplo , uploads de arquivos , fluxos de retorno de terminais etc.
Os plug-ins essenciais são mantidos junto com a biblioteca principal. por exemplo , análise de modelo , armazenamento em cache etc. O benefício adicional é o mesmo padrão de codificação aplicado nos itens essenciais.
Erros sãos e manipulação de erros. O Hapi valida as opções de configuração e mantém uma tabela de rotas interna para evitar rotas duplicadas. Isso é bastante útil durante o aprendizado, porque erros são gerados mais cedo, em vez de comportamentos inesperados, que exigem depuração.
fonte
Apenas mais um ponto a acrescentar: a Hapi começou a suportar chamadas 'http2' da versão 16 em diante (se não estiver errado). No entanto, o Express ainda não suporta o módulo 'http2' diretamente até o Express 4. Embora eles tenham lançado o recurso na versão alfa do Express 5.
fonte
fonte
fonte