Ein Leitfaden für Anfänger zu Node.js. Teil 2





Guten Tag, Freunde!



Ich poste weiterhin eine Übersetzung dieses Node.js-Tutorials .



Andere Teile:



Teil 1

Teil 2

Teil 3

Teil 4



JavaScript V8-Engine



V8 ist der Name der von Google Chrome unterstützten JavaScript-Engine. Dies ist die Sache, die Ihren JavaScript-Code nimmt und im Browser ausführt.



Mit anderen Worten, V8 ist eine JavaScript-Laufzeit. DOM und andere Web-APIs werden ebenfalls vom Browser verfügbar gemacht.



Die JavaScript-Engine ist browserunabhängig. Dies führte zur Entstehung von Node.js. V8 wurde 2009 als Engine für Node.js ausgewählt. Mit der wachsenden Beliebtheit von Node.js wurde V8 zur Basis für viele serverseitige JavaScript-Dateien.



Das Node.js-Ökosystem ist riesig und dank V8 können wir Desktop-Anwendungen beispielsweise mit Electron erstellen.



Andere JS-Motoren


Andere Browser haben ihre eigenen JavaScript-Engines:





usw.



Alle diese Engines implementieren den ECMA ES-262- Standard (ECMAScript) , den von JavaScript verwendeten Standard.



Über die Leistung


V8 ist in C ++ geschrieben und entwickelt sich weiter. Es funktioniert auf allen Betriebssystemen.



Wir werden nicht auf die Besonderheiten der V8-Implementierung eingehen: Sie finden sie hier , sie ändern sich von Zeit zu Zeit, oft radikal.



V8 wird wie andere JavaScript-Engines ständig weiterentwickelt, um die Geschwindigkeit des Webs und des Node.js-Ökosystems zu verbessern.



Es gibt einen Wettbewerb um Produktivität im Web, der viele Jahre dauert, und wir (als Benutzer und Entwickler) profitieren stark von diesem Wettbewerb, da wir jedes Jahr schnellere und optimierte Tools erhalten.



Zusammenstellung


JavaScript wird normalerweise als interpretierte Sprache vermarktet, aber moderne Engines interpretieren JavaScript nicht nur, sondern kompilieren es.



Dies geschieht seit 2009, als der SpiderMonkey-JavaScript-Compiler in Firefox 3.5 hinzugefügt wurde.



JavaScript wird von V8 (Just-in-Time, JIT, dynamische Kompilierung) im laufenden Betrieb kompiliert, um die Ausführung zu beschleunigen.



Dies mag nicht intuitiv erscheinen, aber mit dem Aufkommen von Google Maps im Jahr 2004 entwickelte sich JavaScript von der Sprache, in der kleine Codeblöcke geschrieben werden, zu der Sprache, in der vollwertige Anwendungen erstellt werden, die aus Hunderten und Tausenden von Codezeilen besteht, die im Browser ausgeführt werden.



Heutzutage können unsere Browseranwendungen stundenlang ausgeführt werden. Sie sind keine einfachen Werkzeuge mehr zur Lösung primitiver Aufgaben wie der Formularvalidierung.



In der heutigen Welt ist das Kompilieren von JavaScript sinnvoll: Obwohl die Vorbereitung des Codes länger dauert, übertrifft seine Leistung die Leistung des interpretierten Codes erheblich.



Ausführen von Node.js-Skripten über die Befehlszeile



Die Standardmethode zum Ausführen von Node.js-Programmen besteht darin, einen globalen Befehl auszuführen nodeund den Namen der ausführbaren Datei zu übergeben.



Wenn die Hauptdatei Ihrer Node.js-Anwendung benannt ist app.js, können Sie sie folgendermaßen aufrufen:



node app.js


Stellen Sie beim Ausführen des angegebenen Befehls sicher, dass Sie sich im Verzeichnis mit der Datei befinden app.js.



Wie beende ich Node.js?



Es gibt verschiedene Möglichkeiten, eine Node.js-Anwendung zu stoppen.



Wenn Sie ein Programm über das Terminal ausführen, können Sie es schließen. ctrl-CLassen Sie uns jedoch die programmatischen Möglichkeiten diskutieren.



Beginnen wir mit dem radikalsten und sprechen wir darüber, warum es nicht verwendet werden sollte.



Das Hauptmodul (globales Kernelmodul) processbietet eine einfache Methode, um aus der Anwendung software-Node.js herauszukommen : process.exit().



Wenn Node.js diese Codezeile erreicht, endet der Ausführungsprozess des Programms sofort.



Dies bedeutet, dass alle ausgeführten Rückruffunktionen, gesendeten (unvollständigen) Anforderungen, offener Zugriff auf das Dateisystem, Schreibvorgänge in stdoutoder stderr- alle hart unterbrochen werden.



