Entre las herramientas de desarrollo recientes más emocionantes se encuentra Bun, un kit de herramientas de JavaScript increíblemente rápido y todo en uno diseñado para mejorar la productividad del desarrollador y el rendimiento de las aplicaciones. Bun no es solo otro tiempo de ejecución; es un ecosistema cohesivo que abarca un tiempo de ejecución, un empaquetador (bundler), un ejecutor de pruebas (test runner), un gestor de paquetes (package manager) y más, todo dentro de un único ejecutable nativo. Esta guía le guiará a través de los aspectos esenciales de Bun, centrándose en sus conceptos fundamentales y potentes APIs.
¿Quiere una plataforma integrada y todo en uno para que su equipo de desarrolladores trabaje en conjunto con máxima productividad?
¡Apidog cumple todas sus demandas y reemplaza a Postman a un precio mucho más asequible!
¿Qué es Bun?

En su esencia, Bun se construye alrededor de un motor de tiempo de ejecución de JavaScript de alto rendimiento. A diferencia de Node.js, que utiliza el motor V8 de Google, Bun utiliza JavaScriptCore (JSC) de Apple, el motor que impulsa Safari. Esta elección, combinada con la implementación de Bun en el lenguaje de programación de bajo nivel Zig, contribuye significativamente a su notable velocidad. Los tiempos de inicio para las aplicaciones de Bun a menudo se miden como drásticamente más rápidos que las aplicaciones equivalentes de Node.js, a veces por un factor de cuatro o más. Esta ventaja de velocidad se extiende más allá del simple inicio; las implementaciones internas de Bun de varias APIs están optimizadas para un rendimiento máximo y un uso mínimo de memoria.
Pero la ambición de Bun se extiende mucho más allá de ser solo un tiempo de ejecución más rápido. Su objetivo es ser un kit de herramientas completo, abordando directamente las necesidades comunes de los desarrolladores:
- Herramientas Integradas: El comando
bun
en sí mismo actúa como punto de entrada para numerosas funcionalidades.bun run
ejecuta scripts definidos enpackage.json
,bun install
gestiona dependencias (a menudo mucho más rápido que npm o yarn),bun test
ejecuta pruebas utilizando una API compatible con Jest,bun build
empaqueta código para producción ybunx
ejecuta paquetes sin instalarlos explícitamente. Esta integración simplifica los flujos de trabajo al reducir la cantidad de herramientas de desarrollo distintas necesarias. - Soporte Nativo de TypeScript y JSX: Una de las características destacadas de Bun es su soporte inmediato (out-of-the-box) para archivos TypeScript (
.ts
,.tsx
) y JSX (.jsx
). Bun incluye un transpilador integrado y altamente optimizado que maneja estos tipos de archivos sin problemas durante la ejecución o el empaquetado. Esto elimina la necesidad de pasos de compilación separados que involucrentsc
o Babel para muchos escenarios de desarrollo comunes, agilizando el proceso de configuración. - Compatibilidad con Sistemas de Módulos: Bun adopta JavaScript moderno con soporte de primera clase para ES Modules (ESM). Sin embargo, reconoce el vasto ecosistema existente construido sobre CommonJS (CJS). Bun proporciona una compatibilidad robusta para ambos sistemas de módulos, permitiendo a los desarrolladores usar
import
yrequire
de manera intercambiable en gran medida y aprovechar los millones de paquetes CJS existentes disponibles en npm. - Adherencia a APIs Estándar Web: Un principio de diseño clave es la implementación de APIs Web estándar. Funciones y objetos como
fetch
,Request
,Response
,Headers
,WebSocket
y la API Streams (ReadableStream
,WritableStream
) están integrados en el ámbito global de Bun. Esto promueve la portabilidad del código entre entornos Bun del lado del servidor, frontends de navegador y plataformas de computación de borde (edge computing), permitiendo a los desarrolladores reutilizar APIs familiares en diferentes contextos. - Compatibilidad con Node.js: Si bien Bun forja su propio camino con APIs optimizadas y estándares Web, busca un alto grado de compatibilidad con la superficie de la API de Node.js. Muchos módulos integrados de Node.js (
node:fs
,node:path
,node:os
,node:events
, etc.) y objetos globales (process
,Buffer
,__filename
,__dirname
) están implementados parcial o totalmente. El objetivo es permitir que muchos proyectos Node.js y paquetes npm existentes se ejecuten en Bun con mínima o ninguna modificación, posicionando a Bun como un potencial "reemplazo directo" (drop-in replacement) en numerosos casos.
Al combinar estos elementos, Bun presenta una alternativa atractiva para los desarrolladores de JavaScript y TypeScript que buscan rendimiento, simplicidad y una experiencia de desarrollo moderna.

