Skip to main content

Node.js vs. Deno vs. Bun: Performance- und JavaScript-Runtime-Vergleich

Artikel von
feature node deno bun

5. September 2023

0 Min. Lesezeit

Warum die Wahl der richtigen JavaScript-Runtime wichtig ist

Mit JavaScript-Runtimes können Sie Anwendungscode außerhalb des Browsers ausführen. So lassen sich Websites als gehostete Anwendungen bereitstellen. JavaScript-Runtimes eignen sich auch für Skripte mit allgemeinem Verwendungszweck.

Die gewählte Runtime wirkt sich erheblich auf die Performance Ihrer Anwendungen aus. Die Geschwindigkeit bei der Verarbeitung von Anfragen und beim Datenbankzugriff kann stark variieren. Auch die einfache Entwicklung und die Skalierbarkeit hängen davon ab.

Node.js vs. Deno vs. Bun

Node.js

Node.js ist der unangefochtene Spitzenreiter unter den JavaScript-Runtimes und wurde von Stack-Overflow-Entwicklern 2023 zur beliebtesten Webtechnologie auf Platz 1 gewählt. Ryan Dahl entwickelte Node.js und veröffentlichte es 2009. Man kann mit Fug und Recht sagen, dass es die Möglichkeiten von JavaScript bei seiner Einführung revolutioniert hat. Damit können Entwickler:innen anspruchsvolle, backendgestützte Anwendungen mit JavaScript erstellen.

Heute gibt es ein riesiges Ökosystem rund um Node.js mit einer Fülle an Ressourcen und Bibliotheken.

Deno

Deno ist eine JavaScript-Runtime auf Basis von Rust. Wie Node.js wurde sie von Ryan Dahl entwickelt und veröffentlicht.

Ein Schwerpunkt liegt darauf, die Sicherheit von Node.js zu verbessern. In Deno muss der Zugriff auf Dateien, Netzwerke und Umgebungen ausdrücklich freigegeben werden. So werden Sicherheitsprobleme in diesen Bereichen unwahrscheinlicher. Deno unterstützt außerdem JSX und TypeScript besser und orientiert sich stärker an Webstandards. Für eine einfachere Bereitstellung werden Anwendungen als eigenständige ausführbare Datei ausgeliefert.

Auch rund um Deno gibt es ein Tooling-Ökosystem, mit dem Entwickler:innen ihre Projekte schnell starten können. Fresh ist ein Web-Framework für Deno und Lume der zugehörige Generator für statische Websites.

Bun

Bun ist die neueste Runtime, die um Ihre Aufmerksamkeit wirbt. Die auf Zig basierende All-in-one-Runtime und das Toolkit setzen auf Geschwindigkeit, Bundling, Tests und Kompatibilität mit Node.js-Paketen. Besonders attraktiv ist die nachweislich höhere Performance im Vergleich zu Node.js und Deno. Wenn Bun alle Versprechen einlöst, ist das Angebot äußerst reizvoll.

Als Performance-Beispiel zeigen die Bun-Maintainer einen Benchmark mit einem HTTP-Handler, der eine serverseitig gerenderte React-Seite ausliefert. Dabei verarbeitete Bun etwa 68.000 Anfragen pro Sekunde, verglichen mit rund 29.000 bei Deno und 14.000 bei Node.js. Das ist ein beachtlicher Unterschied. Jarred Sumner veröffentlicht regelmäßig Updates zur Entwicklung von Bun sowie aktuelle Benchmarks auf Twitter. Folgen Sie ihm also, um auf dem Laufenden zu bleiben.

Bun bietet außerdem Bundling- und Task-Runner-Funktionen für JavaScript- und TypeScript-Projekte. Wie Deno liefert es einzelne Binärdateien aus und unterstützt Web-APIs. Dank npm-Kompatibilität unterstützt es auch einige Node.js-Bibliotheken.

JavaScript-Runtimes im Vergleich

