Trois choses que les gens appellent « compiler TypeScript »
Quand les développeurs cherchent comment compiler TypeScript en binaire, ils tombent généralement sur trois techniques très différentes qui partagent un même mot :
- Transpilation.
tsc, SWC et esbuild transforment TypeScript en JavaScript. La sortie a toujours besoin de Node.js, Bun ou d'un navigateur pour s'exécuter. Aucun binaire n'est impliqué. - Intégration du runtime.
bun build --compile,deno compile, et les Single Executable Applications (SEA) de Node.js concatènent votre JavaScript empaqueté avec une copie complète du runtime. Vous obtenez un seul fichier, mais le moteur voyage à l'intérieur et votre code est toujours analysé et compilé en JIT à chaque démarrage du processus. - Compilation native ahead-of-time. C'est ce que fait Perry. TypeScript est analysé avec SWC, les types sont résolus, les génériques sont monomorphisés, et LLVM émet du code machine. L'éditeur de liens produit un exécutable normal — la même catégorie d'artefact qu'une toolchain Rust, Go ou C++ produit. Il n'y a absolument aucun moteur JavaScript dans le binaire.
Comme il n'y a aucun moteur à démarrer et rien à analyser au lancement, un binaire Perry démarre en environ une milliseconde. Le pipeline lui-même est décrit plus en détail sur la page compilateur TypeScript natif et dans le fonctionnement interne du compilateur.
Quelle est la taille du binaire ?
La taille dépend de ce que vous embarquez, car seul le code que vous utilisez réellement est compilé et lié :
- Un hello world fait environ 330 Ko.
- Les outils CLI classiques se situent entre 2 et 5 Mo.
- Les applications complètes qui lient de gros frameworks (Fastify, mysql2 et consorts) font environ 48 Mo.
Par contraste : un exécutable Node SEA est une copie du binaire node lui-même, donc il démarre à environ 88–118 Mo selon la plateforme avant même l'ajout de votre code, et un hello world compilé avec Bun mesure environ 60 Mo sur macOS arm64 et environ 100 Mo sur Linux x64, parce que l'intégralité du runtime Bun est embarquée.
Perry vs bun build --compile vs Node SEA
Les trois vous donnent un seul fichier que vous pouvez transmettre à quelqu'un. Ce sont par ailleurs des outils très différents, et chacun est la bonne réponse pour quelqu'un :
| Perry | bun build --compile | Node SEA | |
|---|---|---|---|
| Ce qu'il produit | Code machine compilé AOT (LLVM) | JS empaqueté + runtime Bun embarqué | Copie du binaire node avec votre script empaqueté injecté |
| Modèle d'exécution | Code natif, aucun moteur JS | JIT (JavaScriptCore) à l'exécution | JIT (V8) à l'exécution |
| Taille hello-world | ~330 Ko | ~60 Mo (macOS arm64) à plus de 100 Mo (Linux/Windows) | ~88–118 Mo (taille du binaire node) |
| Démarrage | ~1 ms | ~10 ms | ~30 ms |
| Compilation croisée | 10 cibles, y compris Windows/macOS/iOS depuis Linux | Oui — Linux, Windows, macOS via --target | Non — copiez plutôt un binaire node par plateforme |
| Compatibilité JS/npm | En croissance : axios, zod v4, express, fastify, hono compilent nativement ; V8 optionnel en repli pour le reste | Complète — c'est le runtime Bun | Sémantique Node complète ; nécessite un pré-empaquetage, CommonJS uniquement sur Node 24 LTS |
| Statut | Pré-1.0 | Stable | Stabilité « en développement actif » dans Node 24 LTS |
Pour être honnête : si votre application s'appuie sur l'écosystème npm complet et que vous voulez un risque de compatibilité nul, Bun et Node SEA exécutent exactement la sémantique de moteur avec laquelle vous développez déjà — c'est leur force, et le coût en taille peut ne pas compter pour votre déploiement. Perry propose un compromis différent. Vous obtenez une véritable compilation ahead-of-time, de petits binaires et un démarrage en une milliseconde ; en échange, vous adoptez un compilateur pré-1.0 dont la conformité JavaScript est mesurée et publiée (test262 : String 79 %, Array 72 % à la date de v0.5.1146) plutôt qu'héritée de V8.
Comparaisons détaillées : Perry vs Bun et Perry vs Deno. Pour savoir comment les paquets npm compilent, voir Les vrais packages npm compilent désormais : axios, zod, express — et une passe de conformité.