Pular para o conteúdo principal

Tamanho do Pacote & Formatos de Módulo

O SDK é fornecido tanto em uma construção CommonJS quanto em uma ESM, e mantém suas duas dependências pesadas — Zod e socket.io-client — fora do gráfico de importação até que sejam realmente usadas. Um projeto que chama um único método, desativa a validação e nunca abre um socket carrega 43 kB minificado (9.7 kB gzip), reduzido de 536 kB (110 kB gzip).

O que é incluído no pacote

CampoValorUsado por
maindist/index.jsNode e qualquer consumidor CommonJS
moduleesm/index.jsBundlers (webpack, Vite, Rollup, esbuild)
typesdist/index.d.tsTypeScript
sideEffectsfalseBundlers, para descartar módulos não utilizados

Não há mapa "exports", então cada importação profunda existente — oneentry/dist/<module>/<module>Interfaces e o resto — resolve exatamente como antes. O Node continua resolvendo a construção CommonJS através de main; nada sobre sua configuração atual precisa mudar.

sideEffects: false informa ao bundler que importar um módulo do SDK nunca faz nada por conta própria, o que torna o tree-shaking possível: os módulos que você não toca são descartados da saída.

Zod carrega apenas quando a validação é executada

A validação de resposta está desativada por padrão. Os esquemas de resposta costumavam ser importados estaticamente por cada módulo, o que puxava o Zod para cada pacote mesmo quando nada era validado. Esquemas e os auxiliares de validação agora são carregados sob demanda, na primeira vez que uma resposta realmente precisa ser validada.

  • Com validation.enabled: false (o padrão), Zod e os esquemas por módulo (341 kB) acabam em partes que nunca são solicitadas.
  • Com validation.enabled: true, o comportamento permanece inalterado — os esquemas são simplesmente buscados na primeira vez que são necessários.
  • No Node, require('oneentry') não carrega mais o Zod na inicialização.

Para um projeto que chama um único método com a validação desativada, o código que realmente carrega cai de 536 kB para 83 kB minificado (110 kB → 22 kB gzip) — e desce para 43 kB uma vez que o socket.io também é deixado de fora (veja abaixo).

ℹ️ Esse número assume um bundler fazendo divisão de código — o padrão no webpack, Vite e Rollup. Um pacote forçado em um único arquivo ainda encolhe, mas apenas para ~427 kB, porque o Zod é então embutido mesmo que nunca seja executado.

Nenhuma API pública foi alterada. O auxiliar interno _validateResponse se tornou async, o que é relevante apenas se você estendeu as classes base do SDK por conta própria.

socket.io carrega apenas quando você abre um socket

WS.connect() mantém sua assinatura síncrona e ainda retorna um Socket do socket.io, mas socket.io-client (~41 kB) agora é importado na primeira vez que connect() é chamado.

Até que a parte seja resolvida, o objeto retornado enfileira tudo o que você faz com ele — on, emit, disconnect — e reproduz isso no socket real no mesmo tick em que o socket é criado, antes que a conexão possa entregar qualquer coisa, para que nenhum evento seja perdido:

// 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));

Ler o estado da conexão cedo continua preciso, porque um socket recém-criado também não está conectado: id é undefined e connected é false tanto no comportamento antigo quanto no novo.

A única diferença: um método que precisa retornar algo (por exemplo, listeners()) não pode responder antes que a parte chegue, e objetos aninhados como socket.io só são acessíveis uma vez que é carregado. Registrar manipuladores e emitir — o uso normal — não é afetado.

Tamanho do pacote em um relance

CenárioMinificadoGzip
Antes (cada consumidor)536 kB110 kB
Validação desativada, sem socket43 kB9.7 kB
Validação desativada, socket aberto~83 kB~22 kB
Pacote de arquivo único, sem divisão de código~427 kB

Obtendo a menor construção

  • Deixe a validação desativada em produção. Ative-a enquanto desenvolve para capturar inconsistências de dados, depois desative — os esquemas permanecem fora do código carregado.
  • Deixe seu bundler dividir o código. A divisão de código está ativada por padrão no webpack, Vite e Rollup; desativá-la embute as partes preguiçosas e recupera a maior parte da vantagem.
  • Importe tipos com import type. As importações de tipo são apagadas no tempo de compilação — veja Importando Tipos.
  • Desestruture apenas os módulos que você usa. Com sideEffects: false e a construção ESM, módulos não tocados são descartados da saída.

🔗 Documentação Relacionada