Einführung

Was ist Node.js?

Node.js ist eine serverseitige JavaScript-Plattform zur Realisierung von Webservern. Node.js wird dabei in der JavaScript-Laufzeitumgebung „V8“ ausgeführt. Im Zusammenspiel mit V8 lassen sich ressourcensparende Anwendungen mit vielen gleichzeitig bestehenden Netzwerk-verbindungen realisieren. Node.js wurde 2009 vom Webentwickler Ryan Dahl veröffentlicht, wird heute von der OpenJS-Foundation weiterentwickelt und ist auf verschiedenen Plattformen als Open-Source-Software unter der MIT-Lizenz verfügbar.

Verwendete Technologien

JavaScript

JavaScript ist eine Skriptsprache, die 1995 von Netscape entwickelt wurde. Mit JavaScript kann der Inhalt von Webseiten generiert, verändert und nachgeladen werden. JavaScript ermöglicht es so dynamische zur Laufzeit auf Benutzer-aktionen zu reagieren.

V8

V8 ist eine von Google Inc. entwickelte freie Software, zur Ausführung von JavaScript-Code. V8 wird seit 2006 für Google‘s Webbrowser Chrome entwickelt, kann aber auch unabhängig davon verwendet werden. Das Ziel von V8 ist es die Ausführung von JavaScript-Code zu beschleunigen. Dies wird u. a. dadurch erreicht, dass der JavaScript-Code zur Laufzeit durch Just-in-time-Kompilierung vor der Ausführung in nativen Maschinencode übersetzt wird.

NPM

npm (anfangs Node Package Manager) ist der Paketmanager für Node.js der von der npm Inc. aus Kalifornien entwickelt wird. Ein Paketmanager ermöglicht die komfortable Verwaltung von Softwarepaketen auf Betriebssystemen. Der Paketmanager npm übernimmt die Installation, Aktualisierung und Deinstallation der mit Node.js verwendeten Module. Dazu werden in einem globalen Repository mehrere hunderttausend Module unter einer freien Lizenz bereitgestellt. Seit März 2020 gehört npm zu GitHub, welches wiederum zu Microsoft gehört.

Funktionsweise

Ereignissteuerung

Die Verwendung von JavaScript ermöglicht Node.js eine ereignisgesteuerte Architektur. Das hat im Serverbetrieb den Vorteil, pro Verbindung weniger Arbeitsspeicher zu benötigen, als anderen Servertechnologien, die für jede Verbindung einen eigenen Thread verwenden.

Nonblocking I/O

Node.js verwendet außerdem eine sog. „nonblocking I/O“, das heißt einen nicht blockierenden Input/Output Zugriff auf das Netzwerk, das Dateisystem und auf Datenbanken. Obwohl Node.js selbst nur einen Thred verwendet kann es solche Zugriffe parallel zu anderen Aufgaben behandeln. Dafür delegiert Node.js die Input/Output-Zugriffe an das Betriebs-system bzw. die entsprechende Datenbank und registriert sog. Callbacks, mit denen das Betriebssystem bzw. die entsprechende Datenbank Node.js mitteilt, wenn die entsprechende Aufgabe abgearbeitet worden ist.

Modularisierung

Node.js ist modular aufgebaut und verwendet den Paketmanager npm zur Verwaltung seiner Module. Der Paketmanager npm berücksichtigt dabei Abhängigkeiten zwischen den Modulen und übernimmt die Installation, Aktualisierung, Löschung und Kompilierung von Binärmodulen. Einige Module sind in das Binärpaket der Installation integriert. Zusätzlich können mehrere hunderttausende Module eines globalen Repositorys mit Hilfe von npm eingebunden werden.

Architektur

Node.js verwendet verschiedene Schichten zur Abarbeitung von Server-Anfragen. So ist die Ereignissteuerung in einer eigenen Schicht angesiedelt, welche die verschiedenen Anfragen koordiniert. Da von Hause aus JavaScript nicht auf das Dateisystem oder Datenbanken zugreifen kann wurde Node.js um die Node.js-Core-Schicht erweitert, welche in C++ geschrieben ist und diese Zugriffe mit Hilfe von sog. Wrappern realisiert. Da der Node.js-Core nur einen Thread besitzt, d. h. immer nur eine Aufgabe gleichzeitig abarbeiten kann, muss die Ereignissteuerung dafür sorgen, dass Anfragen solange in die Warteschlagen kommen, bis der Thread im Node.js-Core wieder frei ist. Um dennoch parallele Zugriffe auf das Dateisystem oder Datenbanken zu realisieren delegiert der Node.js-Core solche Zugriffe an das Betriebssystem bzw. die entsprechende Datenbank und registriert für die Rück-meldung sog. Callbacks:

Versionierung

Für Node.js gibt es alle sechs Monate (April und Oktober) eine neue Hauptversion. Für die geradzahligen April-Versionen gibt es einen Long-Time-Support (LTS) für 18 weitere Monate nach Veröffentlichung der nachfolgenden Version mit ungerader Versionsnummer. Im Folgenden eine Übersicht der letzten vier Versionen (Stand 31.03.2020):

Version Codename Veröffentlichung Start LTS Start Wartung Ende Wartung
10.x Dubnium 24.04.2018 30.10.2018 01.04.2020 01.04.2021
11.x --- 23.10.2018 --- --- 01.06.2019
12.x Erbium 23.04.2019 22.10.2019 01.04.2021 01.04.2022
13.x --- 22.10.2019 --- --- 01.06.2020

Quellen