Node.js Entwicklung – eine Einführung in die beliebte JS-Laufzeitumgebung

IHR KOMPLETTER LEITFADEN ZU NODE.JS IM KONTEXT DES JAVASCRIPT-ÖKOSYSTEMS – TECHNISCHE EIGENSCHAFTEN, PROS, CONS, ANWENDUNGSMÖGLICHKEITEN UND VIELES MEHR

Node.js ist eine Laufzeitumgebung, mit der Software-Entwickler mit JavaScript auf dem Frontend und Backend von Webanwendungen arbeiten können. Es kann in der Full-Stack-JavaScript-Entwicklung verwendet werden und bietet APIs, um HTTP-Anfragen, Dateisysteme und andere Server-seitige Funktionen zu unterstützen.

Node.js wurde im Jahr 2009 von Ryan Dahl geschrieben und veröffentlicht. Die Open-Source und plattformübergreifende JavaScript-Laufzeitumgebung führt den JavaScript-Code Server-seitig aus und verwendet den Chrome-V8-JavaScript-Engine.

Node.js als Teil des JS-Ökosystems für die Backend-Webentwicklung

Mit Node.js können Sie JS erweitern, um einen Code für die Server-Seite zu erstellen. Dies bedeutet, man entfernt sich vom DOM-Modell, Browser-Intrinsics und anderen JS-Framework-Komponenten. Mit Node.js können Sie eigenständige JS-basierte Anwendungen entwerfen und im Wesentlichen außerhalb von Browser-Engines arbeiten.

Node.js bietet hierzu ein eigenes Ökosystem von Softwaremodulen und Paketen an, mit denen Sie Anwendungen mit Leichtigkeit erstellen können. Es verfügt über eine Bibliothek von über 350.000 Paketen. Ein starker Node-Engine und Community-Support unterstützen den Lernprozess.

Bevor wir näher auf die Node.js-Entwicklung als Backend-Technologie eingehen, decken wir schnell einige Grundlagen der Webentwicklung und des JavaScript-Ökosystems  ab:

Synchroner Prozess

Legacy-Web-Anwendungen sind von Natur aus synchron. Wenn Sie mit der Nutzeroberfläche im Browser interagieren, stellt der Browser hierzu einen Antrag an den Server. Der Server reagiert auf den Antrag mit dem Output. Dieser Antrags- und Empfangsprozess stellt im Wesentlichen einen synchronen Prozess dar.

Asynchrones Web

Das heutige moderne Web ist asynchron. Sie können Updates erhalten, sobald sich der Status des Systems ändert, auch ohne Interaktion mit der Nutzeroberfläche. Beispiele für asynchrone Anwendungen oder Websites umfassen alle Seiten, die dynamische Daten ändern, wie beispielsweise ein Social-Media-Feed, Aktienportfolio, eine Auktionsseite, Einkaufsdaten oder ein Timer/Kalender.

JavaScript

Echtzeit-Updates für Webseiten oder webbasierte Apps erfordern Client-seitiges Rendering. JavaScript, eine leichte, interpretierte Programmiersprache, ist die Programmiersprache der Wahl für Webanwendungen, die Client- oder Server-seitiges Rendering gebrauchen. JavaScript ist synchron und single-thread.

Full-Stack-Javascript

Viele, wenn nicht die meisten, dynamischen, asynchronen Webanwendungen im Jahr 2021 werden sowohl Client- als auch Server-seitig nur mit JavaScript codiert. Die Full-Stack-JavaScript-Entwicklung bezieht sich sowohl auf Client- als auch Server-seitige Software mit JavaScript.

Ereignisgetriebener Ansatz

Ein Programmieransatz, der Ereignisse verwendet, um erforderliche Funktionen auszulösen: Ein Ereignis kann alles sein, wie z.B. ein Zeichen eingeben oder eine Maustaste klicken. Das Ereignis auf einem Element ist einer Call-Back-Funktion zugeordnet. Diese Funktion wird ausgeführt, wenn ein Ereignis ausgelöst wird.

Frontend (einer Website)

