Bun prend en charge deux types de rechargement automatique via des indicateurs CLI :
- Le mode
--watch, qui redémarre complètement le processus de Bun lorsque les fichiers importés changent. - Le mode
--hot, qui recharge doucement le code (sans redémarrer le processus) lorsque les fichiers importés changent.
Mode --watch
Le mode Watch peut être utilisé avec bun test ou lors de l'exécution de fichiers TypeScript, JSX et JavaScript.
Pour exécuter un fichier en mode --watch :
bun --watch index.tsxPour exécuter vos tests en mode --watch :
bun --watch testEn mode --watch, Bun garde une trace de tous les fichiers importés et les surveille pour détecter les changements. Lorsqu'un changement est détecté, Bun redémarre le processus, en conservant le même ensemble d'arguments CLI et de variables d'environnement utilisés lors de l'exécution initiale. Si Bun plante, --watch tentera de redémarrer automatiquement le processus.
NOTE
⚡️ Les rechargements sont rapides. Les surveillants de système de fichiers que vous utilisez probablement ont plusieurs couches de bibliothèques enveloppant les API natives ou pire, reposent sur le polling.
Au lieu de cela, Bun utilise les API de surveillance de système de fichiers natives du système d'exploitation comme kqueue ou inotify pour détecter les changements de fichiers. Bun effectue également un certain nombre d'optimisations pour lui permettre de s'adapter à des projets plus grands (comme la définition d'une limite rlimit élevée pour les descripteurs de fichiers, des tampons de chemin de fichier alloués statiquement, la réutilisation des descripteurs de fichiers lorsque possible, etc).
Les exemples suivants montrent Bun en train de recharger en direct un fichier pendant qu'il est modifié, avec VSCode configuré pour enregistrer le fichier à chaque frappe.
bun run --watch watchy.tsximport { serve } from "bun";
console.log("J'ai redémarré à :", Date.now());
serve({
port: 4003,
fetch(request) {
return new Response("Sup");
},
});Dans cet exemple, Bun est
Exécution de bun test en mode watch et save-on-keypress activé :
bun --watch testNOTE
L'indicateur **`--no-clear-screen`** est utile dans les scénarios où vous ne voulez pas que le terminal se vide, comme lors de l'exécution de plusieurs commandes `bun build --watch` simultanément en utilisant des outils comme `concurrently`. Sans cet indicateur, la sortie d'une instance pourrait effacer la sortie des autres, cachant potentiellement les erreurs d'une instance sous la sortie d'une autre. L'indicateur `--no-clear-screen`, similaire à `--preserveWatchOutput` de TypeScript, évite ce problème. Il peut être utilisé en combinaison avec `--watch`, par exemple : `bun build --watch --no-clear-screen`.Mode --hot
Utilisez bun --hot pour activer le rechargement à chaud lors de l'exécution de code avec Bun. Ceci est distinct du mode --watch en ce sens que Bun ne redémarre pas complètement tout le processus. Au lieu de cela, il détecte les changements de code et met à jour son cache de module interne avec le nouveau code.
NOTE
Ce n'est pas la même chose que le rechargement à chaud dans le navigateur ! De nombreux frameworks fournissent une expérience de "rechargement à chaud", où vous pouvez modifier et enregistrer votre code frontend (disons, un composant React) et voir les changements reflétés dans le navigateur sans rafraîchir la page. Le `--hot` de Bun est l'équivalent côté serveur de cette expérience. Pour obtenir le rechargement à chaud dans le navigateur, utilisez un framework comme [Vite](https://vite.dev).bun --hot server.tsÀ partir du point d'entrée (server.ts dans l'exemple ci-dessus), Bun construit un registre de tous les fichiers source importés (à l'exclusion de ceux dans node_modules) et les surveille pour détecter les changements. Lorsqu'un changement est détecté, Bun effectue un "rechargement doux". Tous les fichiers sont réévalués, mais tout l'état global (notamment, l'objet globalThis) est conservé.
// pour rendre TypeScript heureux
declare global {
var count: number;
}
globalThis.count ??= 0;
console.log(`Rechargé ${globalThis.count} fois`);
globalThis.count++;
// empêche `bun run` de se terminer
setInterval(function () {}, 1000000);Si vous exécutez ce fichier avec bun --hot server.ts, vous verrez le compteur de rechargement s'incrémenter à chaque fois que vous enregistrez le fichier.
bun --hot index.tsRechargé 1 fois
Rechargé 2 fois
Rechargé 3 foisLes surveillants de fichiers traditionnels comme nodemon redémarrent tout le processus, donc les serveurs HTTP et autres objets avec état sont perdus. En revanche, bun --hot est capable de refléter le code mis à jour sans redémarrer le processus.
Serveurs HTTP
Cela rend possible, par exemple, de mettre à jour votre gestionnaire de requêtes HTTP sans arrêter le serveur lui-même. Lorsque vous enregistrez le fichier, votre serveur HTTP sera rechargé avec le code mis à jour sans que le processus ne soit redémarré. Cela se traduit par des vitesses de rafraîchissement extrêmement rapides.
globalThis.count ??= 0;
globalThis.count++;
Bun.serve({
fetch(req: Request) {
return new Response(`Rechargé ${globalThis.count} fois`);
},
port: 3000,
});NOTE
**Note** — Dans une future version de Bun, la prise en charge de `import.meta.hot` de Vite est prévue pour permettre une meilleure gestion du cycle de vie pour le rechargement à chaud et pour s'aligner avec l'écosystème.Détails d'implémentation
Lors du rechargement à chaud, Bun :
- Réinitialise le cache
requireinterne et le registre de modules ES (Loader.registry) - Exécute le garbage collector de manière synchrone (pour minimiser les fuites de mémoire, au détriment des performances d'exécution)
- Re-transpile tout votre code à partir de zéro (y compris les sourcemaps)
- Réévalue le code avec JavaScriptCore
Cette implémentation n'est pas particulièrement optimisée. Elle re-transpile les fichiers qui n'ont pas changé. Elle ne fait aucune tentative de compilation incrémentale. C'est un point de départ.