Bun soporta dos tipos de recarga automática a través de flags del CLI:
- El modo
--watch, que reinicia completamente el proceso de Bun cuando los archivos importados cambian. - El modo
--hot, que recarga suavemente el código (sin reiniciar el proceso) cuando los archivos importados cambian.
Modo --watch
El modo watch se puede usar con bun test o al ejecutar archivos TypeScript, JSX y JavaScript.
Para ejecutar un archivo en modo --watch:
bun --watch index.tsxPara ejecutar tus pruebas en modo --watch:
bun --watch testEn modo --watch, Bun mantiene un registro de todos los archivos importados y los observa buscando cambios. Cuando se detecta un cambio, Bun reinicia el proceso, conservando el mismo conjunto de argumentos del CLI y variables de entorno usados en la ejecución inicial. Si Bun falla, --watch intentará reiniciar automáticamente el proceso.
NOTE
⚡️ Las recargas son rápidas. Los observadores del sistema de archivos que probablemente conozcas tienen varias capas de librerías envolviendo las APIs nativas o, peor aún, dependen del sondeo.
En cambio, Bun usa APIs nativas de observación del sistema de archivos del sistema operativo como kqueue o inotify para detectar cambios en los archivos. Bun también realiza varias optimizaciones para permitirle escalar a proyectos más grandes (como establecer un rlimit alto para descriptores de archivos, búferes de ruta de archivo asignados estáticamente, reutilizar descriptores de archivos cuando es posible, etc).
Los siguientes ejemplos muestran a Bun recargando en vivo un archivo mientras se edita, con VSCode configurado para guardar el archivo en cada pulsación de tecla.
bun run --watch watchy.tsximport { serve } from "bun";
console.log("Me reinicié en:", Date.now());
serve({
port: 4003,
fetch(request) {
return new Response("Sup");
},
});En este ejemplo, Bun está
Ejecutando bun test en modo watch y con save-on-keypress habilitado:
bun --watch testNOTE
La bandera **`--no-clear-screen`** es útil en escenarios donde no quieres que la terminal se limpie, como cuando ejecutas múltiples comandos `bun build --watch` simultáneamente usando herramientas como `concurrently`. Sin esta bandera, la salida de una instancia podría limpiar la salida de otras, potencialmente ocultando errores de una instancia beneath la salida de otra. La bandera `--no-clear-screen`, similar a `--preserveWatchOutput` de TypeScript, previene este problema. Se puede usar en combinación con `--watch`, por ejemplo: `bun build --watch --no-clear-screen`.Modo --hot
Usa bun --hot para habilitar la recarga en caliente al ejecutar código con Bun. Esto es distinto del modo --watch en que Bun no reinicia completamente el proceso. En cambio, detecta cambios en el código y actualiza su caché de módulos interna con el nuevo código.
NOTE
¡Esto no es lo mismo que la recarga en caliente en el navegador! Muchos frameworks proporcionan una experiencia de "recarga en caliente", donde puedes editar y guardar tu código frontend (digamos, un componente React) y ver los cambios reflejados en el navegador sin recargar la página. El `--hot` de Bun es el equivalente del lado del servidor de esta experiencia. Para obtener recarga en caliente en el navegador, usa un framework como [Vite](https://vite.dev).bun --hot server.tsComenzando desde el punto de entrada (server.ts en el ejemplo anterior), Bun construye un registro de todos los archivos fuente importados (excluyendo aquellos en node_modules) y los observa buscando cambios. Cuando se detecta un cambio, Bun realiza una "recarga suave". Todos los archivos se reevalúan, pero todo el estado global (notablemente, el objeto globalThis) se conserva.
// hacer feliz a TypeScript
declare global {
var count: number;
}
globalThis.count ??= 0;
console.log(`Recargado ${globalThis.count} veces`);
globalThis.count++;
// prevenir que `bun run` termine
setInterval(function () {}, 1000000);Si ejecutas este archivo con bun --hot server.ts, verás el conteo de recargas incrementarse cada vez que guardas el archivo.
bun --hot index.tsRecargado 1 veces
Recargado 2 veces
Recargado 3 vecesLos observadores de archivos tradicionales como nodemon reinician todo el proceso, por lo que los servidores HTTP y otros objetos con estado se pierden. Por el contrario, bun --hot puede reflejar el código actualizado sin reiniciar el proceso.
Servidores HTTP
Esto hace posible, por ejemplo, actualizar tu manejador de solicitudes HTTP sin apagar el servidor mismo. Cuando guardas el archivo, tu servidor HTTP se recargará con el código actualizado sin que el proceso se reinicie. Esto resulta en velocidades de actualización seriamente rápidas.
globalThis.count ??= 0;
globalThis.count++;
Bun.serve({
fetch(req: Request) {
return new Response(`Recargado ${globalThis.count} veces`);
},
port: 3000,
});NOTE
**Nota** — En una versión futura de Bun, se planea el soporte para `import.meta.hot` de Vite para habilitar una mejor gestión del ciclo de vida para la recarga en caliente y alinearse con el ecosistema.Detalles de implementación
En la recarga en caliente, Bun:
- Reinicia la caché interna de
requirey el registro de módulos ES (Loader.registry) - Ejecuta el recolector de basura sincrónicamente (para minimizar fugas de memoria, a costa del rendimiento en tiempo de ejecución)
- Vuelve a transpilar todo tu código desde cero (incluyendo sourcemaps)
- Reevalúa el código con JavaScriptCore
Esta implementación no está particularmente optimizada. Vuelve a transpilar archivos que no han cambiado. No hace ningún intento de compilación incremental. Es un punto de partida.