Der Teil der Webseite, mit der der Benutzer direkt interagiert. Es wird auch als „Client-seite“ bezeichnet. Das Frontend enthält Elemente, die Benutzer direkt erfahren: Textschriften, Farbe und Stile, Bilder, Grafiken und Tabellen, Schaltflächen, Navigationsmenü, etc. Die Sprachen zur Entwickelung des Frontends einer Website sind HTML, CSS und JavaScript.

Server-Seite (Backend)

Skripts werden auf der Server-Seite geschrieben und ausgeführt, um dynamische Webseiteninhalte zu erstellen, noch bevor die Seite an den Webbrowser gesendet wird. Server-seitige Technologien werden auf einer Maschine privat ausgeführt – der Client bzw. der Benutzer sehen normalerweise nur das Ergebnis der Ausführung.

SPA

Single Page Client Applications (auf Deutsch: Einzelseiten-Client-Webanwendungen). Google Mail oder Twitter sind SPAs. Alle Inhalte werden beim ersten Ladeprozess heruntergeladen.

Node.js – Definition und Schlüsselvokabular

Node.js ist ein Open-Source-, Server-seitiges Laufzeitumfeld, das auf dem V8-JavaScript-Engine von Chrome erstellt wurde. Es bietet eine ereignisgesteuerte, blockierungsfreie (asynchrone) E/A- und plattformübergreifende Laufzeitumgebung zum Aufbau von hochskalierbaren, Server-seitigen Anwendungen mit JavaScript.

Im Folgenden erklären wir eine Reihe der Begriffe, die zum Verständnis von Node.js beitragen.

E/A (Eingabe/Ausgabe)

E/A oder Eingabe/Ausgabe bezieht sich weitestgehend auf die Interaktion zwischen dem Programm mit der Festplatte sowie dem Netzwerk des Systems. Beispiele für E/A-Vorgänge umfassen das Lesen oder Schreiben von Daten von/zu einer Festplatte, HTTP-Anfragen und die Interaktion mit Datenbanken. E/A-Vorgänge sind langsamer im Vergleich zum Zugriff auf den RAM-Speicher oder Arbeit auf dem CPU.

Synchron vs. asynchron

Synchrone Ausführung bezieht sich auf einen Code, der in der Reihenfolge ausgeführt wird, in der er geschrieben wurde. Das Programm wird jeweils eine Zeile ausgeführt. Wenn eine Funktion aufgerufen wird, hält die Ausführung an, bis die Funktion zurückkehrt oder schließt, bevor mit der nächsten Codezeile fortgefahren wird.

Asynchrone (oder async) Ausführungen werden nicht in der Sequenz ausgeführt, wie sie im Code erscheinen. In der Async-Programmierung wartet das Programm nicht, bis die Aufgabe abgeschlossen ist, sondern kann direkt zur nächsten Aufgabe weitergehen. Ein asynchroner Vorgang ist im Allgemeinen E/A-verbunden. Berechnungsaufgaben sind im Regelfall synchron. Aufgaben im Zusammenhang mit E/A oder Timing sind dagegen asynchron. E/A-Vorgänge werden asynchron erstellt, da sie langsam sind und die weitere Ausführung des Codes blockieren.

Blocking vs. Non-Blocking

Blocking bezieht sich auf Vorgänge, die die weitere Ausführung blockieren, bis der Vorgang abgeschlossen ist, während Non-Blocking auf den Code verweist, der die Ausführung nicht blockiert.

Die Node.js-Dokumentation besagt, dass eine Blockierung auftritt, wenn die Ausführung von zusätzlichem JavaScript im Node.js-Prozess warten muss, bis ein Nicht-JavaScript-Vorgang abgeschlossen wurde. Blocking ist synchron, während Non-Blocking asynchron ausgeführt wird.

JavaScript-Laufzeitumgebung

Node.js ist eine JavaScript-Laufzeitumgebung. Chrome-Browser JavaScript und Node.js laufen auf dem V8-JavaScript-Laufzeit-Engine. Dieser Engine konvertiert den JavaScript-Code direkt zu nativen Maschinencode. Maschinencode ist ein Low-Level-Code, den der Computer ohne Interpreter ausführen kann. Dies verbessert die Geschwindigkeit und Leistung des JS-Codes.