Wenn dies für Sie akzeptabel ist, können Sie exit()eine Ganzzahl an die Methode übergeben - ein Signal, um die Ausführung des Codes abzuschließen:



process.exit(1)


Der Standard-Exit-Code ist 0, was auf Erfolg hinweist. Unterschiedliche Exit-Codes haben unterschiedliche Bedeutungen. Sie können sie verwenden, um sicherzustellen, dass einige Programme mit anderen interagieren.



Weitere Informationen zu Exit-Codes finden Sie hier .



Sie können der Eigenschaft auch einen geeigneten Wert zuweisen exitCode:



process.exitCode = 1


Nach Abschluss des Programms gibt Node.js diesen Code zurück.



Die Programmausführung wird leise beendet, wenn alle Prozesse abgeschlossen sind.



In Node.js starten wir häufig den Server:



const express = require('express')
const app = express()

app.get('/', (req, res) => {
    res.send('Hi!')
})

app.listen(3000, () => console.log('Server ready'))


Dieses Programm wird niemals beendet. Wenn Sie anrufen process.exit(), werden alle ausstehenden oder laufenden Anforderungen abgebrochen. Ist nicht cool.



In diesem Fall muss ein Signalbefehl gesendet SIGTERMund mit einem Prozessorsignal-Handler verarbeitet werden ( processSie müssen ihn nicht anschließen, er ist standardmäßig verfügbar):



const express = require('express')

const app = express()

app.get('/', (req, res) => {
    res.send('Hi!')
})

const server = app.listen(3000, () => console.log('Server ready'))

process.on('SIGTERM', () => {
    server.close(() => {
        console.log('Process terminated')
    })
})


Was sind Signale? Signale sind ein POSIX-Kommunikationssystem: Sie benachrichtigen einen Prozess, dass ein Ereignis aufgetreten ist.



SIGKILL- ein Signal über den sofortigen Abschluss des Prozesses, ähnlich process.exit().



SIGTERM- ein Signal für den sanften Abschluss des Prozesses. Dieses Signal kann von einem Prozessleitsystem gesendet werden, wie upstart, supervisordusw.



Sie können dieses Signal innerhalb des Programms durch eine andere Funktion senden:



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


Oder von einem anderen Node.js-Programm oder einer anderen Anwendung, die auf dem System ausgeführt wird, vorausgesetzt, sie kennen die PID des Prozesses, den Sie beenden möchten.



Wie lese ich Umgebungsvariablen in Node.js?



Das Hauptmodul Node.js processverfügt über eine Eigenschaft, envdie alle Umgebungsvariablen enthält, die beim Starten des Prozesses festgelegt wurden.



Hier ist ein Beispiel für den Zugriff auf die Standardumgebungsvariable NODE_ENV development:



process.env.NODE_ENV // development


Durch Festlegen eines Werts in der Produktion vor dem Ausführen des Skripts wird Node.js mitgeteilt, dass eine Produktionsumgebung vor ihm steht.



Auf ähnliche Weise können Sie auf jede festgelegte Umgebungsvariable zugreifen.



Verwendung der Node.js REPL



Mit dem Befehl nodewerden Node.js-Skripte ausgeführt:



node script.js 


Wenn wir den Dateinamen weglassen, gelangen wir in den REPL-Modus:



node 


REPL (Run Evaluate Print Loop) ist eine Codelaufzeit (normalerweise ein Terminalfenster), die einen vom Benutzer eingegebenen Ausdruck akzeptiert und das Ergebnis der Auswertung dieses Ausdrucks zurückgibt.



Wenn Sie das nodeTerminal betreten , geschieht Folgendes:



>


Das Terminal wechselt in den Standby-Modus.



Genauer gesagt erwartet das Terminal in diesem Fall die Eingabe eines JavaScript-Codes.



Lassen Sie uns Folgendes vorstellen:



> console.log('test')
test 
undefined 
>


Der erste Wert testist der undefinedWert, den wir an die Konsole ausgegeben haben. Dann erhalten wir den Wert, den die Ausführung zurückgegeben hat. console.log()



Danach können wir etwas anderes eingeben.



Zur tabautomatischen Vervollständigung verwenden


REPL ist interaktiv.



Wenn tabbeim Schreiben von Code gedrückt wird, versucht die REPL, das Geschriebene zu vervollständigen, indem sie aus zuvor definierten oder vordefinierten Variablen auswählt.



JavaScript-Objekte


Geben Sie den Namen der JavaScript-Klasse ein, Numberfügen Sie beispielsweise einen Punkt hinzu und klicken Sie auf tab.



