Bun ist seit Version 1.0 (September 2023) produktionsbereit und hat in der JavaScript-Community für Aufsehen gesorgt. Die Versprechen: schneller als Node.js, kompatibel mit npm-Packages, kein TypeScript-Transpiler nötig, und ein einzelnes Binary, das Package Manager, Test-Runner, Bundler und Runtime in einem vereint.
Was ist Bun?
Bun ist eine JavaScript-Runtime, die auf JavaScriptCore (WebKit) anstatt V8 (Node.js, Chrome) basiert und in Zig geschrieben ist. Es implementiert die Web Platform APIs (Fetch, WebSocket, etc.) und ist größtenteils Node.js-kompatibel.
Im Gegensatz zu Node.js, wo npm, npx, Jest oder Vitest, und Webpack/Vite separate Tools sind, kommt Bun mit allem:
bun install → npm install
bun run → npm run
bun test → Jest/Vitest
bun build → Bundler (Webpack/Vite-Alternative)
bun x → npx
Performance-Vergleich
Bun ist in vielen Benchmarks deutlich schneller als Node.js:
| Operation | Node.js | Bun |
|---|---|---|
npm install (cold) |
100% (Baseline) | ~2-3x schneller |
| HTTP-Server (req/s) | ~50.000 | ~90.000 |
| TypeScript-Ausführung | Erst transpilieren | Direkt |
| Test-Runner | Jest: langsam | Bun: sehr schnell |
Die Zahlen sind projektabhängig, aber der Trend ist klar: Bun ist schneller, besonders beim Package-Install und beim Starten von Skripten.
Node.js-Kompatibilität
Bun implementiert die wichtigsten Node.js APIs:
fs,path,os,crypto,http,httpsrequire()und ES Modulesnode_moduleswerden unterstützt.env-Dateien werden automatisch geladen- TypeScript und JSX direkt ausführbar
Was noch nicht vollständig unterstützt wird:
- Einige native npm-Pakete mit C++ Addons
- Worker Threads (teilweise)
- Einige less-used Node.js APIs
Bun im Alltag
Package Manager
# Initialisieren
bun init
# Package installieren
bun add express
bun add -d typescript @types/node
# Packages deinstallieren
bun remove express
# Pakete aktualisieren
bun update
# Scripts ausführen
bun run dev
bun run build
bun install erzeugt eine bun.lockb-Datei (binäres Lockfile, sehr schnell) statt package-lock.json.
TypeScript direkt ausführen
Node.js benötigt TypeScript-Transpilierung:
# Node.js: TypeScript kompilieren, dann ausführen
npx tsc && node dist/index.js
# oder
npx ts-node src/index.ts # Langsam
Bun führt TypeScript direkt aus:
# Bun: direkt
bun src/index.ts
bun run src/index.ts
Integrierter Test-Runner
// math.test.ts
import { expect, test, describe } from "bun:test";
describe("Math utilities", () => {
test("adds two numbers", () => {
expect(1 + 1).toBe(2);
});
test("async operation", async () => {
const result = await Promise.resolve(42);
expect(result).toBe(42);
});
test("snapshot test", () => {
expect({ name: "Bun", version: "1.0" }).toMatchSnapshot();
});
});
bun test
bun test --watch
bun test --coverage
Die API ist Jest-kompatibel — vorhandene Jest-Tests laufen in den meisten Fällen ohne Änderungen.
HTTP-Server
// server.ts
const server = Bun.serve({
port: 3000,
fetch(request: Request): Response {
const url = new URL(request.url);
if (url.pathname === "/") {
return new Response("Hallo von Bun!");
}
if (url.pathname === "/api/health") {
return Response.json({ status: "ok", runtime: "bun" });
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`Server läuft auf http://localhost:${server.port}`);
bun run server.ts
Bun mit Express
Da Bun Node.js-kompatibel ist, funktioniert Express direkt:
import express from "express";
const app = express();
app.use(express.json());
app.get("/", (req, res) => {
res.json({ message: "Hello from Bun + Express!" });
});
app.listen(3000, () => {
console.log("Server running on port 3000");
});
bun add express @types/express
bun run app.ts
Bun in DDEV
Für DDEV-Projekte, die Bun nutzen möchten:
# .ddev/config.yaml
hooks:
post-start:
- exec: "curl -fsSL https://bun.sh/install | bash"
Oder als Custom Command:
# .ddev/commands/web/bun
#!/bin/bash
## Description: Run bun commands inside DDEV
## Usage: bun [args]
## Example: ddev bun install
bun "$@"
Da Bun in DDEV nicht standardmäßig installiert ist, ist es derzeit einfacher, für den Build-Prozess bei Node.js/npm zu bleiben und Bun nur in Projekten einzusetzen, wo der Build außerhalb von DDEV läuft.
Wann Bun verwenden?
Bun ist ideal für:
- Neue Projekte, die nicht an Node.js gebunden sind
- Projekte mit vielen TypeScript-Dateien (kein Transpile-Schritt)
- Serverless Functions (schneller Cold Start)
- CLI-Tools in TypeScript/JavaScript
- Projekte, wo
npm installder Flaschenhals im CI ist
Bei Node.js bleiben, wenn:
- Native npm-Pakete mit C++ Addons genutzt werden
- Das Team Node.js kennt und Bun keine signifikanten Vorteile bringt
- Das Deployment-Ziel Node.js voraussetzt (z.B. AWS Lambda Node.js-Umgebung)
- Komplexe webpack-Konfigurationen vorhanden sind, die migriert werden müssten
Fazit
Bun ist real, schnell und stabil. Für neue Projekte ohne Legacy-Bindungen ist es eine attraktive Alternative zu Node.js — besonders wegen TypeScript-First-Experience und dem integrierten Test-Runner. Für bestehende Projekte lohnt sich die Migration vor allem, wenn npm install-Zeiten oder TypeScript-Transpilierung Schmerzpunkte sind.
Kommentare
Kommentare werden von Remark42 bereitgestellt. Beim Laden werden Daten an unseren Kommentar-Server übertragen.