Sie sollten die Konzepte der Node-Laufzeitumgebung verstehen, bevor Sie sich an Node.js heranwagen. Dieser Artikel befasst sich kurz mit einigen Aspekten der Node.js-Umgebung. Sie müssen sich jedoch mit Node.js-Paketen und Anwendungen auskennen, wenn Sie sich in die Node-Programmierung begeben.

Plattformübergreifend

Mit Node.Js können Sie JavaScript im Frontend, der Middleware und Backend und auf jedem beliebigen Betriebssystem plattformübergreifend verwenden, einschließlich MacOS, Linux und Windows.

Beispielsweise kann ein Node.js-Entwickler eine plattformübergreifende Desktop-Anwendung für Windows, Linux und Mac erstellen. Sie können auch Apps für mobile Geräte, Desktop und Webwentwicklung erstellen.

Node.js ist Teil einiger sehr beliebter Webentwicklungs-Stacks, z.B. MERN, MEVN und MEAN.

JavaScript läuft auf allen Ebenen einer Anwendung im MEAN-Stack, sodass Sie die gesamte Anwendung von Anfang an mit JS als einzige Programmiersprache erstellen können.

Skalierbarkeit

Skalierbarkeit bezieht sich auf die Fähigkeit der Anwendungsarchitektur, mit dem Wachstum in Bezug auf Benutzerzahlen und dem allgemeinen Ressourcenbedarf auf dem Code und dem Server umzugehen. Eine gute Webanwendung muss nahtlos und effizient mit Wachstum umgehen können und gleichzeitig skalierbar sein: Sie möchten nämlich nicht noch einmal die komplette Anwendung von neu entwickeln, wenn die Nutzerzahlen ansteigen.

Eine skalierbare Webanwendung muss das Nutzerwachstum verarbeiten, ohne hierbei die Benutzererfahrung einzuschränken. Um eine skalierbare Webanwendung aufzubauen, müssen Sie eine Vielzahl von Faktoren in Betracht ziehen, wie beispielsweise die allgemeine Benutzererfahrung, das Potenzial für Nutzerwachstum, die Ladezeiten, die erforderliche Zeit, um den Code zu ändern und zu testen, die Kosten für die Aktualisierung der gesamten App, die Einfachheit der Wartung, die Wiederherstellungsdauer nach einem Absturz, Neustart mit Null-Ausfallzeit, etc.

Node.js verfügt über eingebaute Skalierungsfunktionen und wurde entworfen, um skalierbar zu sein. Node verfügt über Module, mit denen Sie eine Anwendung mit Null-Ausfallzeiten wiederherstellen oder neu starten und die Verfügbarkeit der Node-Prozesse verbessern können, falls Probleme auftreten.

Einige der gängigen Methoden, die Node.js zur Skalierung einer Anwendung bietet, lauten wie folgt:

  • Klonen mit dem Cluster-Modul
  • Decomposing mit Microservices
  • Splitting oder Datenpartitionierung

Wichtigste Schlussfolgerungen

Da wir uns mit einigen grundlegenden Konzepten beschäftigt haben, schauen wir uns die Definition von Node.js noch einmal an:

Node.js ist ein Open-Source-, Server-seitiges Laufzeitumfeld, das auf der V8-JavaScript-Engine von Chrome erstellt wurde. Es bietet eine ereignisgesteuerte, blockierungsfreie (asynchrone) E/A- und plattformübergreifende Laufzeitumgebung zum Aufbau von hochskalierbaren, Server-Seitigen Anwendungen mit JavaScript.