Cómo Instalar Bun
Comenzar con Bun está diseñado para ser rápido y sencillo en diversas plataformas. El método más común para macOS, Linux y el Subsistema de Windows para Linux (WSL) utiliza un simple comando curl
ejecutado en su terminal:
curl -fsSL https://bun.sh/install | bash
Si encuentra problemas de permisos o prefiere no canalizar directamente a bash
, puede descargar el script primero e inspeccionarlo antes de ejecutarlo:
curl -fsSL https://bun.sh/install -o install.sh
# Inspeccionar install.sh si se desea
bash install.sh
Otros Métodos de Instalación:
- NPM: Aunque está destinado principalmente como una herramienta independiente, también puede instalar Bun globalmente a través de npm, lo que puede ser conveniente en entornos donde Node.js y npm ya están presentes:
npm install -g bun
- Docker: Las imágenes oficiales de Bun Docker están disponibles en Docker Hub, proporcionando entornos aislados con Bun preinstalado. Son útiles para flujos de trabajo de desarrollo y despliegue en contenedores. Puede encontrar varias imágenes basadas en diferentes distribuciones de SO base (como Debian, Alpine) y etiquetas correspondientes a versiones específicas de Bun.
docker run --rm --init --ulimit memlock=-1:-1 oven/bun:latest bun --version
- Windows: El soporte nativo para Windows para Bun todavía se considera experimental, pero se está desarrollando activamente. La forma recomendada de usar Bun en Windows actualmente es a través de WSL. Sin embargo, las compilaciones directas para Windows están cada vez más disponibles, y el proceso de instalación podría implicar descargar un archivo
.zip
y añadir manualmente la ubicación del ejecutable alPATH
del sistema. Consulte la documentación oficial de Bun para conocer el estado más reciente y las instrucciones para la instalación nativa en Windows. - Homebrew (macOS): Si usa Homebrew en macOS, puede instalar Bun a través de su tap:
brew tap oven-sh/bun
brew install bun
Verificación:
Una vez instalado, abra una nueva ventana de terminal y verifique la instalación comprobando la versión:
bun --version
Esto debería mostrar el número de versión instalado, confirmando que Bun está listo para usar. También puede ejecutar bun --help
para ver una lista de comandos y opciones disponibles.
Ejecute Su Bun por Primera Vez
Vamos a sumergirnos en la escritura y ejecución de un programa simple con Bun. Una de las tareas más comunes es crear un servidor HTTP. Bun proporciona una API integrada y altamente optimizada para este propósito: Bun.serve
.
Cree un nuevo archivo llamado server.js
(o server.ts
, ya que Bun maneja ambos):
// server.ts
// Bun.serve inicia el servidor HTTP
const server = Bun.serve({
// Especifica el puerto en el que escuchar.
// Por defecto es process.env.PORT || 3000
port: 3000,
// La función 'fetch' es el manejador principal de solicitudes.
// Recibe un objeto Request estándar y debe devolver un objeto Response (o una Promesa que resuelva a uno).
fetch(request: Request): Response {
// Crea un objeto Response estándar de la Web API
return new Response("Welcome to Bun!");
},
});
// Registra un mensaje indicando que el servidor está corriendo
console.log(`Listening on http://localhost:${server.port}`);
Este fragmento de código hace lo siguiente:
- Llama a
Bun.serve
, la función principal para crear servidores HTTP en Bun. - Pasa un objeto de configuración, especificando el
port
(3000 en este caso). - La parte crucial es la función
fetch
. Esta función se invoca para cada solicitud HTTP entrante. Se alinea con el patrón del manejador de eventos fetch de Service Worker, aceptando un objetoRequest
estándar. - Dentro de
fetch
, construimos y devolvemos un objetoResponse
estándar. Aquí, simplemente devolvemos el texto plano "Welcome to Bun!". - Finalmente, registramos un mensaje de confirmación en la consola, incluyendo el puerto real en el que el servidor está escuchando (accesible a través de
server.port
).
Para ejecutar este servidor, abra su terminal en el directorio donde guardó el archivo y ejecute:
bun run server.ts
O, si lo guardó como server.js
:
bun run server.js
Bun ejecutará el script. Si usó TypeScript (server.ts
), el transpilador interno de Bun manejará la conversión a JavaScript sobre la marcha antes de la ejecución. Verá el mensaje "Listening on http://localhost:3000".
Ahora, abra su navegador web y navegue a http://localhost:3000
. Debería ver el texto "Welcome to Bun!" mostrado.
Para detener el servidor, vuelva a su terminal y presione Ctrl + C
.
Este simple ejemplo demuestra la facilidad para configurar un servidor básico y ejecutar código (incluido TypeScript) directamente con Bun, mostrando su naturaleza integrada y su dependencia de APIs Web estándar como Request
y Response
.
¿Qué es el Soporte Nativo de TypeScript en Bun?
Una de las ventajas más significativas de Bun, especialmente para los desarrolladores que ya usan o desean adoptar TypeScript, es su soporte de primera clase e inmediato (out-of-the-box). A diferencia de Node.js, donde ejecutar TypeScript generalmente requiere pre-compilación usando el compilador de TypeScript (tsc
) o usando cargadores/registradores como ts-node
o tsx
, Bun lo maneja de forma nativa y transparente.
Cómo Funciona:
Cuando le pide a Bun que ejecute un archivo .ts
o .tsx
(por ejemplo, bun run myscript.ts
), invoca automáticamente su transpilador interno. Este transpilador está escrito en código nativo (Zig) y es extremadamente rápido. Su trabajo es:
- Eliminar Tipos: Elimina anotaciones de tipo de TypeScript, interfaces, enums, etc., ya que no forman parte de la ejecución estándar de JavaScript.
- Transformar Sintaxis: Convierte la sintaxis específica de TypeScript (como ciertos usos de
enum
o sintaxis de decoradores más antigua si está configurado) en JavaScript equivalente. - Manejar JSX: Transforma la sintaxis JSX (utilizada en archivos
.tsx
y.jsx
) en llamadas a funciones de JavaScript estándar (típicamenteReact.createElement
o un equivalente de tiempo de ejecución JSX configurado).
El beneficio clave es que esto sucede sobre la marcha durante el proceso de ejecución (bun run
) o empaquetado (bun build
). No se requiere un paso de construcción separado y explícito solo para ejecutar su código TypeScript durante el desarrollo.
Ejemplo:
Considere este archivo TypeScript (greet.ts
):
// greet.ts
interface User {
name: string;
id: number;
}
function greetUser(user: User): void {
console.log(`Hello, ${user.name} (ID: ${user.id})!`);
}
const myUser: User = { name: "Bun Developer", id: 123 };
greetUser(myUser);
// Incluso puedes usar características modernas que Bun soporta
const message = `Bun version: ${Bun.version}`;
console.log(message);
Puede ejecutar esto directamente:
bun run greet.ts
Bun lo transpilá internamente y ejecutará el JavaScript resultante, produciendo una salida como:
Hello, Bun Developer (ID: 123)!
Bun version: 1.x.y
Soporte de JSX:
De manera similar, si tiene un archivo .tsx
con JSX:
// component.tsx
// Asumiendo que tiene JSX configurado (las configuraciones por defecto de Bun a menudo funcionan con React)
function MyComponent({ name }: { name: string }) {
return <div className="greeting">Hello, {name}!</div>;
}
// NOTA: Ejecutar esto directamente no renderizará HTML,
// solo muestra la estructura JS transpilada.
// Típicamente lo usaría dentro de una aplicación o framework más grande.
console.log("Simulando la creación de un componente (estructura de salida transpilada):");
// La salida real depende de la configuración de transformación de JSX,
// pero serían objetos/llamadas a funciones de JavaScript.
Ejecutar bun run component.tsx
ejecutaría el archivo, transpilando el JSX a JavaScript.
Configuración (tsconfig.json
):
Bun respeta los archivos tsconfig.json
para las opciones de configuración que afectan la transpilación. Aunque no realiza una verificación de tipos completa como tsc
(Bun se centra en la velocidad de ejecución y transpilación), lee tsconfig.json
para entender configuraciones como:
jsx
: ("react-jsx"
,"react"
, etc.) Cómo se debe transformar JSX.jsxImportSource
: El módulo desde el cual importar funciones auxiliares de JSX (por ejemplo,"react"
).experimentalDecorators
,emitDecoratorMetadata
: Soporte para decoradores.paths
,baseUrl
: Mapeo de rutas de módulos para alias de importación personalizados.target
,module
: Aunque Bun gestiona la ejecución, estos a veces pueden influir en detalles menores de la transpilación.strict
,strictNullChecks
, etc.: Estos afectan principalmente la verificación de tipos (que Bun no realiza duranterun
), pero algunos comportamientos de emisión de JavaScript relacionados podrían verse influenciados.
Si no se encuentra un archivo tsconfig.json
, Bun utiliza configuraciones predeterminadas sensatas.
Esta integración perfecta hace que iniciar proyectos TypeScript con Bun sea increíblemente simple y rápido, reduciendo la barrera de entrada y acelerando los ciclos de desarrollo.
Hablemos de las APIs Específicas de Bun
Aunque Bun enfatiza fuertemente la compatibilidad con las APIs estándar Web y Node.js, también introduce su propio conjunto de APIs optimizadas e integradas bajo el objeto global Bun
. Estas APIs a menudo proporcionan alternativas de alto rendimiento o envoltorios convenientes para tareas comunes que aprovechan las capacidades de código nativo de Bun.
Aquí hay un vistazo a algunas APIs clave de Bun.*
:
Bun.serve({...})
: Como se vio en el Inicio Rápido, esta es la piedra angular para construir servidores HTTP y WebSocket de alto rendimiento. Ofrece una configuración simplificada y utiliza la firma estándar del manejadorfetch
. (Cubierto en detalle más adelante).Bun.file(path)
: Crea un objetoBunFile
, que es una referencia p