Bun ist eine JavaScript-Runtime, die Node.js ersetzen will. Das Versprechen: schnellere Starts, schnellere Builds, weniger Tools. Aber wie sieht das in der Praxis aus?
Installation
Bun lässt sich mit einem Befehl installieren:
# macOS, Linux, WSL
curl -fsSL https://bun.sh/install | bash
# Windows (PowerShell)
powershell -c "irm bun.sh/install.ps1 | iex"
# Homebrew
brew install oven-sh/bun/bun
Nach der Installation ist bun im Terminal verfügbar:
bun --version
Erste Schritte
Bun kann Node.js-Projekte direkt ausführen:
bun run index.ts
TypeScript funktioniert ohne Konfiguration. Kein ts-node, kein tsconfig.json für einfache Skripte.
Neues Projekt erstellen:
bun init
Das erzeugt eine minimale Projektstruktur mit package.json, tsconfig.json und einer index.ts.
Befehle im Vergleich
| Aktion | Node.js | Bun |
|---|---|---|
| Skript ausführen | node index.js | bun index.js |
| TypeScript ausführen | npx ts-node index.ts | bun index.ts |
| Dependencies installieren | npm install | bun install |
| Paket hinzufügen | npm install express | bun add express |
| Dev-Dependency | npm install -D vitest | bun add -d vitest |
| Skript aus package.json | npm run dev | bun run dev |
| Tests ausführen | npm test | bun test |
Die Befehle sind ähnlich genug, dass der Wechsel leicht fällt.
Migration von Node.js
Für die meisten Projekte reicht es, npm durch bun zu ersetzen:
# Statt npm install
bun install
# Statt npm run dev
bun run dev
Bun erstellt eine bun.lockb (Binär-Lockfile) statt package-lock.json. Beide können parallel existieren.
Was funktioniert:
- Express, Fastify, Hono
- Prisma, Drizzle
- React, Vue, Svelte
- Die meisten npm-Pakete
Was Probleme machen kann:
- Native Node.js-Addons (C++-basiert)
- Pakete, die
node-gypbrauchen - Sehr alte Pakete mit veralteten APIs
package.json Scripts
Bun führt Scripts schneller aus, weil kein separater Prozess gestartet wird:
{
"scripts": {
"dev": "bun --watch src/index.ts",
"build": "bun build src/index.ts --outdir dist",
"test": "bun test"
}
}
Der --watch Flag startet den Server bei Dateiänderungen neu.
Integrierter Test-Runner
Bun bringt einen Jest-kompatiblen Test-Runner mit:
// math.test.ts
import { expect, test } from "bun:test";
test("addition", () => {
expect(2 + 2).toBe(4);
});
bun test
Die meisten Jest-Matcher funktionieren. Mocking ist eingebaut.
Wann lohnt sich der Wechsel?
Gute Kandidaten:
- Neue Projekte ohne Legacy-Abhängigkeiten
- TypeScript-Projekte (kein Setup nötig)
- Skripte und CLI-Tools
- APIs mit modernen Frameworks (Hono, Elysia)
Besser bei Node.js bleiben:
- Projekte mit vielen nativen Addons
- Enterprise-Umgebungen mit strikten Vorgaben
- Wenn das Team Node.js gut kennt und Bun nicht
Hybride Nutzung: Bun für lokale Entwicklung, Node.js für Production – funktioniert oft problemlos.
Performance-Unterschiede
Die oft zitierten “4x schneller”-Zahlen beziehen sich auf Startzeiten und bestimmte Operationen. In der Praxis:
- Spürbar schneller:
bun install, Skript-Starts, Tests - Ähnlich schnell: HTTP-Server unter Last (I/O-bound)
- Manchmal langsamer: Spezielle Node.js-Optimierungen
Für die meisten Projekte ist der Performance-Unterschied angenehm, aber nicht der Hauptgrund für den Wechsel.
Weiterführend: Für performante Web-APIs mit Bun siehe Ultra-performante Web-APIs mit Hono.