Die wichtigsten Schlussfolgerungen sind:

  • Node.js ist Server-seitig. Das bedeutet, Sie schreiben den Code für die Server-Seite (Backend). Node.js eignet sich aber auch für den JS Full-Stack – Frontend, Middleware und Backend.
  • Node.js ist Open-Source: Sie können die Open-Source-Vorteile und die Online-Community-Unterstützung nutzen, um den Lernprozess zu beschleunigen.
  • Node.js ist eine Laufzeitumgebung mit einem Ökosystem von Tausenden von Bibliotheken. Node.js ist nicht nur eine Bibliothek oder ein Framework. Es handelt sich um eine Laufzeitumgebung, in der der Code entwickelt, getestet und Anwendungen ausgeführt werden können.
  • Es läuft auf dem robusten Chrome-V8-JS-Engine.
  • Es ist plattformübergreifend und kann auf allen Betriebssystemen und Geräten verwendet werden.
  • Ermöglicht E/A- und blockierungsfreie Vorgänge und liefert Skalierbarkeit, damit Sie leistungsfähige Anwendungen erstellen können, die hohe Benutzerzahlen aufnehmen und keine Ausfallzeiten während der Wiederherstellung aufweisen.

Andere Node.JS-Engines und Server-seitige Technologien

Wie bereits erwähnt, verwendet Chrome Node.js. Einige der anderen Browser mit ihren eigenen JavaScript-Engines sind:

Alle Engines implementieren den ECMA ES-262-Standard, auch EcmaScript genannt, den Standard von JavaScript.

Einige der Server-seitigen Technologien sind Apache HTTPD, Tomcat, NGINX, Microsoft IIS (Webserver), PHP, Python, Ruby, Java, ASP, C (Sprachen), SQL Server und MySQL (Datenbanken).

Node.JS-Anwendungen

Node.js ist ideal für datenintensive Anwendungen, da ein asynchrones, ereignisgesteuertes Modell verwendet wird. Sie können E/A-intensive Webanwendungen wie Video-Streaming-Sites verwenden. Sie können es auch für die Entwicklung verwenden, egal ob es sich hierbei um Echtzeit-Webanwendungen, Netzwerk- oder Allzweckanwendungen sowie verteilte Systeme handelt.

Node.js hat einen einzigartigen Vorteil, da Millionen von Frontend-Entwicklern, die JavaScript für den Browser schreiben, jetzt den Server-seitigen Code zusätzlich zum Client-seitigen-Code schreiben können, ohne dass sie eine völlig neue Sprache lernen müssen.

Diese Laufzeitumgebung eignet sich am besten für die Entwicklung von Echtzeit-Apps, die eine große Anzahl von Online-Anfragen auf der Client-Seite verarbeiten müssen, die keine erweiterte Sicherheit erfordern und dabei eine erstklassige Benutzererfahrung und schnelle Reaktionszeit liefern. Dazu gehören Live-Chats, Instant-Messenger, Online-Spiele, Videokonferenzen, E-Commerce-Services sowie kollaborative Plattformen für mehrere Benutzer (Google Docs, Trello, Dropbox, etc.)

  • Sehr schnell
  • Blockiert selten
  • Bietet einheitliche Programmiersprache und Datentyp
  • Alles ist asynchron
  • Hoher Gleichzeitigkeitsgrad

Node.js Entwicklungs-Basics

Der Name Node.js leitet sich aus der Tatsache ab, dass einfache Einzelprozessblöcke erstellt werden, die auch als „Nodes“ bezeichnet werden. Die Nodes können mit guten Netzwerkprotokollen miteinander kommunizieren und sind skalierbar, sodass große, verteilte Anwendungen erstellt werden können.

E/A-Vorgänge in Node werden asynchron ausgeführt, wobei die Codezeilen blockierungsfrei ablaufen. Node.js enthält als Paket einen Interpreter sowie einen Compiler.

Wenn Sie anfangen, Node.js zu verwenden und zu erlernen, sollten Sie sich mit einigen der folgenden Konzepte vertraut machen.

Callbacks

