Node.js-Handbuch, Teil 2: JavaScript, V8, einige Entwicklungstricks

Mit der Veröffentlichung des ersten Teils der Übersetzung dieses Handbuchs auf Node.js haben wir uns entschlossen, die Meinung des Publikums darüber herauszufinden, ob wir weiter an dem Projekt arbeiten sollten, und eine kleine Umfrage durchgeführt. Wie sich herausstellte, unterstützten ungefähr 94% der Wähler unsere Initiative. Treffen Sie also den zweiten Teil des Node.js.-Tutorials



Heute werden wir darüber sprechen, welche Art von JS-Wissen Sie benötigen, um Anwendungen für die Node.js-Plattform effizient zu entwickeln, die Unterschiede zwischen browser- und serverseitigem JavaScript-Code zu diskutieren und über JS-Engines und einige Techniken der Node.js-Entwicklung zu sprechen.


Welche JS-Kenntnisse benötige ich für die Entwicklung von Node.j?


Angenommen, Sie haben gerade mit dem Programmieren begonnen. Wie tief müssen Sie JavaScript lernen, um Node.js erfolgreich zu beherrschen? Für einen Anfänger ist es schwierig, ein solches Niveau zu erreichen, wenn er genügend Vertrauen in seine beruflichen Fähigkeiten gewinnt. Wenn Sie Programmieren studieren, haben Sie möglicherweise das Gefühl, dass Sie nicht genau verstehen, wo Browser-JavaScript endet und die Entwicklung für Node.js. beginnt.

Wenn Sie am Anfang des Weges eines JavaScript-Programmierers stehen, würde ich Ihnen raten, bevor Sie für Node.js schreiben, die folgenden Sprachkonzepte gut zu beherrschen:

  • Lexikalische Konstruktionen.
  • Ausdrücke.
  • Typen.
  • Variablen
  • Funktionen
  • Dieses Schlüsselwort.
  • Pfeilfunktionen
  • Zyklen
  • Geltungsbereich.
  • Arrays
  • Vorlagenzeichenfolgen.
  • Wenden Sie ein Semikolon an.
  • Arbeiten Sie im strengen Modus.

Tatsächlich geht diese Liste weiter, aber wenn Sie alles beherrschen, bedeutet dies, dass Sie eine gute Grundlage für eine produktive Client- und Serverentwicklung in JavaScript schaffen.
Die folgenden Sprachkonzepte sind auch sehr wichtig, um die Ideen der asynchronen Programmierung zu verstehen, die einer der Grundbestandteile von Node.js sind. Insbesondere sprechen wir über Folgendes:

  • Asynchrone Programmier- und Rückruffunktionen.
  • Timer.
  • Versprechen.
  • Async / warte Konstrukt.
  • Kurzschlüsse.
  • Zyklus der Ereignisse.

Es gibt viele JavaScript-Materialien, mit denen Anfänger die Sprache lernen können. Hier ist zum Beispiel ein Schulungskurs für den Autor dieses Handbuchs. Hier ist ein sehr nützlicher Abschnitt von MDN. Hier ist ein Tutorial für javascript.ru Grundlegende JavaScript-Mechanismen finden Sie unter freecodecamp.com .

Oben haben wir darüber gesprochen, wie Anfänger über die Frage besorgt sein können, wo die Grenze zwischen Server- und Client-JavaScript-Entwicklung liegt. Reden wir darüber.

Unterschiede zwischen Node.js Plattform und Browser


Wie unterscheidet sich die JS-Entwicklung für Node.js von der Browserprogrammierung? Die Ähnlichkeit zwischen diesen Umgebungen besteht darin, dass dort und dort dieselbe Sprache verwendet wird. Die Entwicklung von Anwendungen, die für die Ausführung in einem Browser entwickelt wurden, unterscheidet sich jedoch stark von der Entwicklung von Serveranwendungen. Trotz der Verwendung derselben Sprache gibt es einige wesentliche Unterschiede, die diese beiden Entwicklungstypen zu völlig unterschiedlichen Aktivitäten machen.

Es sollte beachtet werden, dass jemand, der früher Front-End-Lernen zum Starten von Node.js durchgeführt hat, eine sehr ernsthafte Gelegenheit hat, schnell alles zu beherrschen, was notwendig ist, da er in einer Sprache schreibt, die er bereits kennt. Wenn die Notwendigkeit, eine neue Umgebung zu lernen, hinzugefügt wird und eine neue Sprache gelernt werden muss, ist die Aufgabe viel komplizierter.
Der Hauptunterschied zwischen Client und Server besteht also in der Umgebung, für die Sie programmieren müssen, in den Ökosystemen dieser Umgebungen.

Im Browser entfällt der Großteil der Arbeit auf verschiedene Vorgänge mit Webdokumenten über das DOM sowie auf die Verwendung anderer Webplattform-APIs, z. B. Mechanismen für die Arbeit mit Cookies. Node.js hat natürlich all das. Es gibt kein document , kein window sowie andere vom Browser bereitgestellte Objekte.

Der Browser verfügt wiederum nicht über die Softwaremechanismen, die in der Node.js-Umgebung verfügbar sind und in Form von Modulen vorliegen, die mit der Anwendung verbunden werden können. Dies ist beispielsweise eine API für den Zugriff auf das Dateisystem.

Ein weiterer Unterschied zwischen der Client- und Serverentwicklung in JS besteht darin, dass der Entwickler bei der Arbeit in einer Node.js-Umgebung die volle Kontrolle über die Umgebung hat. Sofern Sie keine Open Source-Anwendung entwickeln, die überall ausgeführt werden kann, wissen Sie beispielsweise genau, an welcher Version von Node.js Ihr Projekt arbeiten wird. Dies ist sehr praktisch im Vergleich zu der Client-Umgebung, in der Ihr Code im Browser des Benutzers funktionieren muss. Darüber hinaus bedeutet dies, dass Sie ohne Angst vor Problemen die neuesten Funktionen der Sprache verwenden können.

Da sich JavaScript extrem schnell entwickelt, haben Browser einfach nicht genug Zeit, um alle Innovationen schnell umzusetzen. Darüber hinaus arbeiten nicht alle Benutzer mit den neuesten Browserversionen. Entwickler, die etwas Neues in ihren Programmen verwenden möchten, müssen dies berücksichtigen und auf die Kompatibilität ihrer Anwendungen mit den von ihnen verwendeten Browsern achten, was dazu führen kann, dass die modernen JavaScript-Funktionen nicht mehr verwendet werden müssen. Sie können den Babel-Transporter natürlich verwenden, um den Code in ein Format zu konvertieren, das mit dem EcmaScript 5-Standard kompatibel ist, der von allen Browsern unterstützt wird. Dies wird jedoch bei der Arbeit mit Node.js nicht benötigt.

Ein weiterer Unterschied zwischen Node.js und Browsern besteht darin, dass Node.js das CommonJS- Modulsystem verwendet, während Sie in Browsern den Beginn der Implementierung des ES-Modulstandards sehen können. In der Praxis bedeutet dies, dass derzeit in Node.js das Konstrukt require() verwendet wird, um externen Code zu verbinden und in den Browsercode zu import .

V8 und andere JavaScript-Engines


V8 ist der Name der JavaScript-Engine, die im Google Chrome-Browser verwendet wird. Er ist für die Ausführung des JavaScript-Codes verantwortlich, der bei der Arbeit im Internet in den Browser gelangt. V8 bietet eine Laufzeit für JavaScript. DOM und andere Webplattform-APIs werden vom Browser bereitgestellt.

Die JS-Engine ist unabhängig von dem Browser, in dem sie ausgeführt wird. Diese Tatsache hat die Entstehung und Entwicklung der Node.js.-Plattform ermöglicht. V8 wurde 2009 als Motor für Node.js ausgewählt. Aufgrund des explosionsartigen Anstiegs der Popularität stellte sich heraus, dass Node.js V8 eine Engine ist, die jetzt für die Ausführung einer großen Menge serverseitigen JS-Codes verantwortlich ist.

Das Ökosystem von Node.js ist riesig. Dank dessen wird der V8 in Projekten wie Electron auch zur Entwicklung von Desktop-Anwendungen verwendet.

Es ist zu beachten, dass es neben V8 noch andere Motoren gibt:


Die Liste der JS-Engines ist nicht darauf beschränkt.

Diese Engines implementieren die ECMA-262-Spezifikation, auch ECMAScript genannt. Diese Spezifikation standardisiert JavaScript. Die neueste Version des Standards finden Sie hier .

▍JS Motorentwicklung und Leistungsanspruch


Die V8-Engine ist in C ++ geschrieben und wird ständig verbessert. Es kann auf vielen Systemen ausgeführt werden, insbesondere auf Mac, Windows und Linux. Hier werden wir nicht über die Details der Implementierung von V8 sprechen. Informationen dazu finden Sie in anderen Publikationen, unter anderem auf der offiziellen Website von V8 . Sie ändern sich im Laufe der Zeit, manchmal sehr ernst.

V8 entwickelt sich ständig weiter, das gilt auch für andere Motoren. Dies führt insbesondere zu einer Leistungssteigerung von Webbrowsern und der Node.js.-Plattform. Hersteller von Browser-Engines konkurrieren ständig um die Geschwindigkeit der Codeausführung. Dies geschieht seit vielen Jahren. All dies ist für Benutzer und Programmierer von Vorteil.

▍ Interpretation und Zusammenstellung


JavaScript wird als interpretierte Sprache betrachtet, aber moderne Engines interpretieren JS-Code bei weitem nicht nur. Sie kompilieren es. Dieser Trend ist seit 2009 zu beobachten, als der JavaScript-Compiler in Firefox 3.5 hinzugefügt wurde. Danach haben andere Hersteller von Engines und Browsern diese Idee übernommen.

V8 kompiliert JavaScript, um die Codeleistung zu verbessern. Seit dem Aufkommen von Google Maps im Jahr 2004 hat sich JavaScript aus einer Sprache entwickelt, in der zur Implementierung der interaktiven Funktionen von Webanwendungen normalerweise einige zehn Zeilen in eine Sprache geschrieben wurden, in der Browseranwendungen aus Tausenden oder sogar Hunderten geschrieben sind tausend Codezeilen. Solche Anwendungen können stundenlang im Browser ausgeführt werden, was sich stark von den alten JS-Verwendungsszenarien unterscheidet. Der Code, mit dem beispielsweise nur die Richtigkeit der in die Formulare eingegebenen Daten überprüft werden kann. Unter modernen Bedingungen ist das Kompilieren des Codes sehr sinnvoll, da die Ausführung dieses Schritts zwar den Moment des Startens des Codes verzögern kann, der Code jedoch nach dem Kompilieren viel produktiver ist als derjenige, der ausschließlich vom Interpreter verarbeitet wird und schneller ausgeführt wird, aber langsamer arbeitet.

Nachdem wir nun einige Bestimmungen zu JS-Engines, Interpretation und Kompilierung von Code besprochen haben, können wir mit dem Üben fortfahren. Lassen Sie uns nämlich darüber sprechen, wie Node.js-Anwendungen heruntergefahren werden.

Beenden der Node.js-Anwendung


Es gibt verschiedene Möglichkeiten, Node.js-Anwendungen herunterzufahren.

Wenn Sie also ein Programm in der Konsole ausführen, können Sie die Arbeit mit der Tastenkombination ctrl+c . Wir sind jedoch mehr an Softwaremethoden zum Herunterfahren von Anwendungen interessiert. Und wir werden vielleicht mit dem unhöflichsten Befehl beginnen, das Programm zu beenden. Wie Sie jetzt verstehen werden, ist es besser, es nicht zu verwenden.

Das Kernel- process bietet eine praktische Methode, mit der Sie eine Node.js-Anwendung programmgesteuert beenden können. Es sieht so aus:

 process.exit() 

Wenn Node.js auf einen solchen Befehl im Code stößt, führt dies dazu, dass sein Prozess sofort endet. Dies bedeutet, dass absolut alles, was das Programm getan hat, ziemlich unhöflich und bedingungslos unterbrochen wird. Wir sprechen über ungebetene Rückrufe, über Netzwerkanforderungen, die zum Zeitpunkt der Veröffentlichung ausgeführt werden, über Aktionen mit Dateien, über Schreibvorgänge in stdout oder stderr .

Wenn diese Situation zu Ihnen passt, können Sie diese Methode verwenden. Wenn Sie es aufrufen, können Sie ihm eine Ganzzahl übergeben, die vom Betriebssystem als Exit-Code für das Programm wahrgenommen wird.

 process.exit(1) 

Standardmäßig ist dieser Code auf 0 gesetzt, was einen erfolgreichen Abschluss bedeutet. Andere Exit-Codes haben andere Bedeutungen, die nützlich sein können, um sie in Ihrem eigenen System zu verwenden, um die Interaktion einiger Programme mit anderen herzustellen.
Details zu den Codes zum Herunterfahren des Programms finden Sie hier .

Sie können der Eigenschaft process.exitCode auch einen Exit-Code zuweisen. Es sieht so aus:

 process.exitCode = 1 

Nach Beendigung des Programms gibt Node.js diesen Code an das System zurück.

Es ist zu beachten, dass die Arbeit des Programms von selbst endet, nachdem alle darin angegebenen Aktionen ausgeführt wurden. Im Fall von Node.js gibt es jedoch häufig Programme, die unter idealen Bedingungen für eine unbestimmte Dauer ausgelegt sind. Wir sprechen zum Beispiel über HTTP-Server wie diesen:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) 

Solch ein Programm kann theoretisch für immer funktionieren, wenn nichts passiert. Wenn Sie in diesem Fall process.exit() aufrufen, werden die Vorgänge, die zum Zeitpunkt des Aufrufs dieses Befehls ausgeführt wurden, unterbrochen. Und das ist schlecht.

Um die Arbeit solcher Programme abzuschließen, müssen Sie das SIGTERM Signal verwenden und die erforderlichen Aktionen mit dem entsprechenden Handler ausführen.

Beachten Sie, dass Sie zur Verwendung des process keine Verbindung mit require , da dieses Objekt standardmäßig für Node.js-Anwendungen verfügbar ist.

Betrachten Sie das folgende Beispiel:

 const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) process.on('SIGTERM', () => { app.close(() => {   console.log('Process terminated') }) }) 

Was sind Signale? Signale sind ein Mittel zur Interaktion zwischen Prozessen im POSIX-Standard (Portable Operating System Interface). Es handelt sich um Benachrichtigungen, die an den Prozess gesendet werden, um ihn über bestimmte Ereignisse zu informieren.

Beispielsweise teilt ein SIGKILL Signal einem Prozess mit, dass er sofort heruntergefahren werden muss. Es funktioniert idealerweise genauso wie process.exit() .

Das SIGTERM Signal teilt dem Prozess mit, dass ein normaler Abschaltvorgang ausgeführt werden muss. Solche Signale werden von Prozessmanagern wie upstart oder supervisord und von vielen anderen gesendet.

Sie können ein solches Signal vom Programm selbst mit dem folgenden Befehl senden:

 process.kill(process.pid, 'SIGTERM') 

Um einen solchen Befehl erfolgreich abzuschließen, müssen Sie die PID Prozesses kennen, den Sie ausführen möchten.

Umgebungsvariablen aus Node.js lesen


Das process verfügt über die Eigenschaft env , die den Zugriff auf alle Umgebungsvariablen ermöglicht, die zum Zeitpunkt des Prozessstarts festgelegt wurden.

Hier ist ein Beispiel für die Arbeit mit der Umgebungsvariablen NODE_ENV , die standardmäßig auf development :

 process.env.NODE_ENV // "development" 

Wenn Sie das Skript vor dem Ausführen auf production , wird Node.js darüber informiert, dass das Programm in einer Produktionsumgebung ausgeführt wird.

Ebenso können Sie mit anderen Umgebungsvariablen arbeiten, z. B. denen, die Sie selbst festgelegt haben.

Zusammenfassung


Heute haben wir die browserbasierte und serverseitige Programmierung in JavaScript angesprochen, über JS-Engines gesprochen, wie Serveranwendungen heruntergefahren werden und wie Umgebungsvariablen aus Node.js-Programmen gelesen werden. Das nächste Mal werden wir über das Hosting für Node.js-Anwendungen, die Verwendung von Node.js im REPL-Modus, die Arbeit mit Argumenten, die beim Aufruf an Skripte übergeben werden können, die Interaktion mit der Konsole und das Entwerfen des Codes im Formular sprechen Module.

Liebe Leser! Welche JavaScript-Tutorials würden Sie Anfängern empfehlen?

Source: https://habr.com/ru/post/de423153/


All Articles