Die REPL zeigt alle Eigenschaften und Methoden dieser Klasse an:







Globale Objekte


Sie können eine Liste globaler Objekte abrufen, indem Sie Folgendes eingeben global.und drücken tab:







Sondervariable _


Wenn Sie am Ende des Codes eingeben _, wird das Ergebnis der letzten Operation angezeigt.



Befehle nach Punkt


Die REPL enthält einige spezielle Befehle, die mit einem Punkt beginnen. Hier sind sie:



  • .help - zeigt eine Liste der verfügbaren Befehle
  • .editor- Aktiviert den Bearbeitungsmodus zum Schreiben von mehrzeiligem JavaScript-Code. Drücken Sie, um den Code in diesem Modus auszuführenctrl-D
  • .break- stoppt die Eingabe eines mehrzeiligen Codes. Ähnlich wie beim Drückenctrl-C
  • .clear - Setzt den REPL-Kontext auf ein leeres Objekt zurück und entfernt den gesamten eingegebenen Code
  • .load - Lädt eine JavaScript-Datei im aktuellen (Arbeits-) Verzeichnis
  • .save - speichert die REPL-Sitzung in einer Datei mit dem angegebenen Namen
  • .exit- REPL verlassen. Gleich wie doppeltes Tippenctrl-C


REPL versteht, dass Sie mehrseitigen Code eingeben, ohne aufzurufen .editor.



Wenn Sie beispielsweise mit der Implementierung der Iteration begonnen haben:



[1, 2, 3].forEach(num => {


enterWenn Sie diese Taste drücken , springt die REPL zu einer neuen Zeile mit drei Punkten am Anfang, um anzuzeigen, dass Sie mit dem Codeblock weiterarbeiten können:



... console.log(num)
... })


Wenn Sie .breakam Ende eingeben , wird der mehrzeilige Codemodus gestoppt und der Ausdruck wird nicht ausgeführt.



Übergeben von Argumenten über die Befehlszeile



Beim Starten einer Node.js-Anwendung können Sie eine beliebige Anzahl von Argumenten übergeben.



Argumente können eigenständig oder Schlüssel und Wert sein.



Beispielsweise:



node app.js joe


oder



node app.js name=joe 


Wie Sie den Wert in Node.js Code abrufen, hängt davon ab.



Ein eingebautes Objekt wird zum Abrufen von Werten verwendet process.



Die Eigenschaft argvdieses Objekts enthält ein Array von Argumenten, die über die Befehlszeile übergeben werden.



Das erste Argument ist der vollständige Pfad des Befehls node.



Der zweite ist der vollständige Pfad der ausführbaren Datei.



Die für uns interessanten Argumente beginnen an der dritten Position (Array-Index).



Sie können die Argumente (einschließlich des Knotenpfads und des Dateipfads) mit einer Schleife durchlaufen:



process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`)
})


Die übergebenen Argumente können durch Erstellen eines neuen Arrays ohne die ersten beiden Parameter erhalten werden:



const args = process.argv.slice(2)


Wenn wir ein Argument ohne Index (Schlüssel) haben:



node app.js joe


wir können es so bekommen:



const args = process.argv.slice(2)
args[0]


In diesem Fall:



node app.js name=joe


args[0]- name=joeDeshalb müssen wir es analysieren. Der beste Weg, dies zu tun, besteht darin, die Minimistenbibliothek für den Umgang mit Argumenten zu verwenden:



const args = require('minimist')(process.argv.slice(2))
args['name'] // joe


Hier müssen Sie vor jedem Argument einen doppelten Bindestrich verwenden:



node app.js --name=joe


Ausgabe von Ergebnissen in die Befehlszeile mit Node.js



Standardausgabe über Modul console


Node.js bietet ein Konsolenmodul , das viele sehr nützliche Möglichkeiten zur Interaktion mit der Befehlszeile enthält.



Es sieht aus wie ein consoleBrowserobjekt.



Eine der Hauptmethoden dieses Moduls ist console.log()das Drucken der übergebenen Zeichenfolge an die Konsole.



Wenn Sie ein Objekt übergeben, wird es in eine Zeichenfolge konvertiert.



Wir können console.logmehrere Variablen übergeben:



const x = 'x'
const y = 'y'
console.log(x, y)


und Node.js geben beide aus.



Wir können die Zeichenfolge auch mithilfe von Bezeichnern formatieren:



Zum Beispiel:



console.log('My %s has %d years', 'cat', 2)


  • %s - formatiert eine Variable als Zeichenfolge
  • %d - formatiert eine Variable als Zahl
  • %i - konvertiert eine Variable in eine Ganzzahl
  • %o - formatiert eine Variable als Objekt


Beispielsweise:



console.log('%o', Number)


Konsole reinigen


console.clear() löscht die Konsole (das Verhalten hängt von der verwendeten Konsole ab).



Elemente zählen


console.count()- eine bequeme Methode.



Untersuchen Sie diesen Code:



const x = 1 
const y = 2 
const z = 3
console.count(
    'The value of x is ' + x +
    ' and has been checked .. how many times?'
)
console.count(
    'The value of x is ' + x +
    ' and has been checked .. how many times?'
)
console.count(
    'The value of y is ' + y +
    ' and has been checked .. how many times?'
)


Der Zähler zählt die Anzahl der Zeilenanzeigen und zeigt diese Anzahl an.



The value of x is 1 and has been checked .. how many times?: 1
The value of x is 1 and has been checked .. how many times?: 2
The value of y is 2 and has been checked .. how many times?: 1  


So können Sie die Anzahl der Äpfel und Orangen zählen:



const oranges = ['orange', 'orange']
const apples = ['just one apple']
oranges.forEach(fruit => console.count(fruit))
apples.forEach(fruit => console.count(fruit))


Anzeigen der Stapelverfolgung


Es gibt Situationen, in denen Sie beispielsweise die Stapelverfolgung einer Funktion anzeigen müssen, um die Frage "Wie haben wir diesen Code erreicht?" Zu beantworten.



Sie können es tun mit console.trace():



const function2 = () => console.trace()
const function1 = () => function2()
function1()


Dadurch wird eine Stapelverfolgung auf der Konsole gedruckt. Dies sehen wir in der Befehlszeile, wenn wir den obigen Code in der Node.js REPL ausführen:



Trace
    at function2 (repl:1:33)
    at function1 (repl:1:25)
    at repl:1:1
    at ContextifyScript.Script.runInThisContext (vm.js:44:33)
    at REPLServer.defaultEval (repl.js:239:29)
    at bound (domain.js:301:14)
    at REPLServer.runBound [as eval] (domain.js:314:12)
    at REPLServer.onLine (repl.js:440:10)
    at emitOne (events.js:120:20)
    at REPLServer.emit (events.js:210:7)


Ausführungszeit des Codes zählen


Sie können ganz einfach berechnen , wie lange eine Funktion ausgeführt worden time()und timeEnd():



const doSomething = () => console.log('test')
const measureDoingSomething = () => {
    console.time('doSomething()')
    //  -      
    doSomething()
    console.timeEnd('doSomething()')
}
measureDoingSomething()


stdout und stderr


Wie wir wissen, eignet sich console.log hervorragend zum Drucken von Nachrichten an die Konsole. Dies wird als Standardausgabe oder bezeichnet stdout.



console.errorzeigt den Stream an stderr.



Dieser Stream wird nicht an die Konsole ausgegeben, sondern in das Fehlerprotokoll geschrieben.



Styling der Ausgabe


Sie können die Textausgabe an die Konsole mithilfe von Escape-Sequenzen einfärben . Diese Sequenzen sind eine Reihe von Symbolen, die eine Farbe identifizieren.



Beispielsweise:



console.log('\x1b[33m%s\x1b[0m', 'hi!')


Wenn Sie den obigen Code in die REPL von Node.js eingeben, hi!wird er gelb angezeigt .



Die betrachtete Methode ist ziemlich mühsam. Der einfachste Weg, die Konsolenausgabe einzufärben, ist die Verwendung einer Bibliothek. Eine dieser Bibliotheken ist Chalk , mit der Sie nicht nur Farben definieren, sondern auch Text fett, kursiv oder unterstrichen machen können.



Installieren Sie die Bibliothek mit npm install chalkund verwenden Sie sie wie folgt:



const chalk = require('chalk')
console.log(chalk.yellow('hi!'))


Die Verwendung ist chalk.yellowviel einfacher als das Speichern komplexer Sequenzen. Dadurch wird der Code auch besser lesbar.



Fortschrittsanzeige erstellen


Progress ist eine großartige Bibliothek zum Erstellen von Fortschrittsbalken im Terminal. Installieren Sie es mit npm install progress.



Dieses Snippet erstellt einen 10-Stufen-Fortschrittsbalken. Alle 100 ms wird ein Schritt ausgeführt. Beim Ausfüllen des Indikators deaktivieren wir den Zähler:



const ProgressBar = require('progress')

const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
    bar.tick()
    if (bar.complete) clearInterval(timer)
}, 100)


Vielen Dank für Ihre Aufmerksamkeit, Freunde. Wenn Sie Fehler und Tippfehler finden, zögern Sie nicht, in PM zu schreiben, ich werde dankbar sein.



Fortsetzung folgt…



All Articles