Bun

Kit de herramientas JavaScript todo en uno - runtime ultrarapido, bundler, test runner y gestor de paquetes

TL;DR

Qué: Runtime JavaScript todo en uno, bundler, ejecutor de pruebas y gestor de paquetes.

Por qué: 4x más rápido que Node.js, TypeScript nativo, bundler integrado, reemplazo directo de Node.

Quick Start

Instalar:

# macOS/Linux
curl -fsSL https://bun.sh/install | bash

# Windows
powershell -c "irm bun.sh/install.ps1 | iex"

# Verificar versión
bun --version

Ejecutar scripts:

bun run index.ts     # Ejecutar TypeScript directamente
bun run index.js     # Ejecutar JavaScript
bun run dev          # Ejecutar script de package.json

Cheatsheet

ComandoDescripción
bun run fileEjecutar archivo
bun installInstalar dependencias
bun add pkgAñadir dependencia
bun remove pkgEliminar paquete
bun testEjecutar pruebas
bun buildEmpaquetar para producción
bun initCrear nuevo proyecto

Gotchas

Package management

# Inicializar proyecto
bun init

# Instalar dependencias
bun install

# Añadir paquete
bun add express

# Añadir dependencia de desarrollo
bun add -d typescript

# Eliminar paquete
bun remove lodash

# Actualizar paquetes
bun update

Running scripts

# Ejecutar TypeScript directamente
bun run app.ts

# Ejecutar con modo watch
bun --watch run app.ts

# Ejecutar script de package.json
bun run dev

# Ejecutar script (atajo)
bun dev

HTTP server

// server.ts
const server = Bun.serve({
  port: 3000,
  fetch(request) {
    const url = new URL(request.url);

    if (url.pathname === "/") {
      return new Response("¡Hola Bun!");
    }

    if (url.pathname === "/json") {
      return Response.json({ message: "Hola" });
    }

    return new Response("No encontrado", { status: 404 });
  },
});

console.log(`Escuchando en http://localhost:${server.port}`);

File I/O

// Leer archivo
const file = Bun.file("./data.json");
const text = await file.text();
const json = await file.json();

// Escribir archivo
await Bun.write("./output.txt", "Hola Mundo");
await Bun.write("./data.json", JSON.stringify({ key: "value" }));

// Verificar si existe
const exists = await Bun.file("./data.json").exists();

Testing

// math.test.ts
import { describe, expect, test } from "bun:test";

describe("math", () => {
  test("2 + 2", () => {
    expect(2 + 2).toBe(4);
  });

  test("prueba async", async () => {
    const result = await Promise.resolve(42);
    expect(result).toBe(42);
  });
});
bun test
bun test --watch

Bundler

# Empaquetar para navegador
bun build ./src/index.ts --outdir ./dist

# Con minificación
bun build ./src/index.ts --outdir ./dist --minify

# Para Node.js
bun build ./src/index.ts --outdir ./dist --target node
// Empaquetado programático
const result = await Bun.build({
  entrypoints: ['./src/index.ts'],
  outdir: './dist',
  minify: true,
  splitting: true,
});

Next Steps