Aller au contenu principal

Taille du bundle et formats de modules

Le SDK est livré avec un build CommonJS et un build ESM, et garde ses deux dépendances lourdes, Zod et socket.io-client, hors du graphe d'import tant qu'elles ne sont pas utilisées. Un projet qui appelle une seule méthode, laisse la validation désactivée et n'ouvre jamais de socket charge environ 49 kB minifiés (10.9 kB gzip), contre 706 kB (141 kB gzip) en 1.0.158.

Contenu du paquet​

ChampValeurUtilisé par
maindist/index.jsNode et tout consommateur CommonJS
moduleesm/index.jsBundlers (webpack, Vite, Rollup, esbuild)
typesdist/index.d.tsTypeScript
sideEffectsfalseBundlers, pour supprimer les modules inutilisés
exports., ./types, ./dist/*, ./esm/*, ./package.jsonNode et les bundlers qui lisent la table exports

La table exports dirige import vers le build ESM et require vers le build CommonJS, pour la racine comme pour oneentry/types. Elle expose aussi ./dist/* et ./esm/* : les imports profonds existants (oneentry/dist/<module>/<module>Interfaces et les autres) continuent donc de se résoudre, et votre configuration actuelle n'a pas besoin de changer.

sideEffects: false indique au bundler que l'import d'un module du SDK n'a pas d'effets de bord. C'est ce qui permet au tree-shaking de fonctionner : les modules que vous n'utilisez pas sont retirés du résultat.

Zod n'est chargé que lorsque la validation s'exécute​

La validation des réponses est désactivée par défaut. Les schémas et les utilitaires de validation sont chargés à la demande, la première fois qu'une réponse doit être validée. (Les versions précédentes importaient les schémas de manière statique dans chaque module, ce qui plaçait Zod dans chaque bundle même lorsque rien n'était validé.)

  • Avec validation.enabled: false (par défaut), Zod et les schémas par module (~400 kB) se retrouvent dans des chunks qui ne sont jamais demandés.
  • Avec validation.enabled: true, la validation fonctionne comme avant ; les schémas sont récupérés la première fois qu'ils sont nécessaires.
  • Dans Node, require('oneentry') ne charge plus Zod au démarrage.

Ces chiffres supposent un bundler qui fait du code splitting, le comportement par défaut de webpack, Vite et Rollup. Un bundle forcé en un seul fichier diminue quand même, mais seulement jusqu'à ~447 kB, car Zod y est intégré alors qu'il ne s'exécute jamais.

L'API publique est inchangée. L'utilitaire interne _validateResponse est désormais async, ce qui ne compte que si vous avez vous-même étendu les classes de base du SDK.

socket.io n'est chargé que lorsque vous ouvrez un socket​

WS.connect() reste synchrone et renvoie un Socket socket.io, mais socket.io-client (~43 kB) est importé la première fois que connect() est appelé.

Tant que le chunk n'est pas chargé, l'objet renvoyé met en file d'attente chaque appel que vous lui faites (on, emit, disconnect) et les rejoue sur le vrai socket dans le même tick que sa création, avant que la connexion puisse livrer quoi que ce soit. Aucun événement n'est perdu :

// Nothing changes in normal use — handlers registered here always fire.
// Requires an access token: call AuthProvider.auth() first. With only auth.refreshToken
// in the config, make an authorized call (for example Users.getUser()) before connect()
// so the SDK refreshes the token.
const socket = WS.connect();

socket.on('connect', () => console.log('WebSocket connected'));
socket.on('my_event', (payload) => console.log(payload));

Lire l'état de la connexion tôt reste exact, car un socket fraîchement créé n'est pas connecté non plus : id vaut undefined et connected vaut false, comme avant.

La seule différence : une méthode qui doit renvoyer quelque chose (par exemple listeners()) ne peut pas répondre avant l'arrivée du chunk, et les objets imbriqués comme socket.io ne sont accessibles qu'après son chargement. L'enregistrement des gestionnaires et l'émission, l'usage normal, ne sont pas affectés.

La taille du bundle en un coup d'œil​

ScénarioMinifiéGzip
Avant (1.0.158, tous les consommateurs)706 kB141 kB
Validation désactivée, pas de socket49 kB10.9 kB
Validation désactivée, socket ouvert~92 kB~24 kB
Bundle en un seul fichier, sans code splitting~447 kB~94 kB

Mesures sur 1.0.173 (1.0.158 pour la première ligne) avec esbuild 0.24.2 : sortie ESM, --bundle --splitting --minify, plateforme browser, une application qui appelle Pages.getPageByUrl une fois (plus WS.connect() pour la ligne avec socket) ; gzip au niveau 9. D'autres bundlers donnent des chiffres un peu différents.

Obtenir le build le plus petit​

  • Laissez la validation désactivée en production. Activez-la pendant le développement pour repérer les incohérences de données, puis désactivez-la à nouveau, afin que les schémas restent hors du code chargé.
  • Laissez votre bundler découper le code. Le code splitting est activé par défaut dans webpack, Vite et Rollup. Le désactiver intègre les chunks différés et annule l'essentiel du gain.
  • Importez les types avec import type. Les imports de types sont supprimés à la compilation ; voir Importer les types.
  • Ne déstructurez que les modules que vous utilisez. Avec sideEffects: false et le build ESM, les modules inutilisés sont retirés du résultat.

Voir aussi​