Ein Callback ist eine Funktion, die als Argument an eine andere Funktion übergeben wird. Der Callback wird in der äußeren Funktion aufgerufen (zurückgerufen), um zu einem günstigen Zeitpunkt ausgeführt zu werden. Ein Aufruf kann sofort (sync Callback) oder zu einem späteren Zeitpunkt (async Callback) erfolgen. Der richtige Weg, um mehrere gleichzeitige Verbindungen zu handhaben, besteht in einem einzelnen Thread, einer Ereignisschleife und einem blockierungsfreien E/A. Wenn Sie beispielsweise eine Datenbank anfragen, geben Sie einen Callback mit der Anfrage an. Das Programm führt weitere Codezeilen aus. Wenn die Abfrageergebnisse zurückkommen, kann der Callback ausgeführt werden.

Paketmanager

Mit Node Paketmanagern können Sie die Plugins, Bibliotheken und Abhängigkeiten über einfache Befehle abrufen. Paketmanager finden diese Einheiten in den Repositorys und installieren diese, um einen größeren Anwendungs-Stack zu erstellen. Sie aktualisieren auch diese Bibliotheken und installieren neue.

npm

npm ist der Standard-Paketmanager für Node.js und wird in das System installiert, sobald Node.js installiert wurde. Es kann Pakete verwalten, die lokale Abhängigkeiten und auch globale JavaScript-Tools sind.

ECMAScript-Funktionen

Um mit der Node.js-Bibliothek zu arbeiten, sollten Sie die Dokumentation für folgende Begriffe lesen:

CLI

CLI ist eine Befehlszeilenschnittstelle. Mit dem Node CLI können Sie nvm-Befehle, nmp-Befehle sowie Ihre Node.js-Anwendung ausführen.

NVM

NVM steht für Node-Version-Manager. Es ist nützlich, wenn mehrere Projekte verwendet werden, die unterschiedliche Node.js-Versionen verwenden.

Datenbank

Da Node.js hauptsächlich für das Backend ist, müssen Sie einige relationale und nicht relationale Datenbanken-Grundlagen kennen und wie Sie eine Verbindung mit einer Datenbank herstellen.

MongoDB ist eine häufig genutzte nicht-relationale Datenbank, die mit Node.js verwendet wird. MongoDB ist eine NoSQL, plattformübergreifende, Dokument-orientierte Datenbank und bietet hohe Leistung, hohe Verfügbarkeit sowie eine einfache Skalierbarkeit.

HTTP-Anfragen

Um das Produktionsumfeld der Anwendung aufrechtzuerhalten, müssen Sie Werkzeuge wie pm2 oder forever kennen, mit der Sie die Node.js-App im Falle eines Absturzes neu starten können.

Docker

Docker ist ein Data-Virtualization-Tool, mit dem Sie eine Node.js-Anwendung in einen Container platzieren können, der auf einem beliebigen Computer mit Mindesteinstellungen ausgeführt werden kann. Installieren Sie einfach Docker und führen Sie einen Container aus.

Docker Compose

Docker-Compose hilft Ihnen dabei, Docker-Container mit verschiedenen Teilen der App zu verwalten: Node.js App-Handling, Datenbank, Client-seitigem Code oder Frontend-Code. All diese Komponenten lassen sich einfach einrichten.

Node.js-Module

Module sind wie JavaScript-Bibliotheken, die in einer Node.js-Anwendung verwendet werden können, um eine Reihe von Funktionen aufzunehmen. Um ein Modul in eine Node.js-Anwendung aufzunehmen, verwenden Sie die require() Funktion mit Klammern, die den Namen des Moduls enthalten.

HTTP – enthält Methoden, Klassen und Ereignisse, um einen Node.js-HTTP-Server zu erstellen.

util – beinhaltet Utility Functions, die für Entwickler nützlich sind.

fs – befasst sich mit Datei E/A-Vorgängen. Enthält Ereignisse, Klassen und Methoden.

URL – enthält Methoden für URL-Parsing.

query string – enthält Methoden, um mit Query String zu arbeiten.

stream – enthält Methoden, um Streaming-Daten zu verwalten.

zlib – enthält Methoden zum Komprimieren oder Dekomprimieren von Dateien.

Node.js-Entwicklung – Pros

