Schauen wir uns zunächst die Einführung auf der offiziellen Website von NodeJS an:
Seine Eigenschaften sind:
1. Es ist eine JavaScript -Ausführungsumgebung
2. Verweilen Sie sich auf die Chrome V8 Engine für Code -Erläuterung
3. Ereignisgetrieben
4. Nicht blockierende i/o
5. Leicht, skalierbar und für Echtzeit-Dateninteraktionsanwendungen geeignet
6. Einzelprozess, einzelner Thread
(1), warum wählt Nodejs JavaScript als Trägersprache aus
Zu Beginn der Implementierung von Node.js wählte der Autor Ryan Dahl nicht JavaScript. Er versuchte C und Lua, weil es einige hochrangige Sprachmerkmale wie Schließungen und funktionale Programmierungen fehlten, was das Programm kompliziert und schwer zu pflegen machte.
JavaScript ist eine Sprache, die das funktionale Programmierparadigma unterstützt, das gut zum ereignisgesteuerten Programmiermodell von Node.js passt. Darüber hinaus hat die von Google bereitgestellte V8 -Engine die Ausführungsgeschwindigkeit der JavaScript -Sprache erheblich verbessert.
Was uns schließlich präsentiert wird, ist Node.js, nicht node.c, node.lua oder andere Sprachimplementierungen.
(2) Node.js ist keine JS -Anwendung, sondern eine JS -Betriebsplattform
Wenn Sie den Namen node.js sehen, denken Anfänger möglicherweise fälschlicherweise, dass dies eine JavaScript -Anwendung ist. Tatsächlich ist Node.js in C ++ geschrieben und ist eine JavaScript -Ausführungsumgebung.
Node.js verwendet die V8-Engine von Google Chrome, die eine gute Leistung hat und auch viele APIs auf Systemebene bietet, z. B. Dateibetrieb, Netzwerkprogrammierung usw.
Hier sind alle Module, die an NodeJs beteiligt sind:
Der JavaScript -Code auf der Browserseite unterliegt beim Ausführen unterschiedlichen Sicherheitsbeschränkungen, und der Betrieb des Kundensystems ist begrenzt.
Im Gegensatz dazu ist Node.js eine umfassende Hintergrund -Laufzeit, die JavaScript mit vielen Funktionen bereitstellt, die andere Sprachen erzielen können.
(3) Merkmale von Node.js
Node.js ist auch relativ innovativ im Design. Es läuft in einem einzelprozess- und Single-Thread-Modus (dies steht im Einklang mit der Art und Weise, wie JavaScript ausgeführt wird).
Der ereignisgesteuerte Mechanismus wird von Node.js durch interne Einzel-Threading-Wartung von Ereignisschlangenwarteschlangen implementiert. Es gibt keine Ressourcenbeschäftigung und Kontextwechsel von Multi-Threads. Dies bedeutet, dass Node.js angesichts von groß angelegten HTTP-Anfragen alles mit ereignisgetriebenen umgeht.
Web-Service-Entwickler, die an traditionelle Sprachen gewöhnt sind, sind möglicherweise sehr vertraut mit der Parallelität und Zusammenarbeit mit mehreren Threaden, aber angesichts von Node.js müssen wir ihre Merkmale akzeptieren und verstehen.
Zwei wichtige Konzepte
1. Was ist Ereignisschleife? (Ein sehr wichtiges Konzept)
Die Ereignisschleife ist ein sehr wichtiges Konzept, das sich auf einen Betriebsmechanismus des Computersystems bezieht.
Wenn Sie die Ereignisschleife verstehen möchten, müssen Sie mit dem Auslaufmodus des Programms beginnen. Das Programm nach dem Laufen wird als Prozess bezeichnet. Im Allgemeinen kann ein Prozess jeweils nur eine Aufgabe ausführen.
Wenn viele Aufgaben ausgeführt werden müssen, gibt es nur drei Lösungen.
(1), Aufstellung. Da ein Prozess jeweils nur eine Aufgabe ausführen kann, muss er warten, bis die vorherige Aufgabe abgeschlossen ist, bevor die nachfolgende Aufgabe ausgeführt wird.
(2) Erstellen Sie einen neuen Prozess. Verwenden Sie den Befehl fork, um für jede Aufgabe einen neuen Prozess zu erstellen.
(3) Erstellen Sie einen neuen Thread. Da Prozesse zu viele Ressourcen verbrauchen, ermöglichen die heutigen Programme häufig einen Prozess, mehrere Threads zu enthalten, und die Threads erledigen die Aufgabe.
Nehmen Sie als Beispiel JavaScript -Sprache. Es ist eine einzelne Sprache. Alle Aufgaben werden auf einem Thread erledigt, dh die erste oben genannte Methode wird angewendet. Sobald Sie auf eine große Anzahl von Aufgaben oder eine zeitaufwändige Aufgabe begegnet sind, erlebt die Webseite "gefälschten Tod", da JavaScript nicht aufhören kann und nicht auf das Benutzerverhalten reagieren kann.
Sie können sich fragen, warum JavaScript -einzelner Thread? Kann es nicht als Multi-Threaded implementiert werden?
Dies hat etwas mit der Geschichte zu tun:
Ein Hauptmerkmal der JavaScript -Sprache ist ein einzelnes Threading, was bedeutet, dass Sie nur eine Sache gleichzeitig tun können. Warum kann JavaScript nicht mehrere Threads haben? Dies wird die Effizienz verbessern.
Das einzelne Threading von JavaScript hängt mit seinem Zweck zusammen. Als Browser -Skriptsprache besteht der Hauptzweck von JavaScript darin, mit Benutzern zu interagieren und DOM zu betreiben. Dies stellt fest, dass es nur ein einzelnes Gewinde sein kann, andernfalls verursacht es sehr komplexe Synchronisationsprobleme.
Angenommen, JavaScript hat zwei Threads gleichzeitig, ein Thread fügt einen Inhalt eines bestimmten DOM -Knotens hinzu, und der andere Thread löscht diesen Knoten. Welchen Thread sollte der Browser zu diesem Zeitpunkt aufnehmen?
Um Komplexität zu vermeiden, ist JavaScript daher ein einzelner Thread von seiner Geburt, der zum Kernmerkmal dieser Sprache geworden ist und sich in Zukunft nicht ändern wird.
Um die Rechenleistung von Multi-Core-CPUs zu nutzen, schlägt HTML5 den Web-Worker-Standard vor, sodass JavaScript-Skripte mehrere Threads erstellen können. Die untergeordneten Threads werden jedoch vollständig vom Haupt-Thread gesteuert und können die DOM nicht bedienen.
Daher ändert dieser neue Standard die Art von JavaScript -Einzel -Threading nicht.
Zurück zu EventLoop:
Ein einzelnes Threading bedeutet, dass alle Aufgaben in die Warteschlange gestellt werden müssen, und die vorherige Aufgabe wird ausgeführt, bevor die nächste Aufgabe ausgeführt wird. Wenn die vorherige Aufgabe lange dauert, muss die nächste Aufgabe warten.
Wenn die Warteschlange auf die große Menge an Computer zurückzuführen ist und die CPU zu beschäftigt ist, wäre sie in Ordnung, aber oft ist die CPU in Leerlauf, da das IO -Gerät (Eingangs- und Ausgabegerät) sehr langsam ist (z.
Der Designer der JavaScript -Sprache erkannte, dass der Haupt -Thread zu diesem Zeitpunkt das IO -Gerät vollständig ignorieren, die Warteaufgaben suspendieren und zuerst die nächsten Aufgaben ausführen kann. Warten Sie, bis das IO -Gerät das Ergebnis zurückgibt, dann drehen Sie sich um und setzen Sie die suspendierte Aufgabe fort.
Daher können alle Aufgaben in zwei Typen unterteilt werden, eine synchrone Aufgabe und die andere ist eine asynchrone Aufgabe. Synchronen Aufgaben beziehen sich auf die Aufgaben, die im Haupt -Thread in die Warteschlange gestellt werden. Nur die vorherige Aufgabe wurde ausgeführt.
Die letztere Aufgabe kann ausgeführt werden; Eine asynchrone Aufgabe bezieht sich auf eine Aufgabe, die nicht in den Haupt -Thread eintritt, sondern in die "Task -Warteschlange" eingeht. Nur wenn die "Task -Warteschlange" den Haupt -Thread benachrichtigt, dass eine asynchrone Aufgabe ausgeführt werden kann, wird die Aufgabe für die Ausführung den Haupt -Thread eingeben.
Wie in der Abbildung unten gezeigt:
Solange der Hauptfaden leer ist, lautet er die "Task -Warteschlange". Dies ist der laufende Mechanismus von JavaScript. Dieser Vorgang wird kontinuierlich wiederholt.
A. Beispiel Erklärung
Okay, sagen wir nicht viel "Unsinn", starten wir unsere erste NodeJS -Anwendung: "Hallo Big Bear" sofort.
Öffnen Sie Ihren bevorzugten Editor und erstellen Sie eine helloWorld.js -Datei.
Der Code ist wie folgt:
Die Codekopie lautet wie folgt: 1 var http = required ("http"); 2 http.createServer (Funktion (Anfrage, Antwort) {3 Antwort.WriteHead (200, {4 "Inhaltstyp": "Text/Plain" 5}); 6 Antwort.Write ("Hallo, Big Bear!"); 7 Antwort (); 8}). Hören (8888);
Lassen Sie uns diesen Code ausführen und testen. Führen Sie zunächst Ihr Skript mit node.js aus:
Öffnen Sie das Befehlszeilen -Tool CMD, wechseln Sie zu Ihrem Arbeitsverzeichnis und führen Sie den Befehl "Node HelloWorld.js" aus
Öffnen Sie als nächstes den Browser und besuchen Sie http: // localhost: 8888/, und Sie werden eine Webseite mit den Wörtern "Hallo, Big Bear!" Sehen.
Ein bisschen erweitertes Wissen:
Wie in der folgenden Abbildung gezeigt, ist dies Teil des Quellcode von http.js in NodeJs. CreateServer ist eine benutzerfreundliche Oberfläche. Die interne Implementierung nimmt ein Singleton -Modell an. Der Vorteil davon besteht darin, die Erstellungs- und Initialisierungsaufgaben von Instanzen effektiv zu trennen, sich auf Verantwortlichkeiten zu konzentrieren und die Kopplung zu verringern. Dies ist eine Idee, die jeder beim Programmieren lernen kann.
Hahaha, ist es nicht sehr interessant? Dies ist nur eine kurze Erfahrung. Ich werde später viele Wissenspunkte erklären. Jeder kann langsam o (∩_∩) o haha ~ verstehen
Iv. Gesamtübersicht
1. Es ist eine JavaScript -Ausführungsumgebung
2. Verweilen Sie sich auf die Chrome V8 Engine für Code -Erläuterung
3. Ereignisgetrieben
4. Nicht blockierende i/o
5. Leicht, skalierbar und für Echtzeit-Dateninteraktionsanwendungen geeignet
6. Einzelprozess, einzelner Thread
Schließlich möchte ich sagen: Es gibt nicht viele Beispiele in diesem Artikel, aber diese Konzepte sind sehr wichtig. Sie müssen ein klares Verständnis haben, damit Sie eine solide Grundlage für zukünftige NodeJS -Lernen legen. Komm schon, arbeite hart zusammen.
Hahaha, dieser Artikel ist vorbei und wird nicht fortgesetzt. Ich hoffe, mehr mit Ihnen zu kommunizieren und gemeinsam Fortschritte zu machen. . . . . . Huhuhuhu… (*^__^*)