Sehen wir uns die Unterschiede genauer an und vergleichen Performance, Support und Community, Stabilität, Sicherheit und zusätzliche Funktionen.

Performance und Geschwindigkeit

Kommen wir gleich zum Punkt: Bun gewinnt. Wie bereits erwähnt, ist die Performance beeindruckend: Bun verarbeitet eine hohe Zahl an Anfragen pro Sekunde. Ähnlich sieht es bei Datenbankoperationen aus. Die durchschnittliche Zahl der Abfragen pro Sekunde beim Laden der Northwind-Datenbank für SQLite mit Buns Benchmark-Beispiel beträgt:

Runtime

Durchschnittliche Abfragen pro Sekunde

Node.js

21,29

Deno

43,50

Bun

81,37

In einem weiteren Vergleich von Node.js, Deno und Bun ist Bun bei der Verarbeitung gleichzeitiger Verbindungen am schnellsten. Auch die Zahl der Anfragen pro Sekunde ist deutlich höher. Bei 10 gleichzeitigen Verbindungen verarbeitet Bun beispielsweise 110.000 Anfragen pro Sekunde, Node.js 60.000 und Deno 67.000. Dieser Trend setzt sich bei einer höheren Zahl gleichzeitiger Verbindungen fort – ebenso bei der Performance der einzelnen Runtimes.

Warum ist Bun so viel schneller als Node?

Auch wenn es unterschiedliche Ansichten zur Aussagekraft der verwendeten Performance-Tests gibt, bleibt Bun der Gewinner. Node.js liegt in allen Vergleichen auf dem letzten Platz und schneidet besonders bei der Datenbankgeschwindigkeit schlecht ab. Deno und Node.js liegen meist nicht allzu weit auseinander, während Bun sie deutlich übertrifft. Bei Node.js gibt es hier zwar Nachholbedarf, doch Yagiz Nizipli treibt Verbesserungen in verschiedenen Bereichen voran, etwa eine um etwa 80–90 % schnellere URL-Analyse.

Sie können die Bun-Performance-Tests auch in Ihrer eigenen Umgebung ausführen und die Leistung in folgenden Szenarien prüfen:

Die Entwickler von Bun haben der Geschwindigkeit große Bedeutung beigemessen. Bun nutzt JavaScriptCore, die Engine von Safari. Deno und Node.js hingegen verwenden beide dieselbe V8-JavaScript-Engine wie Chrome.

Bun ist nicht nur auf hohe Ausführungsgeschwindigkeit ausgelegt, sondern soll auch schnell starten – selbst wenn Sie mehrere Instanzen gleichzeitig starten. Das macht Bun zu einer guten Wahl für Anwendungen, die dynamisch skaliert werden. Bei einem plötzlichen Anstieg des Datenverkehrs lassen sich schnell neue Instanzen erstellen, damit Ihre Dienste möglichst rasch verfügbar sind.

Support und Community

Alle drei Projekte sind Open Source, werden aber nicht ausschließlich von der Community unterstützt. Node.js wird von der OpenJS Foundation getragen und basiert vollständig auf Community-Beiträgen und ehrenamtlichem Engagement. Deno und Bun hingegen werden von gewinnorientierten Unternehmen und VC-finanzierten Projekten unterstützt.

Node.js verfügt über ein etabliertes Ökosystem und eine große Community. Für jeden Anwendungsfall finden Sie online Unterstützung. Deno und Bun sind deutlich jünger, daher gibt es weniger Supportmaterial. Trotzdem tauschen sich viele engagierte Entwickler:innen gerne aus und teilen ihr Wissen. Außerdem bietet Deno 1.28 eine bessere Kompatibilität mit npm-Paketen, was Entwickler:innen den Umstieg von Node.js erleichtert.

Die folgende Tabelle zeigt, wie viele Fragen auf Stack Overflow für die einzelnen Runtimes markiert sind (Stand: Dezember 2024):

Runtime

Markierte Fragen

Node.js

475028

Deno

1105