Ein einzigartiger Vorteil von Node.js ist, dass Frontend-Entwickler, die mit dem Schreiben von JavaScript für den Browser vertraut sind, jetzt auch den Server-seitigen Code in JS schreiben können, ohne eine neue Sprache für den Server-seitigen Code erlernen zu müssen.

  • Node.js ist ein Open-Source-Framework mit MIT Lizenz. (MIT Lizenz ist eine kostenlose Softwarelizenz vom Massachusetts Institut of Technologiy (MIT)).
  • Verwendet JavaScript, um Server-seitige Anwendungen zu erstellen.
  • Leichtes Framework, das minimale Module enthält. Andere Module können gemäß der Notwendigkeit für die App einbezogen werden.
  • Standardmäßig asynchron: Es ist schneller.
  • Plattformübergreifendes Framework, das mit Windows, Mac oder Linux ausgeführt werden kann

Node.js-Entwicklung – Cons

Node.js ist keine One-fits-all-Lösung. Die Effizienz nimmt ab, wenn die CPU-Last wächst. Apps, die mit Node.js aufgebaut sind, können keine schweren Rechenvorgänge ausführen, blockieren eingehende Anfragen und reduzieren die Reaktionszeit.

Applikationen, die auf Node.js basieren

Im Folgenden die besten Beispiele einiger Apps, die Node.js als Teil eines modernen Technologie-Stacks beinhalten.

  • Streaming-Apps wie Netflix
  • Social-Networking-Apps wie LinkedIn oder Twitter
  • Datenerhebungs-, Visualisierungs- und Analyse-Apps
  • Fintech-Apps wie Paypal
  • Online-Shops und Marktplätze wie eBay und Alibaba
  • Unternehmensanwendungen wie Walmart
  • Collaboration-Tools wie Trello
  • Echtzeitanwendungen, z. B. Projektmanagement- und Collaboration-Tools, die über verschiedene Geräte ausgeführt werden
  • E-Learning-Plattformen wie Quizlet
  • IoT-Lösungen

Einige Anwendungen, für die Node.js wahrscheinlich keine gute Wahl ist

Node.js ist nicht für CPU-intensive Vorgänge wie Bildverarbeitung oder schwere Rechenarbeit geeignet, da es Zeit braucht, um Anfragen zu verarbeiten und hierdurch einzelne Threads blockiert werden.

Node.js unter der Haube

Die Node.js Entwicklungsumgebung kann in Windows, Mac, Linux und Solaris eingerichtet werden. Einige der Tools oder das SDK für die Entwicklung einer Node.js-Anwendung sind:

  • Node.js
  • Der Node Package Manager (NPM) ist Teil der Node.js-Installation seit Version 0.6.0 und muss nicht separat installiert werden.
  • IDE (Integrated Development Environment) oder TextEditor

Node.js kann auf verschiedene Arten installiert werden. Der folgende Beitrag beschreibt die gängigsten und bequemsten.

https://nodejs.dev/learn/how-to-install-nodejs

Einige der anderen Tools, mit denen Sie vertraut sein sollten, sind:

  • Compiler wie Babel
  • Module-Bundler (Browserify, Rollup, Parcel)
  • Task-Runners (Gulp und Grunt)
  • Plugins

Node.js Code-Beispiel

Um zu starten, können Sie sich die kostenlosen Tutorials anschauen und Beispiel-Node.js-Anwendungen ausführen, um ein Gefühl für das Framework zu erhalten.

Hier ist ein Beispielcode, der „My first Node.js trial!!“ wiedergibt.

Beispieldatei: main.js

var http = require("http");
http.createServer(function (request, response) {
   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});
   
   // Send the response body as "Hello World"
   response.end('My first Node.js trial!! \n');
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Um den Code auszuführen:

$ node main.js

Ressourcen

https://nodejs.dev/learn

Zusammenfassung

Dieser Artikel hat einige wichtige und grundlegende Programmierkonzepte aufgelistet, die Sie kennen sollten, bevor Sie die Server-seitige Programmierung mit Node.js beginnen. Sie müssen JS gründlich lernen sowie E/A-Vorgänge, Ereigniskreisläufe und Kernprogrammierungskonzepte verstehen, bevor Sie mit Node.js loslegen können.

Ausgewählte Blogbeiträge