Begriff
Node.js
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Backend-Nachtrag: Für absolute Anfänger ist Node.js dann verständlich, wenn zuerst klar ist, ob es sich um ein Werkzeug, eine Rolle, einen Ablauf oder einen Speicherort handelt. Schreibe dir diesen Begriff neben ein kleines Beispiel: Browser sendet Anfrage, Server verarbeitet sie, Datenbank speichert etwas, Antwort kommt zurück. Dadurch bekommt der Begriff einen Platz im Gesamtbild, statt nur wie ein weiteres Fremdwort zu wirken. JavaScript lief früher nur im Browser (Frontend) - für bunte Buttons und Animationen. 2009 hatte jemand eine Idee: "Warum nehmen wir den JavaScript-Motor aus Chrome raus und lassen ihn auf einem Server laufen?" Zack, Node.js war geboren. Jetzt kannst du mit derselben Sprache, mit der du Webseiten hübsch machst (JS), auch Datenbanken abfragen und Server bauen (Backend). Das war eine Revolution.
Merksatz: Eine Laufzeitumgebung, die es ermöglicht, JavaScript außerhalb des Browsers (z. B. auf Servern) auszuführen.
Praxis-Nachtrag: Nutze Node.js in einem Mini-Szenario. Eine kleine App soll einen Nutzer anmelden, eine Liste laden oder eine Bestellung speichern. Frage: An welcher Stelle taucht Node.js auf, was würde ohne diesen Baustein fehlen, und welchen Fehler würdest du als Anfänger wahrscheinlich sehen? Diese Denkweise macht den Begriff sofort greifbarer als eine reine Definition.
Wenn du Node.js installierst, hast du auch npm (Node Package Manager) dabei.
Das ist der größte "App Store" für Programmierer der Welt.
Du brauchst eine Bibliothek, um PDF-Dateien zu erstellen? npm install pdfkit. Fertig.
Millionen fertige Bausteine stehen kostenlos bereit.
Node ist extrem beliebt für Webserver (mit Express.js) und Echtzeit-Apps (Chats, Spiele), weil es sehr schnell auf viele gleichzeitige Anfragen reagiert.
1. V8 Engine
Node.js basiert auf V8, der JavaScript-Engine von Google Chrome. V8 kompiliert JS direkt in Maschinencode (sehr schnell). Node hat C++ Bindings hinzugefügt, damit JS Dinge tun kann, die es im Browser nicht durfte: Dateien auf der Festplatte lesen, Netzwerk-Sockets öffnen.
2. Event Driven (Nicht-Blockierend)
Der Clou an Node: Es wartet nicht. Klassischer Server (PHP): "Lese Datei..." (Server schläft 2 Sekunden) "...Datei da. Sende Antwort." Node.js: "Lese Datei. Ich mach solange was anderes!" (Verarbeitet 1000 andere User). "Ah, Datei ist da! Sende Antwort." Deshalb kann ein kleiner Node-Server 10.000 User gleichzeitig bedienen, wo andere Server zusammenbrechen.
1. Libuv und der Thread Pool
Node.js rühmt sich, "Single-Threaded" zu sein. Das ist eine Halbwahrheit.
Dein geschriebener JavaScript-Code (V8) und der Event-Loop laufen auf einem gigantischen Main Thread. Dort passiert Mathe und Kontrollfluss.
Das Problem: Wenn du eine Datei liest (fs.readFile) bremst das eigentlich den Thread. Warum blockiert Node nicht?
Wegen libuv (der in C geschriebenen C/C++ Bibliothek). Libuv unterhält unsichtbar einen Pool von (standardmäßig 4, konfigurierbaren) echten C-Worker-Threads. Die Festplattenoperation oder teure Crypto-Hashes werden in diesen Thread-Pool ausgelagert. Libuv erledigt die Schwerstarbeit im asynchronen Hintergrund und schmeißt das Ergebnis als Callback per Queue zurück in den V8 Main-Thread.
2. Event Loop Phases
Die Event-Loop ist nicht ein simpler Kreis, sie ist orchestriert in Phasen (Phases).
- Timers: Führt
setTimeout()aus, falls abgelaufen. - Pending Callbacks: Erledigt verzögerte System-Call Errors (TCP refused).
- Poll: Der wichtigste Block! Hier wartet Node aktiv eintreffende Web-Requests und I/O Operationen ab. Node verbringt hier oft 90% seiner Lebenszeit.
- Check: Führt
setImmediate()Callbacks extrem fix aus. - Close:
socket.on('close'). Das Unwissen vieler Node-Coder: Eine endlosewhile(true)-Schleife blockiert z.B. Phase 3 komplett. Weder Timers noch I/O werden je wieder gefeuert ("Event Loop blocked"), und der Webserver stirbt, obwohl die CPU auf 100% rattert.
3. CommonJS vs. ES Modules
Das Node-Ökosystem ist akut in einem Bürgerkrieg gespalten.
Anfangs existierte nur das proprietäre CommonJS. Syntax: const fs = require('fs'). ES lädt synchron zur Laufzeit.
Die Browser-Welt erfand später ESModules (ESM): import fs from 'fs'. ESM zwingt Engine und Parser zu einer vorherigen statischen statischen Analyse des gesamten Modul-Baums zur Compilezeit, weswegen man Module "Tree-Shaken" (toten Code eliminieren) kann, bevor der Code überhaupt losrennt.
Heute zwingt Node Entwickler, in der package.json über das Feld "type": "module" gnadenlos zu deklarieren, ob das gesamte Projekt CJS oder ESM spricht. Das mischen beider Welten endet oft in grauenhaften ERR_REQUIRE_ESM Crashes, was Library-Autoren zum Bau von Dual-Build Packages zwingt.
Quick-Check
Ist Node.js eine Programmiersprache?
Nein, es ist eine Laufzeitumgebung (Runtime) für die Sprache JavaScript. Wie ein Motor für den Treibstoff.Was ist Deno / Bun?
Moderne Konkurrenten zu Node.js. Sie wurden z. T. vom selben Erfinder entwickelt, um Designfehler von Node zu korrigieren (sicherer, schneller, TypeScript eingebaut). Aber Node ist immer noch der Platzhirsch.Warum nutzen Startups Node.js?
Weil man nur eine Sprache für alles braucht (Frontend + Backend). Man muss nicht Java-Entwickler UND JS-Entwickler einstellen. "JavaScript Everywhere".