Hono no Node vs Edge
Implante a mesma API Hono no Node 24 ou em runtimes de edge (Cloudflare Workers, Deno, Bun) com trade-offs de portabilidade.
Receita
Padrão de portabilidade de referência rápida.
// app compartilhada (agnóstica ao runtime)
import { Hono } from "hono";
export const app = new Hono();
app.get("/health", (c) => c.json({ ok: true }));
app.get("/users/:id", (c) => c.json({ id: c.req.param("id") }));
// Entrada Node: src/node.ts
import { serve } from "@hono/node-server";
import { app } from "./app.js";
serve({ fetch: app.fetch, port: 3000 });
// Entrada Cloudflare Worker: src/worker.ts
import { app } from "./app.js";
export default app;Quando usar isso: APIs que devem rodar tanto em servidores tradicionais quanto em edge/CDN para latência ou estratégia de múltiplos runtimes.
Exemplo de Trabalho
App portátil com adaptadores específicos do runtime:
// app.ts - rotas compartilhadas
import { Hono } from "hono";
import { cors } from "hono/cors";
export function createApp() {
const app = new Hono();
app.use("*", cors());
app.get("/api/status", (c) => c.json({ runtime: "hono" }));
return app;
}
// node.ts
import { serve } from "@hono/node-server";
import { createApp } from "./app.js";
const app = createApp();
serve({ fetch: app.fetch, port: Number(process.env.PORT ?? 3000) });
// worker.ts (Cloudflare)
import { createApp } from "./app.js";
export default createApp();
// wrangler.toml
// name = "my-api"
// main = "src/worker.ts"
// compatibility_date = "2024-01-01"O que isso demonstra:
- Fábrica
createApp()compartilhada para todos os runtimes - Node usa
@hono/node-server; Workers exportam o app diretamente - CORS e rotas são agnósticos ao runtime
- Configuração de ambiente difere por alvo de implantação
Análise Profunda
Comparação de Runtimes
| Fator | Node 24 | Cloudflare Workers | Deno | Bun |
|---|---|---|---|---|
| Cold start | N/A (longa duração) | < 5ms | Varia | Rápido |
| Limite de tempo de CPU | Nenhum | 30s (pago) | Nenhum | Nenhum |
| Sistema de arquivos | Completo | Nenhum (KV/R2) | Completo | Completo |
| Conexões TCP | Sim | Não (apenas fetch) | Sim | Sim |
| Pacotes npm | Todos | Subconjunto compatível | Registro Deno | Maioria dos npm |
| Modelo de custo | Servidor/pod | Por requisição | Servidor | Servidor |
O que Porta Limpamente
- Definições de rota e middleware
- Manipulação de requisição/resposta JSON
- Validação Zod via
@hono/zod-validator - Autenticação JWT via
hono/jwt - Cabeçalhos CORS e de segurança
O que Não Porta
- Uso direto de
node:fs,node:net - Drivers de banco de dados nativos (use baseados em HTTP ou compatíveis com edge)
- Tarefas de background de longa duração
- WebSocket (limitado nos Workers; use Durable Objects)
Armadilhas
- Usar APIs exclusivas do Node em código compartilhado - quebra nos Workers. Correção: abstrair atrás de adaptadores; usar
fetchpara I/O. - Driver PostgreSQL no edge - TCP não está disponível nos Workers. Correção: usar driver serverless Neon, Supabase HTTP ou Prisma Accelerate.
- Assumir CPU ilimitada - Workers têm limites de tempo de CPU. Correção: manter handlers rápidos; descarregar trabalho pesado para filas.
- Variáveis de ambiente diferem -
process.envno Node, bindingenvnos Workers. Correção: passar configuração paracreateApp(config). - Sem conexões persistentes no edge - cada requisição é isolada. Correção: usar Durable Objects ou armazenamento de estado externo.
- Testar apenas no Node - surpresas do runtime edge em produção. Correção: testar com
wrangler devou Miniflare.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Apenas Node (Fastify/Express) | Superfície completa da API Node necessária | Latência global do edge é crítica |
| Apenas Edge (Workers) | Sensível à latência, leitura intensiva | Computação pesada, banco de dados TCP |
| Hono portátil | Precisa de ambos com código compartilhado | Runtime único é certo |
| Serverless (Lambda) | Ecossistema AWS | Cold start de sub-milissegundo necessário |
FAQs
Devo rodar Hono no Node ou Workers?
Node para recursos completos da API (TCP de DB, sistema de arquivos, WebSockets). Workers para latência global em endpoints de leitura simples.
Posso compartilhar 100% do código entre Node e edge?
Lógica de rota sim. Acesso a banco de dados, I/O de arquivos e configuração precisam de adaptadores específicos do runtime.
Como me conecto ao PostgreSQL a partir de Workers?
Use drivers baseados em HTTP: @neondatabase/serverless, cliente Supabase ou Prisma com Accelerate.
Bun é um bom runtime para Hono?
Sim. Bun tem suporte nativo a Hono e inicialização rápida. Bom para desenvolvimento e implantação se sua operação suporta Bun.
Como isso afeta os testes?
Teste createApp() com app.request() do Hono (semelhante ao inject do Fastify). Nenhuma vinculação de porta é necessária.
E quanto ao OpenAPI no Hono?
@hono/zod-openapi gera OpenAPI a partir de esquemas Zod. Funciona em todos os runtimes.
A implantação no edge substitui o cache de CDN?
Não. A computação de edge executa a lógica perto dos usuários. O cache estático é complementar. Use ambos.
Como decido Node vs edge?
Use a matriz de decisão em Checklist de Seleção de Framework.
Relacionado
- Noções Básicas de Hono - começando
- Noções Básicas de Serverless - padrões serverless
- Mitigação de Cold Start - cold starts de edge
- Checklist de Seleção de Framework - matriz completa
- Melhores Práticas de Frameworks Leves - checklist da seção
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.