Bun

264

Balkendiagramm zur Nutzung von JavaScript-Runtimes: Node.js 27.976, Browser 24.369, Service Worker 5.316, Deno 3.344, Bun 1.263, Hermes 884, ChakraCore 113.

Jedes Jahr erscheint eine Entwicklerumfrage namens State of JavaScript. Eine der Fragen befasst sich damit, welche Runtimes die Teilnehmenden regelmäßig verwenden. Fast 30.000 Personen haben geantwortet. Auch die Umfrageergebnisse von 2022 zeigen Node.js als klaren Spitzenreiter: Deno lag mit rund 5.300 Stimmen dahinter, Bun erhielt etwa 1.200 Stimmen.

Die Ergebnisse der State of JavaScript 2024-Umfrage zeigen, wie Bun schnell aufholte und Deno überholte. Bei den Präferenzen liegt Bun jetzt klar auf Platz 2 hinter Node.js:

Die offizielle Node.js-Dokumentation umfasst verschiedene Leitfäden, eine umfangreiche API-Referenz und Informationen zum Einstieg. Außerdem enthält sie Angaben zu den Abhängigkeiten.

Auf der Deno-Website finden Sie ein ausführliches Handbuch, das Ihnen den Einstieg in die Runtime und ihren Einsatz in Ihren Projekten erleichtert. Darüber hinaus gibt es Informationen zur Standardbibliothek, die Entwickler:innen sofort verwenden können.

Stabilität

Als etablierter Anbieter bietet Node.js eine bewährte Performance und kommt auf 2,1 Prozent aller Websites weltweit zum Einsatz. Seit der Version 1.0 im Mai 2020 hat Node.js die Developer Experience kontinuierlich verbessert und zugleich die Stabilität bei jeder Veröffentlichung gewährleistet. So können Entwickler:innen mit kaum oder gar keinen Auswirkungen auf neuere Versionen aktualisieren.

Bun ist derzeit in Version 1.1.42 verfügbar. Neue Releases erscheinen teils im Abstand von nur wenigen Wochen und ergänzen weitere Funktionen, Fehlerbehebungen sowie Kompatibilität mit der Node.js-Core-Runtime.

Sicherheit

Beim Abhängigkeitsmanagement mit npm kann die Sicherheit schwach ausgeprägt sein. Auch beim Entwickeln von Anwendungen auf Basis von Node.js gibt es allgemeine Sicherheitsfallen. Ein wichtiger Grund für die Entwicklung von Deno war daher, eine sicherere Runtime zu schaffen. Dazu setzt Deno auf präzise Zugriffskontrollen für sensible APIs, etwa für Netzwerkanfragen, Dateisystemoperationen und andere zentrale Funktionen. Node.js liegt in diesem Bereich nicht weit zurück: Mit Node.js 20 wurde ein Berechtigungsmodell eingeführt, das ähnliche Sicherheitsfunktionen wie Deno bietet.

Wenn Entwickler:innen über häufige Fehler und Best Practices bei Node.js informiert sind, können sie sicherere Node.js-Anwendungen erstellen.

Deno begegnet einigen Sicherheitsrisiken von Node.js, indem es für bestimmte Aktionen in der laufenden Anwendung eine ausdrückliche Berechtigung verlangt. Damit Ihre Anwendung beispielsweise Dateien lesen kann, müssen Sie sie beim Start mit dem Flag --allow-read ausführen. Eine vollständige Liste finden Sie in der Berechtigungsdokumentation. Sie können zur Laufzeit auch mit diesem Berechtigungssystem arbeiten und Berechtigungen programmatisch anfordern oder widerrufen. Achten Sie bei Verwendung des Flags --allow- auf Unterprozesse: Die gestarteten Unterprozesse unterliegen nicht denselben Sicherheitsbeschränkungen wie der Deno-Prozess und können die Deno-Sandbox umgehen, was zu einer Ausweitung von Berechtigungen führen kann.

Zusätzliche Funktionen

