Was Node eigentlich ist
Die Node.js Runtime ist letztlich nichts anderes als ein Programm, das du auf deinem Rechner installierst, um JavaScript-Dateien auszuführen. Das ist die einfachste Beschreibung – und sie trifft es genau. Wenn du node script.js in die Konsole tippst, liest Node die Datei ein, reicht sie an Googles V8-Engine weiter (also die JavaScript-Engine aus Chrome) und führt den Code aus. Dazu kommt eine umfangreiche Bibliothek zusätzlicher APIs für all die Dinge, die V8 von sich aus nicht kann.
V8 kann JavaScript ausführen. Aber V8 kann keine Datei öffnen, keinen TCP-Socket abhören, keinen Prozess starten und keine Umgebungsvariable auslesen. Genau diese Funktionen liefert Node – in C++ geschrieben – und stellt sie deinem JavaScript als eingebaute Module zur Verfügung.
node --version
node script.js
Node ist keine Programmiersprache. Und auch kein Framework. Node ist eine Runtime: die V8-Engine plus eine Standardbibliothek plus ein Modulsystem plus eine Event Loop. Mehr steckt nicht dahinter.
Das erste Node-Skript
Jede .js-Datei ist bereits ein lauffähiges Node-Programm – ohne Boilerplate und ohne main-Funktion:
console.log funktioniert genauso wie im Browser. Template Literals, Date, Arrays, Promises – all die Sprachfeatures, die du schon kennst, kommen von der V8 Engine und verhalten sich absolut identisch. Was sich in Node ändert, ist das, was drumherum verfügbar ist.
Globale Objekte, die es nur in Node.js gibt
Im Browser hast du window, document, localStorage und fetch. Node.js bringt dagegen ein anderes Set an globalen Objekten mit – zugeschnitten auf seine Rolle als serverseitige Runtime:
processist der laufende Node-Prozess. Darüber bekommst du Zugriff auf Umgebungsvariablen (process.env), Kommandozeilenargumente (process.argv) und Methoden zum Beenden (process.exit(1)).__filenameund__dirnameliefern dir den absoluten Pfad der aktuellen Datei bzw. ihres Ordners. (In ES-Modulen gibt es die beiden nicht — dort nutzt du stattdessenimport.meta.url.)globalist das Top-Level-Objekt, quasi das Node-Pendant zuwindow.
Ein document oder window gibt es nicht. Wer sie trotzdem verwendet, bekommt einen ReferenceError. Genau das ist meistens der erste Hinweis darauf, dass eine Library für den Browser geschrieben wurde und in Node so nicht läuft.
Kommandozeilenargumente und Umgebungsvariablen
Ein riesiger Teil dessen, wofür Node eingesetzt wird — CLIs, Build-Skripte, Server — muss Argumente und Umgebungsvariablen auslesen. Beides findest du auf process:
process.argv ist ein Array: Die ersten beiden Einträge enthalten den Pfad zur Node-Binary und den Pfad zum Skript – die eigentlichen Argumente beginnen also erst bei Index 2. process.env ist ein schlichtes Objekt mit allen Umgebungsvariablen. Daraus NODE_ENV, PORT oder API-Keys auszulesen, ist in Node.js gängige Praxis.
Built-in-Module in Node.js
Node.js bringt eine umfangreiche Standardbibliothek mit, die du per require (CommonJS) oder import (ESM) einbindest. Die Modulnamen beginnen mit dem Präfix node:, damit auf den ersten Blick klar ist, dass es sich um ein eingebautes Modul handelt:
Die Module, die du am häufigsten brauchst:
node:fs— Dateien lesen und schreiben. Für die async/await-Variante gibt esnode:fs/promises.node:path— Pfade plattformübergreifend zusammensetzen, auflösen und zerlegen.node:http/node:https— HTTP-Server bauen und Requests absetzen.node:url— URLs parsen und konstruieren.node:os— Infos über den Host-Rechner.node:crypto— Hashing, Zufallsbytes, Verschlüsselung.
Diese Module musst du nicht installieren — sie sind in Node.js bereits enthalten. Alles andere holst du dir über npm.
Die Node.js Event Loop kurz erklärt
Node führt dein JavaScript in einem einzigen Thread aus, erledigt aber trotzdem viele Dinge gleichzeitig. Möglich macht das die Event Loop. Sobald du etwas Asynchrones aufrufst — einen Dateizugriff, einen HTTP-Request, einen Timer — reicht Node die eigentliche Arbeit ans Betriebssystem (oder an seinen Thread Pool) weiter und läuft selbst weiter. Ist die Arbeit fertig, landet ein Callback in der Queue, und die Loop greift ihn sich, sobald der aktuelle Code durchgelaufen ist.
Die Ausgabe erscheint in der Reihenfolge 1, 4, 2, 3. Zuerst läuft der synchrone Code durch. Danach kommen die Microtasks (also aufgelöste Promises) an die Reihe, und erst zum Schluss die Timer. Genau deshalb legt eine langsame, CPU-lastige Schleife deinen kompletten Server lahm — für deinen Code steht nur ein einziger Thread zur Verfügung. Nebenläufigkeit bedeutet in Node.js I/O, nicht Rechenarbeit.
Ein minimaler HTTP-Server
Der Lohn für die ganze Theorie: Ein funktionierender Webserver passt in wenige Zeilen:
Kein Framework, keine Abhängigkeiten. createServer erwartet eine Funktion, die bei jedem Request ausgeführt wird; listen startet den Event Loop, der eingehende Verbindungen abarbeitet. Echte Anwendungen setzen Express oder Fastify darauf, aber darunter steckt immer das gleiche eingebaute http-Modul.
Node.js vs. Browser: Was läuft wo?
Es lohnt sich, klar zu benennen, was in beiden Welten funktioniert – und was eben nicht:
| Funktioniert in beiden | Nur in Node | Nur im Browser |
|---|---|---|
Sprachfeatures (Klassen, Promises, async/await) | fs, http, process, __dirname | window, document, DOM |
console.log | CommonJS require und Node-spezifische ESM-Eigenheiten | localStorage, sessionStorage |
fetch (ab Node 18) | Zugriff auf Dateisystem und Netzwerk-Sockets | User-Events, Rendering |
setTimeout, setInterval | Kindprozesse, Streams | History API, navigator |
Modernes Node hat inzwischen einige Browser-APIs übernommen – fetch, URL, AbortController, structuredClone – die Lücke ist also kleiner als früher. Das DOM wird aber nicht nach Node kommen, und das Dateisystem nicht in den Browser.
Node vs. Deno vs. Bun
Node ist der Standard, aber längst nicht mehr die einzige JavaScript-Runtime. Deno und Bun sind Alternativen – Deno stammt vom ursprünglichen Node-Erfinder, Bun von einem jüngeren Team, das vor allem auf Geschwindigkeit setzt. Beide führen JavaScript (und TypeScript direkt, ohne Umweg) aus, bringen Tools wie Testrunner und Bundler von Haus aus mit und unterscheiden sich von Node vor allem beim Umgang mit Modulen, Berechtigungen und der Paketinstallation.
Wenn du JavaScript lernst, ist Node aber weiterhin der Ort, an dem Doku, Tutorials und Stellenausschreibungen zu finden sind. Die Konzepte – Event Loop, Module, eingebaute APIs – lassen sich fast vollständig auf die anderen Runtimes übertragen. Lern also zuerst Node; zu den anderen greifst du, wenn ein Projekt es verlangt.
Skripte schnell ausführen
Ein paar Wege, wie du deinen Code beim Entwickeln wirklich zum Laufen bringst:
# Eine Datei ausführen
node script.js
# Einen Einzeiler ausführen
node -e "console.log(2 ** 10)"
# Die REPL öffnen (interaktive Eingabeaufforderung)
node
# Eine Datei beobachten und beim Speichern erneut ausführen (Node 18.11+)
node --watch script.js
Die REPL ist ein praktischer Notizblock, wenn du schnell prüfen willst, was eine Methode zurückgibt, ohne extra eine Datei anzulegen. --watch ist während der Entwicklung Gold wert – speichern, und Node startet dein Skript automatisch neu.
Als Nächstes: Fehler abfangen
Code auszuführen ist das eine – ihn sauber zu behandeln, wenn etwas schiefgeht, das andere. Dateizugriffe schlagen fehl, HTTP-Requests laufen in Timeouts, JSON-Parsing wirft Fehler. Im nächsten Kapitel geht es um try/catch, Fehlertypen und die gängigen Muster, um mit Dingen umzugehen, die kaputtgehen – und in einem Node-Programm geht früher oder später alles mal kaputt.
Häufig gestellte Fragen
Was ist die Node.js Runtime überhaupt?
Node.js ist ein Programm, das JavaScript außerhalb des Browsers ausführt. Unter der Haube steckt Googles V8-Engine (dieselbe, die JS auch in Chrome ausführt), kombiniert mit einer C++-Schicht, die Funktionen bereitstellt, die V8 selbst nicht mitbringt — Dateisystemzugriff, Netzwerk, Prozesse, Timer. Erst diese Kombination erlaubt es, Server, CLIs und Build-Tools in JavaScript zu schreiben.
Wo liegt der Unterschied zwischen Node und dem Browser?
Beide führen JavaScript aus, aber die APIs drumherum sind andere. Der Browser stellt dir window, document und das DOM zur Verfügung. Node liefert process, fs, http, __dirname und das Modulsystem via CommonJS bzw. ESM. In Node gibt es kein DOM, im Browser kein Dateisystem — die Sprache ist gleich, die Plattform nicht.
Ist Node.js ein Framework oder eine Runtime?
Eine Runtime. Node selbst gibt dir keinerlei Anwendungsstruktur vor — es führt einfach nur JavaScript aus und stellt APIs bereit. Frameworks wie Express, Next.js oder NestJS setzen auf Node auf. Deno und Bun sind alternative JavaScript-Runtimes, die Node Konkurrenz machen, aber im Prinzip denselben Job erledigen.
Was ist der Event Loop in Node?
Der Event Loop ist das, was Node erlaubt, viele Dinge gleichzeitig auf einem einzigen Thread zu verarbeiten. Sobald du etwas Asynchrones aufrufst — etwa einen Dateizugriff, einen HTTP-Request oder ein setTimeout — gibt Node die Arbeit ans Betriebssystem ab und macht weiter. Ist die Arbeit fertig, landet der Callback in einer Queue und der Event Loop greift ihn auf. Genau deshalb blockiert fs.readFile nicht den Rest deines Programms.