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?
- O que é Express.js?
- tinyhttp vs. Express.js: uma comparação básica
- Comparativo de mercado de desempenho
- tinyhttp e Express.js em ação: um exemplo simples
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 aoreq
, você usares
para enviar de volta a resposta HTTP desejada. Tanto tinyhttp quanto express v4 suportam extensõesreq
/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 .