Solicitudes tipadas.
Resultados claros.

Un cliente reutilizable para tu API. Resultados tipados, valores predeterminados bien pensados y espacio para tus convenciones.

TypeScript primero. Fetch nativo.

bun add fetchzen

Versión 0.2.0 · Aún sin publicar

Un cliente. Tu API.client.ts
import { Http } from "fetchzen";
type User = { id: number; name: string };
const api = Http.create("https://api.example.com", {
timeout: 5000,
retry: 2,
});
const { payload } = await api.get<User>("/me");
// ^ User
Una respuesta envuelta por defecto. Tú defines el tipo del contenido.
  1. fetch
  2. Tu preset
  3. Resultado tipado

¹ Compilación local, caso de prueba GET + JSON para navegador. No es la versión publicada. Detalles de la medición

Elige la estructura.
Conserva tu flujo.

Menos envoltorios. Más código de tu aplicación.

Conserva las primitivas de la plataforma. Agrega el comportamiento que necesita tu aplicación sin crear un nuevo envoltorio para cada proyecto.

Tu API define la estructura.

Respuesta envuelta, cuerpo sin envolver, metadatos estilo REST o detalles del problema. Elige un preset o define tu propia estructura tipada.

preset: bare Explora los presets

Los errores son parte de la API.

Mantén juntos el estado, la causa, la respuesta y el contexto de la solicitud. Maneja los errores como valores cuando sea lo más adecuado para tu código.

const { data: result, error } = await api.safe.get("/me"); Maneja los errores

Usa tu propio validador.

Valida con herramientas compatibles con Standard Schema, como Zod o Valibot. Tu validador sigue siendo una dependencia independiente.

api.get("/me", { schema: User }) Valida una respuesta

Bytes reales. Progreso sin suposiciones.

Cuenta solo los bytes que confirma tu servidor. Una convención opcional por bloques, no eventos de carga simulados.

uploadConfirmed(file, { sendChunk }) Explora las cargas confirmadas

Poco espacio.
Ventajas y límites claros.

El costo de un cliente

El tamaño del paquete es solo una parte de la decisión. Compara el código que envías, el trabajo por solicitud y las dependencias que incorporas.

Lo que se envía al navegador

kB, minificado + gzip · menos es más pequeño
fetchzen Local 0.2.0
6.41 kB
axios 1.20.0
19.64 kB
fetch nativo Bun 1.4.4
0.13 kB

Mismo empaquetador, puntos de entrada GET + JSON separados. Incluye el código del cliente y el envoltorio de la solicitud. fetch nativo está integrado en el entorno de ejecución; su barra solo representa el envoltorio.

Medición del · Bun 1.4.4 · Apple M4 ProCómo medimos
Metodología, resultados exactos y reproducción

Paquete para navegador

Bun.build 1.4.4, ESM minificado, nivel de gzip 9. Funciones GET + JSON exportadas por separado con URLs definidas en tiempo de ejecución. Los casos de prueba de tamaño conservan los valores predeterminados; HTTP usa el preset bare. kB decimal = 1,000 bytes.

Sobrecosto del cliente

500 operaciones de calentamiento, 9 muestras de 2,000 operaciones secuenciales por cliente. Respuestas JSON idénticas de 103 bytes, procesamiento y comprobaciones del contenido. Sin DNS, TLS, servidor ni latencia de red.

Límites de esta medición

macOS arm64, Apple M4 Pro. Paquetes para navegador ejecutados en Bun; no son tiempos de un motor de navegador. Instancias reutilizadas; sin reintentos ni tiempos de espera. Estos resultados no miden cargas, solicitudes fallidas ni latencia de extremo a extremo.

Los valores mínimo y máximo son medias muestrales, no percentiles de solicitudes. Un valor menor no es necesariamente mejor para tu caso de uso.
Cliente Bytes minificados Bytes con gzip Mediana µs/op Mín–máx µs/op
fetchzen 16,659 6,412 2.234 2.036–2.434
axios 52,184 19,639 14.064 13.000–15.618
fetch nativo 118 129 0.623 0.496–0.651

FetchZen se mide desde el árbol de trabajo local, no desde la publicación en npm con la misma versión. Huella del código fuente: 3bee026ba3b20117a78c03024b7cf17cc138a0f9aa7cd47360d203b54538e588 . Los tiempos varían según la carga del CPU, la recolección de basura y el entorno de ejecución. No se afirma significancia estadística.

bun benchmarks/install-isolated.mjs
bun benchmarks/run.mjs
bun benchmarks/verify.mjs

No todo es cuestión de tamaño.

Elige la abstracción adecuada

Estos clientes toman decisiones distintas. Esto es lo que ofrece cada uno directamente y lo que tendrías que integrar por tu cuenta.

“Personalizado” significa que se puede implementar en el código de la aplicación, no que sea imposible. La validación requiere un esquema compatible; el soporte de progreso depende del entorno de ejecución.
Capacidad fetchzen0.2.0 · compilación local Axios1.20.0 fetchPlataforma web
Transporte fetch nativoXHR / HTTP / fetchfetch nativo
Presets de respuesta tipados 4 + presets personalizadosTransformaciones / envoltorioEnvoltorio personalizado
Ciclo de vida de la solicitud Hooks asíncronosInterceptoresEnvoltorio personalizado
Reintentos automáticos Opción integradaPlugin / código personalizadoCódigo personalizado
Validación con Standard Schema IntegradoIntegración personalizadaIntegración personalizada
Objeto data / error api.safeEnvoltorio personalizadoEnvoltorio personalizado
Progreso de descarga IntegradoIntegradoLeer el flujo
Eventos nativos de carga No integradoDepende del adaptadorCódigo personalizado
Cargas confirmadas por el servidor Comprobantes por bloqueCódigo personalizadoCódigo personalizado

¿Cuándo conviene elegir otra opción?

Usa fetch nativo cuando basten unas cuantas solicitudes y tu propio manejo de errores. Axios ofrece un ecosistema maduro de interceptores y varios adaptadores de transporte. Elige este cliente cuando quieras dejar de reimplementar convenciones de respuesta tipadas y un modelo de errores integrado.

Comienza con una solicitud.

No necesitas un framework

Define una URL base. Elige tus convenciones. Conserva tus herramientas.