Was genau ist Node.js?

Node.js ist eine JavaScript-Laufzeitumgebung. Hört sich toll an, aber was bedeutet das? Wie funktioniert das?

Die Laufzeitumgebung von Node.js enthält alles, was Sie zum Ausführen eines in JavaScript geschriebenen Programms benötigen.

Node.js entstand, als die ursprünglichen Entwickler von JavaScript es von etwas, das Sie nur im Browser ausführen konnten, auf etwas erweiterten, das Sie als eigenständige Anwendung auf Ihrem Computer ausführen konnten.

Jetzt können Sie mit JavaScript viel mehr tun, als nur Websites interaktiv zu gestalten.

JavaScript kann jetzt Dinge tun, die andere Skriptsprachen wie Python können.

Sowohl Ihr Browser JavaScript als auch Node.js werden auf der V8 JavaScript Runtime Engine ausgeführt. Diese Engine nimmt Ihren JavaScript-Code und konvertiert ihn in einen schnelleren Maschinencode. Maschinencode ist ein Code auf niedriger Ebene, den der Computer ausführen kann, ohne ihn zuerst interpretieren zu müssen.

Warum Node.js?

Hier ist eine formale Definition, wie sie auf der offiziellen Node.js-Website angegeben ist:

Node.js® ist eine JavaScript-Laufzeit, die auf der V8-JavaScript-Engine von Chrome basiert.

Node.js verwendet ein ereignisgesteuertes, nicht blockierendes E / A-Modell, das es leicht und effizient macht.

Das Paket-Ökosystem von Node.js, npm, ist das weltweit größte Ökosystem von Open Source-Bibliotheken.

Wir haben bereits die erste Zeile dieser Definition besprochen: "Node.js® ist eine JavaScript-Laufzeit, die auf der V8-JavaScript-Engine von Chrome basiert." Lassen Sie uns nun die beiden anderen Zeilen verstehen, damit wir herausfinden können, warum Node.js so beliebt ist.

E / A bezieht sich auf Eingabe / Ausgabe. Dies kann alles sein, vom Lesen / Schreiben lokaler Dateien bis zum Senden einer HTTP-Anforderung an eine API.

E / A braucht Zeit und blockiert daher andere Funktionen.

Stellen Sie sich ein Szenario vor, in dem wir eine Backend-Datenbank für die Details von Benutzer1 und Benutzer2 anfordern und diese dann auf dem Bildschirm / der Konsole drucken. Die Antwort auf diese Anforderung benötigt Zeit, aber beide Benutzerdatenanforderungen können unabhängig und gleichzeitig ausgeführt werden.

E / A blockieren

Bei der Blockierungsmethode wird die Datenanforderung von Benutzer2 erst initiiert, wenn die Daten von Benutzer1 auf dem Bildschirm gedruckt werden.

Wenn dies ein Webserver wäre, müssten wir für jeden neuen Benutzer einen neuen Thread starten. JavaScript ist jedoch Single-Threaded (nicht wirklich, aber es hat eine Single-Threaded-Ereignisschleife, auf die wir später noch eingehen werden). Dies würde JavaScript nicht sehr gut für Multithread-Aufgaben geeignet machen.

Hier kommt der nicht blockierende Teil ins Spiel.

Nicht blockierende E / A.

Auf der anderen Seite können Sie mithilfe einer nicht blockierenden Anforderung eine Datenanforderung für Benutzer2 initiieren, ohne auf die Antwort auf die Anforderung für Benutzer1 zu warten. Sie können beide Anforderungen parallel initiieren.

Diese nicht blockierende E / A macht Multithreading überflüssig, da der Server mehrere Anforderungen gleichzeitig verarbeiten kann.

Die JavaScript-Ereignisschleife

Wenn Sie 26 Minuten Zeit haben, sehen Sie sich diese hervorragende Video-Erklärung der Node Event Loop an:

Ansonsten finden Sie hier eine kurze schrittweise Erklärung der Funktionsweise der JavaScript-Ereignisschleife.

  1. Drücken Sie main()auf den Call - Stack.
  2. Drücken Sie console.log()auf den Call - Stack. Dies läuft dann sofort und wird geknallt.
  3. Schieben setTimeout(2000)auf den Stapel. setTimeout(2000)ist eine Knoten-API. Wenn wir es aufrufen, registrieren wir das Ereignis-Rückruf-Paar. Das Ereignis wartet 2000 Millisekunden, dann ist der Rückruf die Funktion.
  4. Nach der Registrierung in den APIs setTimeout(2000)wird es vom Aufrufstapel entfernt.
  5. Jetzt wird der zweite setTimeout(0)auf die gleiche Weise registriert. Wir haben jetzt zwei Node-APIs, die auf ihre Ausführung warten.
  6. Nach 0 Sekunden Wartezeit setTimeout(0)wird in die Rückrufwarteschlange verschoben, und das Gleiche passiert mit setTimeout(2000).
  7. In der Rückrufwarteschlange warten die Funktionen darauf, dass der Aufrufstapel leer ist, da nur eine Anweisung eine Zeit ausführen kann. Dies wird durch die Ereignisschleife erledigt.
  8. Der letzte console.log()wird ausgeführt und der main()wird aus dem Aufrufstapel entfernt.
  9. Die Ereignisschleife erkennt, dass der Aufrufstapel leer ist und die Rückrufwarteschlange nicht leer ist. Daher werden die Rückrufe (in einer First-In-First-Out-Reihenfolge) zur Ausführung in den Aufrufstapel verschoben.

npm

Dies sind Bibliotheken, die von der großartigen Community erstellt wurden und die die meisten Ihrer allgemeinen Probleme lösen. npm (Node Package Manager) verfügt über Pakete, die Sie in Ihren Apps verwenden können, um Ihre Entwicklung schneller und effizienter zu gestalten.

Benötigen

Require macht drei Dinge:

  • Es lädt Module, die mit Node.js gebündelt sind, wie Dateisystem und HTTP, von der Node.js-API.
  • Es lädt Bibliotheken von Drittanbietern wie Express und Mongoose, die Sie von npm installieren.
  • Sie können Ihre eigenen Dateien benötigen und das Projekt modularisieren.

Require ist eine Funktion, die einen Parameter "path" akzeptiert und zurückgibt module.exports.

Knotenmodule

Ein Knotenmodul ist ein wiederverwendbarer Codeblock, dessen Existenz sich nicht versehentlich auf anderen Code auswirkt.

Sie können Ihre eigenen Module schreiben und in verschiedenen Anwendungen verwenden. Node.js verfügt über eine Reihe integrierter Module, die Sie ohne weitere Installation verwenden können.

V8 lädt JavaScript durch Nutzung von C ++ auf

V8 ist eine Open Source-Laufzeit-Engine, die in C ++ geschrieben wurde.

JavaScript -> V8 (C ++) -> Maschinencode

V8 implementiert ein Skript namens ECMAScript, wie in ECMA-262 angegeben. ECMAScript wurde von Ecma International erstellt, um JavaScript zu standardisieren.

V8 kann eigenständig ausgeführt oder in jede C ++ - Anwendung eingebettet werden. Es verfügt über Hooks, mit denen Sie Ihren eigenen C ++ - Code schreiben können, den Sie JavaScript zur Verfügung stellen können.

Auf diese Weise können Sie JavaScript im Wesentlichen Funktionen hinzufügen, indem Sie V8 in Ihren C ++ - Code einbetten, sodass Ihr C ++ - Code mehr versteht, als der ECMAScript-Standard sonst spezifiziert.

Bearbeiten: Wie Greg Bulmash auf mich aufmerksam gemacht hat, gibt es neben V8 von Chrome viele andere JavaScript-Laufzeit-Engines wie SpiderMonkey von Mozilla, Chakra von Microsoft usw. Details dazu finden Sie auf dieser Seite.

Veranstaltungen

In unserer App ist etwas passiert, auf das wir reagieren können. Es gibt zwei Arten von Ereignissen in Node.

  • Systemereignisse: C ++ - Kern aus einer Bibliothek namens libuv. (Zum Beispiel das Lesen einer Datei beendet).
  • Benutzerdefinierte Ereignisse: JavaScript-Kern.

Hallo Welt in Node.js schreiben

Wir müssen das tun, nicht wahr?

Erstellen Sie eine Datei app.js und fügen Sie Folgendes hinzu.

console.log("Hello World!");

Öffnen Sie Ihr Knotenterminal, ändern Sie das Verzeichnis in den Ordner, in dem die Datei gespeichert und ausgeführt wird node app.js.

Bam - Sie haben gerade Hello World in Node.js geschrieben.

Folgen Sie @ Priyesh_p18

Es gibt eine Menge Ressourcen, mit denen Sie mehr über Node.js erfahren können, einschließlich freeCodeCamp.org.