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 Un cliente reutilizable para tu API. Resultados tipados, valores predeterminados bien pensados y espacio para tus convenciones.
TypeScript primero. Fetch nativo.
Versión 0.2.0 · Aún sin publicar
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");// ^ Userimport { Http } from "fetchzen";
type User = { id: number; name: string };const api = Http.create("https://api.example.com");
const { data, error } = await api.safe.get<User>("/me");
if (error) { console.error(error.message);} else { console.log(data.payload.name);}import { Http, bare } from "fetchzen";
type User = { id: number; name: string };
const api = Http.create("https://api.example.com", { preset: bare, cache: false,});
const user = await api.get<User>("/me");// ^ User — solo el cuerpo procesado
// También se incluyen: envelope, rest, problem.fetch¹ Compilación local, caso de prueba GET + JSON para navegador. No es la versión publicada. Detalles de la medición
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.
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 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 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 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 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.
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.
Una prueba en memoria, no de velocidad de red. Mediana de las medias muestrales para GET + JSON, ejecutada en Bun con reintentos y tiempos de espera desactivados.
Dependencias de ejecución a nivel de paquete, no paquetes transitivos ni código incluido en el paquete del navegador. Axios también admite transportes específicos de Node.
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.
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.
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.
| 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.mjsbun benchmarks/run.mjsbun benchmarks/verify.mjsCódigo de las pruebas de rendimiento Muestras sin procesar + configuración de compilación
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.
| Capacidad | fetchzen0.2.0 · compilación local | Axios1.20.0 | fetchPlataforma web |
|---|---|---|---|
| Transporte | fetch nativo | XHR / HTTP / fetch | fetch nativo |
| Presets de respuesta tipados | 4 + presets personalizados | Transformaciones / envoltorio | Envoltorio personalizado |
| Ciclo de vida de la solicitud | Hooks asíncronos | Interceptores | Envoltorio personalizado |
| Reintentos automáticos | Opción integrada | Plugin / código personalizado | Código personalizado |
| Validación con Standard Schema | Integrado | Integración personalizada | Integración personalizada |
| Objeto data / error | api.safe | Envoltorio personalizado | Envoltorio personalizado |
| Progreso de descarga | Integrado | Integrado | Leer el flujo |
| Eventos nativos de carga | No integrado | Depende del adaptador | Código personalizado |
| Cargas confirmadas por el servidor | Comprobantes por bloque | Código personalizado | Código personalizado |
Referencias: Documentación de FetchZenAxios 1.20.0 API Fetch
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.
No necesitas un framework
Define una URL base. Elige tus convenciones. Conserva tus herramientas.