Node.js hat einige Funktionen eingeführt, um stärker mit den Möglichkeiten von Deno und Bun Schritt zu halten. So gibt es jetzt einen integrierten Test-Runner und experimentelle integrierte TypeScript-Unterstützung.

Deno bietet einen Abhängigkeitsinspektor und einen Code-Formatter. Auch die Möglichkeit, eine einzelne ausführbare Datei bereitzustellen, ist ein Pluspunkt. Die in der Dokumentation beschriebene grundlegende Methode zum Einrichten eines Servers mit Deno sieht vor, Code aus anderen Quellen einzubinden. Der Code ist nicht viel komplizierter als bei Node.js, kann sich aber etwas anders anfühlen, da Abhängigkeiten über URLs geladen werden.

Hier ein gekürztes Beispiel für den Code:

import { serve } from "https://deno.land/std@0.198.0/http/server.ts";

const handler = async (_request: Request): Promise<Response> => {
  const resp = await fetch("https://api.github.com/users/denoland", {
    // The init object here has an headers object containing a
    // header that indicates what type of response we accept.
    // We're not specifying the method field since by default
    // fetch makes a GET request.
    headers: {
      accept: "application/json",
    },
  });

  return new Response(resp.body, {
    status: resp.status,
    headers: {
      "content-type": "application/json",
    },
  });
};

serve(handler);

Zu den zusätzlichen Funktionen von Bun gehören ein Transpiler und ein Paketmanager. Wie der Name schon andeutet, gibt es auch Bundling-Funktionen. Damit erhalten Sie Funktionen, für die Sie sonst ein weiteres Tool wie Snowpack oder rollup.js benötigen würden. Außerdem lassen sich mit dem JavaScript-Minifier ungenutzte Codeabschnitte entfernen.

Wenn Sie Bun als Task-Runner verwenden, ist die Geschwindigkeit ein großer Vorteil. Laut eigenen Angaben dauert der Start etwa 5 Millisekunden statt etwa 25 Millisekunden bei Node.js. Der Unterschied mag gering erscheinen. Bei mehreren Aufgaben, die Sie regelmäßig ausführen, kann er Ihren Entwicklungsworkflow jedoch deutlich beschleunigen.

Sollten Sie Bun, Deno oder Node.js verwenden?

Bei der Geschwindigkeit ist Bun eindeutig der Gewinner. Da die Kompatibilität mit Node.js aber noch durch Updates verbessert wird, birgt der Einsatz in Produktionsumgebungen Risiken. Wird Bun ebenso stabil wie die beiden anderen? Vielleicht. Wenn Sie mit überlegener Geschwindigkeit die Konkurrenz hinter sich lassen wollen, bietet Bun in den meisten Szenarien diese Chance.

Der große Vorteil von Node.js liegt in seiner Reife und der Größe seines Ökosystems. Viele Entwickler:innen kennen sich damit aus. Deno und Bun wiederum sind neuer – und das begeistert Entwickler:innen oft.

Deno bietet ebenfalls viele Vorteile gegenüber Node.js. Der Funktionsumfang erleichtert die Entwicklung und macht es einfach, komplexe Projekte in hoher Qualität umzusetzen. Deno ist sicher und schneller als Node.js, aber etwas langsamer als Bun.

Insgesamt ist Node.js weiterhin die sicherste Wahl und kann auf eine bewährte Erfolgsgeschichte verweisen. Deno hat viele Vorzüge: Dank moderner Funktionen eignet es sich gut für Entwickler:innen, die etwas Neues entwickeln möchten. Bun ist das richtige Tool, wenn für Sie vor allem die Geschwindigkeit zählt oder Sie mit der neuesten Technologie arbeiten möchten.

Snyk stellt die Developer Experience in den Mittelpunkt

Erfahren Sie, warum die Developer Experience so wichtig ist und wie Snyk sie mit unseren neuesten Funktionen noch reibungsloser gestaltet.

Gepostet in: