Neste guia, vamos comparar uma das estruturas mais comumente usadas para construir aplicativos da web com Node.js, Express.js, com tinyhttp, um de seus alternativas mais populares.

Aqui está o que vamos cobrir:

O que é tinyhttp?

tinyhttp é uma estrutura da web moderna semelhante ao Express.js que é escrito em TypeScript. Ele usa uma quantidade mínima de dependências em comparação com Express.js, o que o torna muito rápido.

O tinyhttp oferece roteamento, extensões req/res e muito mais, enquanto depende de apenas seis módulos-quatro dos quais são do próprio tinyhttp.

Todo o middleware criado para Express.js funciona perfeitamente com tinyhttp. Confira esta integração tinyhttp + Express/GraphQL para um exemplo de como usar o middleware Express.js com tinyhttp.

tinyhttp também suporta async/await para rotas, o que não é o caso em Express.js. Existem tipificações adequadas e um verificador de função dentro do tinyhttp, que resolve funções assíncronas. Em outras palavras, tanto a sincronização quanto a assíncrona funcionam bem no tinyhttp. Confira estes async e MongoDB exemplos para ver como fazer manipuladores assíncronos.

Aqui está uma pequena lista dos recursos mais importantes do tinyhttp, de acordo com o oficial docs :

  • 2,5x mais rápido que o Express
  • Suporte completo para middleware Express
  • Suporte a middleware assíncrono
  • Suporte nativo a ESM e CommonJS
  • Sem dependências legadas, apenas o próprio JavaScript
  • Tipos prontos para uso
  • Sem suporte de middleware integrado

O que é Express.js?

Express.js é uma estrutura Node.js flexível que fornece um conjunto robusto de recursos para aplicativos da web e móveis. Criar APIs robustas é muito fácil porque Express.js vem com muito middleware e outro suporte integrado.

Express.js não vem com um banco de dados; isso é deixado para módulos de terceiros, o que permite a interface com quase qualquer banco de dados. Express.js oferece suporte a uma infinidade de mecanismos de modelo que acompanham a assinatura (caminho, locais, retorno de chamada) .

Esta estrutura é construída de forma a atuar como uma estrutura de aplicativo da web Node.js mínima e flexível, fornecendo um conjunto robusto de recursos para a construção de aplicativos da web simples, de várias páginas e híbridos.

Alguns recursos do Express.js:

  • Suporte da comunidade de código aberto
  • Desenvolvimento rápido de aplicativos
  • Fácil de aprender
  • Suporte ao mecanismo de modelo
  • Manuseio de E/S
  • Suporte de middleware integrado

tinyhttp x Express.js: uma comparação básica

Para uma comparação de alto nível de tinyhttp e Express v4, vamos dar uma olhada na versão Node.js mínima compatível, versão ECMAScript, cobertura de teste, etc.:

<”tinyhttp express v4
Versão Node.js mínima com suporte 12.4.0 0.10.0
Versão ECMAScript mínima com suporte ES2019 ES5 (?)
req / res extensions ✔ ✔
Cobertura de teste 92% 100%
Compilado para ESM nativo ✔ ✖
Suporte TypeScript ✔ ✖
Tamanho do pacote (apenas núcleo) 35,2 kB 208 kB
Middleware integrado ✖ ✔

Algumas notas na tabela acima:

  • A versão mínima do Node.js necessária para que tinyhttp funcione é 12.4.0, enquanto com Express v4, podemos começar a trabalhar até mesmo com Node.js 0.10.0
  • A versão mínima com suporte para tinyhttp é ES2019 (ES10), enquanto no Express v4, precisamos ES5
  • req é um objeto que contém informações sobre a solicitação HTTP que gerou o evento. Em resposta ao req , você usa res para enviar de volta a resposta HTTP desejada. Tanto tinyhttp quanto express v4 suportam extensões req / res
  • A cobertura do teste para a base de código é de 92 por cento para tinyhttp e 100 por cento para Express.js v4
  • A especificação ESM (EcmaScript Modules) introduzida com a norma ES6 (ou ES2015) descreve como importar e exportar módulos em JavaScript. Podemos usar ESM nativamente com tinyhttp, mas precisamos de suporte externo, como Babel , para Express.js
  • Ao contrário de Express.js, tinyhttp vem com suporte TypeScript
  • O tamanho do pacote principal de tinyhttp é 35,2 kB, em comparação com 208 kB para Express.js
  • tinyhttp não vem com middleware integrado. Express.js tem middleware integrado

Comparativo de desempenho

Com o básico fora do caminho, vamos olhar para um relatório de desempenho usando a ferramenta fastify de comparação Aqui, usamos parâmetros como req/s, transferência/s e latência para medir o desempenho de ambas as estruturas.

Abaixo estão algumas notas sobre o hardware, sistema e condições usadas para este benchmark.

  • Hardware :
    • Xiaomi Pro 2019 Edition (laptop)
    • CPU: Intel Core i7-8550U
    • RAM: 16 GB
  • Sistema:
    • kernel: 5.7.19-2
    • nó: 15,5
  • Condições :
    • 100 conexões
    • 10 pipelines
    • duração de 40s
<”req/s <”transfer/sec <”latência
@ tinyhttp/app (sem extensões) 24575 3,81 MB 3,37 ms
@ tinyhttp/app (esm) 22820 3,54 MB 4,04 ms
@ tinyhttp/app (cjs) 22637 3,51 MB 4,08 ms
[email protected] 12986 2 MB 7,11 ms

req/s é o número de solicitações por segundo. Latência refere-se ao atraso entre a ação de um usuário e a resposta de um aplicativo da web a essa ação, também conhecido como tempo total de ida e volta.

Na tabela acima, podemos ver que tinyhttp é capaz de fazer mais transferências por segundo com menor latência do que Express.js v4

Observação : os benchmarks não são totalmente precisos e podem ser diferentes em cada corrida e em cada máquina. A chave é comparar proporções em vez de valores absolutos.

Para concluir nosso benchmark de desempenho, tinyhttp (sem extensões req / res extras) é cerca de 1,9 vezes mais rápido do que Express.js.

tinyhttp e Express.js em ação: um exemplo simples

Agora é hora de construir um aplicativo de exemplo simples para que possamos ver tinyhttp e Express.js em ação lado a lado.

Você pode usar qualquer gerenciador de pacotes para instalar o tinyhttp e o Express. Usarei npm para demonstração.

Para instalar o tinyhttp:

 npm i @ tinyhttp/app

Para instalar Express.js:

 npm install express

‘Olá, mundo’

Express.js e tinyhttp app são estruturados de forma bastante semelhante. Se você conhece Express.js, também conhece tinyhttp.

tinyhttp:

 importar {App} de'@ tinyhttp/app'
const app=new App ()
const PORT=3000 aplicativo .get ('/', (_, res)=> void res.send ('

Olá, mundo

')) .listen (PORT, ()=> console.log (`Iniciado em http://localhost: $ {PORT}!`))

Express.js:

 const express=require ('express');
const app=express (); app.get ('/', (req, res)=> { res.send ('Olá, mundo');
}); app.listen (3000, ()=> console.log ('ouvindo na porta 3000'));

Você provavelmente percebeu que em vez de require , usamos importações ESM. tinyhttp foi projetado para ser usado com ESM nativo . Ao contrário do Express, tinyhttp é compilado para sistemas de módulo ESM e CommonJS. Enquanto isso, de alguma forma, ainda é muito menor do que Express.js.

Você pode usar a sintaxe import / export no Node.js com ele. Para configurar um pacote Node ESM, coloque "type":"module" no arquivo package.json , assim:

 { "tipo":"módulo"
}

Outra opção é usar uma extensão .mjs . Dessa forma, você não precisa colocar esse campo "type" em package.json . Para obter mais informações, verifique a documentação dos módulos ECMAScript Node.js .

Como o middleware Express.js mais popular também usa módulos desatualizados, tinyhttp fornece um conjunto de suas reescritas/remakes de wares populares, como logger , sessão e assim por diante.

Roteamento

Agora vamos ver como lidar com alguns roteamentos básicos em tinyhttp e Express.js. Express.js contém muitas funções auxiliares em seus objetos req e res . tinyhttp implementa totalmente APIs Express.js usando métodos como res.send , res.download , res.redirect e assim por diante.

tinyhttp:

 importar {App} de'@ tinyhttp/app'
importar {uma vez} de'eventos' const app=new App ()
const PORT=3000 app.get ('/', (req, res)=> { res.send ('Enviou um GET!')
}) app.post ('/', assíncrono (req, res)=> { //Nada complexo aqui, apenas ouvimos o evento'data'e retornamos os dados como uma promessa para uma variável `data` dados const=esperar uma vez (req,'dados'). then (d=> d.toString ()) //E então nós o enviamos res.end (`Enviou alguns dados: $ {data}`)
}) app.listen (PORT, ()=> console.log (`Iniciado em http://localhost: $ {PORT}!`))

Express.js

 var express=require ('express');
var app=express (); app.get ('/', função (req, res) { res.send ("Envie um GET!");
}); app.post ('/', função (req, res) { res.send ("olá'! \ n");
}); app.listen (3000);

Conclusão

tinyhttp é rápido e leve, e você pode começar a usá-lo hoje para aplicativos de back-end. O repositório tinyhttp contém muitos exemplos , incluindo MongoDB e integrações GraphQL . Eu recomendaria usar o tinyhttp quando você precisar começar rapidamente com o código mínimo.

Dito isso, Express.js ainda é popular e continuará a ser usado em grandes projetos e setores por causa de seu amplo suporte à comunidade de código aberto e fácil curva de aprendizado.

A postagem tinyhttp vs. Express.js: A comparação de estruturas Node.js apareceu primeiro no LogRocket Blog .