Zum Inhalt springen

Bun als Node.js-Ersatz: Schneller, einfacher, kompatibel?

Veröffentlicht am 12. Nov. 2025 | ca. 4 Min. Lesezeit |

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, https
  • require() und ES Modules
  • node_modules werden 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 install der 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.

Thomas Wunner

Thomas Wunner

Fachinformatiker für Anwendungsentwicklung mit Ausbildereignungsprüfung und über 14 Jahre Erfahrung im Aufbau skalierbarer Webanwendungen mit Symfony und Shopware. Abseits der Tastatur ist Thomas als Rettungsschwimmer in der Wasserwacht aktiv, legt als DJ auf und erkundet die Umgebung auf dem Motorrad.

Kommentare

Kommentare werden von Remark42 bereitgestellt. Beim Laden werden Daten an unseren Kommentar-Server übertragen.