Tamaño del Paquete y Formatos de Módulo
El SDK incluye tanto una construcción CommonJS como una ESM, y mantiene sus dos dependencias pesadas — Zod y socket.io-client — fuera del gráfico de importación hasta que realmente se utilicen. Un proyecto que llama a un solo método, no realiza validaciones y nunca abre un socket carga 43 kB minificado (9.7 kB gzip), bajando de 536 kB (110 kB gzip).
Qué se incluye en el paquete
| Campo | Valor | Usado por |
|---|---|---|
main | dist/index.js | Node y cualquier consumidor CommonJS |
module | esm/index.js | Empaquetadores (webpack, Vite, Rollup, esbuild) |
types | dist/index.d.ts | TypeScript |
sideEffects | false | Empaquetadores, para eliminar módulos no utilizados |
No hay un mapa de "exports", por lo que cada importación profunda existente — oneentry/dist/<module>/<module>Interfaces y el resto — se resuelve exactamente como lo hacía antes. Node sigue resolviendo la construcción CommonJS a través de main; nada de tu configuración actual tiene que cambiar.
sideEffects: false le indica al empaquetador que importar un módulo del SDK nunca hace nada por sí solo, lo que hace posible el tree-shaking: los módulos que no tocas se eliminan de la salida.
Zod se carga solo cuando se ejecuta la validación
La validación de respuestas está desactivada por defecto. Los esquemas de respuesta solían ser importados estáticamente por cada módulo, lo que hacía que Zod se incluyera en cada paquete incluso cuando nunca se validaba nada. Los esquemas y los ayudantes de validación ahora se cargan bajo demanda, la primera vez que realmente se tiene que validar una respuesta.
- Con
validation.enabled: false(el valor por defecto), Zod y los esquemas por módulo (341 kB) terminan en fragmentos que nunca se solicitan. - Con
validation.enabled: true, el comportamiento no cambia: los esquemas simplemente se obtienen la primera vez que se necesitan. - En Node,
require('oneentry')ya no carga Zod al inicio.
Para un proyecto que llama a un solo método con la validación desactivada, el código que realmente se carga baja de 536 kB a 83 kB minificado (110 kB → 22 kB gzip) — y hasta 43 kB una vez que también se omite socket.io (ver más abajo).
ℹ️ Esa cifra asume un empaquetador que realiza división de código — el valor por defecto en webpack, Vite y Rollup. Un paquete forzado en un solo archivo aún se reduce, pero solo a ~427 kB, porque Zod se incluye en línea aunque nunca se ejecute.
No se cambió ninguna API pública. El ayudante interno _validateResponse se volvió async, lo cual solo es relevante si extendiste las clases base del SDK tú mismo.
socket.io se carga solo cuando abres un socket
WS.connect() mantiene su firma sincrónica y aún devuelve un Socket de socket.io, pero socket.io-client (~41 kB) ahora se importa la primera vez que se llama a connect().
Hasta que el fragmento se resuelva, el objeto devuelto encola lo que hagas con él — on, emit, disconnect — y lo reproduce en el socket real en el mismo tick en que se crea el socket, antes de que la conexión pueda entregar algo, por lo que no se pierde ningún evento:
// Nothing changes in normal use — handlers registered here always fire.
const socket = WS.connect();
socket.on('connect', () => console.log('WebSocket connected'));
socket.on('my_event', (payload) => console.log(payload));
Leer el estado de conexión temprano sigue siendo preciso, porque un socket recién creado tampoco está conectado: id es undefined y connected es false tanto en el comportamiento antiguo como en el nuevo.
La única diferencia: un método que tiene que devolver algo (por ejemplo listeners()) no puede responder antes de que llegue el fragmento, y los objetos anidados como socket.io solo son accesibles una vez que se carga. Registrar manejadores y emitir — el uso normal — no se ve afectado.
Tamaño del paquete a simple vista
| Escenario | Minificado | Gzip |
|---|---|---|
| Antes (cada consumidor) | 536 kB | 110 kB |
| Validación desactivada, sin socket | 43 kB | 9.7 kB |
| Validación desactivada, socket abierto | ~83 kB | ~22 kB |
| Paquete de un solo archivo, sin división de código | ~427 kB | — |
Obtener la construcción más pequeña
- Deja la validación desactivada en producción. Actívala mientras desarrollas para detectar inconsistencias de datos, luego desactívala — los esquemas se mantienen fuera del código cargado.
- Deja que tu empaquetador divida el código. La división de código está activada por defecto en webpack, Vite y Rollup; desactivarla incluye en línea los fragmentos perezosos y devuelve la mayor parte de la ganancia.
- Importa tipos con
import type. Las importaciones de tipos se eliminan en tiempo de compilación — consulta Importando Tipos. - Solo desestructura los módulos que usas. Con
sideEffects: falsey la construcción ESM, los módulos no tocados se eliminan de la salida.
🔗 Documentación Relacionada
- Importando Tipos - los puntos de entrada
oneentryyoneentry/types - Validación de Respuestas de API - habilitando y configurando la validación de Zod
- Módulo WS - abriendo una conexión en tiempo real