Vor ein paar Jahren zögerten Sie möglicherweise, NodeJS zu lernen, weil Sie befürchteten, dass es vom Front-End-Lernen ablenken würde. Aber jetzt, wenn Sie NodeJS nicht lernen, können Sie möglicherweise keine Fortschritte beim Front-End-Lernen machen. Der Fortschritt der Technologie ist so grausam. Wenn wir neue Technologien abwarten, ist die Technologie bereits populär geworden. In diesem Artikel werden die Grundkenntnisse von nodeJS vorgestellt.
Ryan Dahl war ein leitender C/C++-Programmierer, bevor er Node erstellte Hochleistungs-Webserver. Nach einigen Versuchen und Misserfolgen fand er mehrere Schlüsselpunkte für den Entwurf leistungsstarker Webserver: ereignisgesteuerte, nicht blockierende E/A, und dies sind die beiden Hauptmerkmale von NodeJS
Also Ryan Dahl Das Original Ziel war es, einen Webserver zu schreiben, der auf ereignisgesteuerten, nicht blockierenden E/A-Vorgängen basiert, um eine höhere Leistung zu erzielen und eine Alternative zu Servern wie Apache bereitzustellen. Beim Schreiben von Node bewertete Ryan Dahl C, Lua, Haskell, Ruby und andere Sprachen als alternative Implementierungen. Er kam zu dem Schluss, dass C eine hohe Entwicklungsschwelle aufweist und absehbar ist, dass nicht viele Entwickler es für den täglichen Gebrauch verwenden können. Geschäftsentwicklung, also geben Sie es auf; Ryan Dahl hatte das Gefühl, dass er mit Haskell nicht gut genug war, also gab er es auf; Lua selbst enthält bereits viele blockierende E/A-Bibliotheken, und der Aufbau einer nicht blockierenden E/A-Bibliothek dafür kann die Leute nicht ändern Ich habe weiterhin die blockierende E/A-Bibliothek verwendet, daher habe ich sie auch aufgegeben, und Rubys virtuelle Maschine wurde aufgrund schlechter Leistung abgelehnt.
Im Vergleich dazu hat JavaScript eine niedrigere Entwicklungsschwelle als C und hat weniger Historie Gepäck als Lua. Obwohl es serverseitiges JavaScript schon seit vielen Jahren gibt, gibt es für den Back-End-Teil keinen Markt. Man kann sagen, dass es keinen historischen Ballast gibt und es keinen zusätzlichen Widerstand gegen den Import nicht blockierender I/O-Bibliotheken gibt Es. Darüber hinaus verfügt JavaScript über eine breite Palette ereignisgesteuerter Anwendungen in Browsern, was mit Ryan Dahls Vorliebe für ereignisgesteuerte Anforderungen übereinstimmt. Zu dieser Zeit ging der zweite Browserkrieg allmählich zu Ende und die JavaScript-Engine V8 des Chrome-Browsers gewann den Titel Nr. 1 in Sachen Leistung. Unter Berücksichtigung der drei Hauptgründe für hohe Leistung, ereignisgesteuert und ohne historischen Ballast wurde JavaScript zunächst zur Implementierungssprache von Node
, Ryan Dahl nannte ihn Sein Projekt ist web.js, ein Webserver. Die Entwicklung des Projekts hat jedoch seine ursprüngliche Idee, einfach einen Webserver zu entwickeln, zu einem grundlegenden Framework für die Erstellung von Netzwerkanwendungen gemacht dass weitere Dinge wie Server, Clients, Befehlszeilentools usw. darauf aufgebaut werden können. Node hat sich zu einem Single-Thread- und Single-Process-System entwickelt, das keine gemeinsame Nutzung von Ressourcen erzwingt. Es enthält Bibliotheken, die sich sehr gut für das Netzwerk eignen, und bietet eine Infrastruktur für die Erstellung großer verteilter Anwendungen zum Aufbau schneller und skalierbarer Netzwerkanwendungen. Es selbst ist sehr einfach. Es organisiert viele Knoten über Kommunikationsprotokolle und lässt sich sehr leicht erweitern, um den Zweck der Erstellung umfangreicher Netzwerkanwendungen zu erreichen. Jeder Node-Prozess stellt einen Knoten in dieser Netzwerkanwendung dar, was die wahre Bedeutung seines Namens ist.
Als Backend-JavaScript-Laufplattform behält Node die vertraute Schnittstellen im Front-End-Browser-JavaScript, ohne irgendwelche Funktionen der Sprache selbst neu zu schreiben. Es basiert immer noch auf Umfang und Prototypenkette. Der Unterschied besteht darin, dass es Ideen, die im Front-End weit verbreitet sind, auf die Serverseite migriert. Die Eigenschaften von Node im Vergleich zu anderen Sprachen sind wie folgt
1. Asynchrone E/A
In Node werden die meisten Operationen asynchron aufgerufen. Ryan Dahl hat alle Schwierigkeiten überwunden und viele asynchrone E/A-APIs auf der untersten Ebene erstellt, vom Lesen von Dateien bis hin zu Netzwerkanforderungen usw. Die Bedeutung davon besteht darin, dass wir in Node natürlich parallele E/A-Operationen auf Sprachebene ausführen können. Es ist nicht erforderlich, zwischen den einzelnen Aufrufen auf den Abschluss des vorherigen E/A-Aufrufs zu warten. Die Effizienz kann im Programmiermodell erheblich verbessert werden
Nehmen Sie als Beispiel die gleichzeitige Ausführung von zwei Dateileseaufgaben. Asynchrone E/A hängt von der langsamsten Dateilesezeit ab, während synchrone E/A die benötigte Zeit beträgt die Summe der Zeit, die die beiden Aufgaben in Anspruch nehmen. Die Vorteile, die Asynchronität hier mit sich bringt, liegen auf der Hand
2. Ereignisse
Mit dem Aufkommen der Web 2.0-Ära hat JavaScript im Frontend mehr Verantwortung übernommen, und Ereignisse wurden ebenfalls häufig verwendet. Node ist nicht so stark von Java beeinflusst wie Rhino. Stattdessen führt es weit verbreitete und ausgereifte Ereignisse in Front-End-Browsern in das Back-End ein, kooperiert mit asynchroner E/A und stellt Ereignispunkte der Geschäftslogik zur Verfügung
Ereignisse Die Programmiermethode hat den Vorteil, dass sie leichtgewichtig und flexibel ist und sich nur auf Transaktionspunkte konzentriert. Im Szenario mehrerer asynchroner Aufgaben sind Ereignisse jedoch unabhängig voneinander und die Zusammenarbeit stellt ein Problem dar
3. Rückruffunktion
Im Vergleich zu anderen Web-Back-End-Programmiersprachen sind Rückruffunktionen neben asynchronen Funktionen und Ereignissen ein Hauptmerkmal von Node. Insgesamt gesehen sind Callback-Funktionen auch die beste Möglichkeit, Daten zu akzeptieren, die von asynchronen Aufrufen zurückgegeben werden. Diese Programmiermethode ist jedoch für viele Menschen, die mit der synchronen Programmierung vertraut sind, möglicherweise sehr ungewohnt. Die Reihenfolge, in der der Code geschrieben wird, hat nichts mit der Reihenfolge zu tun, in der er ausgeführt wird, was zu Leseschwierigkeiten führen kann. In Bezug auf die Prozesssteuerung wird es aufgrund der Vermischung von asynchronen Methoden und Rückruffunktionen weniger klar als bei herkömmlichen synchronen Methoden
4. Einzelthread
Ein Hauptmerkmal der JavaScript-Sprache ist, dass sie Single-Threaded ist, was bedeutet, dass sie jeweils nur eine Sache ausführen kann. JavaScript ist je nach Zweck Single-Threaded. Als Browser-Skriptsprache besteht der Hauptzweck von JavaScript darin, mit Benutzern zu interagieren und das DOM zu manipulieren. Dies legt fest, dass es nur Single-Threaded sein kann, da es sonst zu sehr komplexen Synchronisationsproblemen kommt. Angenommen, JavaScript verfügt über zwei Threads gleichzeitig. Ein Thread fügt Inhalt zu einem bestimmten DOM-Knoten hinzu und der andere Thread löscht den Knoten. Welchen Thread sollte der Browser in diesem Fall verwenden? Um Komplexität zu vermeiden, ist JavaScript daher seit seiner Geburt Single-Threaded, was zum Kernmerkmal dieser Sprache geworden ist.
Node behält die Single-Threaded-Eigenschaften von JavaScript im Browser bei. Und in Node kann JavaScript keinen Status mit anderen Threads teilen. Der größte Vorteil eines einzelnen Threads besteht darin, dass Sie sich keine Gedanken über Statussynchronisierungsprobleme wie bei der Multithread-Programmierung machen müssen. Es gibt hier keinen Deadlock und es gibt keinen Leistungsaufwand, der durch den Thread-Kontextaustausch verursacht wird
Ebenso Ein einzelner Thread hat auch die folgenden drei Aspekte: Er kann die Vorteile von Multi-Core-CPUs nicht nutzen. Fehler führen dazu, dass die gesamte Anwendung beendet wird, und die Robustheit der Anwendung ist es wert, die CPU zu belegen Dadurch ist es unmöglich, weiterhin asynchrone E/A aufzurufen.
So wie das Durchsuchen von JavaScript auf dem Server denselben Thread wie die Benutzeroberfläche nutzt. Die langfristige Ausführung von JavaScript führt zu einer Unterbrechung der Darstellung und Reaktion der Benutzeroberfläche. In Node führt eine langfristige CPU-Auslastung auch dazu, dass nachfolgende asynchrone E/A-Aufrufe nicht ausgegeben werden und die Rückruffunktion der abgeschlossenen asynchronen E/A nicht rechtzeitig ausgeführt wird
HTML5 passt das Web an Standardmäßig können Web Worker Worker-Threads erstellen, um Berechnungen durchzuführen und das Problem zu lösen, dass große JavaScript-Berechnungen das UI-Rendering blockieren. Um den Hauptthread nicht zu blockieren, liefert der Arbeitsthread die laufenden Ergebnisse durch Nachrichtenübermittlung, wodurch auch verhindert wird, dass der Arbeitsthread auf die Benutzeroberfläche im Hauptthread zugreift
Der Knoten übernimmt die gleiche Idee wie Web Worker, um sie zu lösen das Single-Thread-Problem Mittleres und großes Rechenproblem: child_process. Das Aufkommen von Unterprozessen bedeutet, dass Node die Probleme der Single-Threaded-Robustheit und der Unfähigkeit, Multi-Core-CPUs zu nutzen, ruhig bewältigen kann. Durch die Verteilung von Berechnungen auf einzelne Unterprozesse kann eine große Anzahl von Berechnungen aufgeteilt werden, und die Ergebnisse können dann über Ereignisnachrichten zwischen Prozessen kommuniziert werden, wodurch das Anwendungsmodell einfach und mit geringer Abhängigkeit gehalten werden kann. Durch die Master-Worker-Managementmethode kann jeder Arbeitsprozess auch gut verwaltet werden, um eine höhere Robustheit zu erreichen
Bei der Technologieauswahl müssen Sie vorher verstehen Für welche Szenarien eignet sich eine neue Technologie? Denn die richtige Technologie kann unerwartete Auswirkungen haben, wenn sie in den richtigen Szenarien eingesetzt wird. In Bezug auf Node sind die am häufigsten diskutierten E/A-intensiven und CPU-intensiven
1. E/A-intensive
Wenn alle Skriptsprachen an einem Ort beurteilt werden, dann von Aus einer Single-Thread-Perspektive ist die Fähigkeit von Node, I/O zu verarbeiten, einen Daumen hoch. Grundsätzlich spricht nichts dagegen, dass Node gut für I/O-intensive Anwendungsszenarien geeignet ist. Node ist netzwerkorientiert und gut im Bereich paralleler E/A und kann effektiv mehr Hardwareressourcen organisieren, um bessere Dienste bereitzustellen.
Der E/A-intensive Vorteil liegt hauptsächlich in der Verwendung von Ereignisschleifenverarbeitungsfunktionen durch Node Es beansprucht sehr wenig Ressourcen, jeden Thread zu starten, um jede Anfrage zu bedienen.
2. CPU-intensiv
Ist Node aus einer anderen Perspektive dazu in der Lage? Tatsächlich ist die Ausführungseffizienz von V8 sehr hoch. Allein anhand der Ausführungseffizienz zu urteilen, besteht kein Zweifel daran, dass die Ausführungseffizienz von V8
Die Herausforderungen, die CPU-intensive Anwendungen für Node mit sich bringen, sind hauptsächlich: aufgrund der Single-Threaded-Natur von JavaScript, wenn es lang laufende Berechnungen gibt (Zum Beispiel eine große Schleife) führt dazu, dass die CPU-Zeitscheibe nicht freigegeben werden kann, sodass nachfolgende E/A nicht initiiert werden können. Passen Sie jedoch große Rechenaufgaben entsprechend an und zerlegen Sie sie in mehrere kleine Aufgaben, damit die Rechenaufgaben rechtzeitig freigegeben werden können, ohne die Initiierung von E/A-Aufrufen zu blockieren. Auf diese Weise können Sie die Vorteile paralleler asynchroner E/A nutzen. O und nutzen Sie die CPU voll aus
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Grundkenntnisse von Node js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!