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.