Ich verstehe nicht ganz, worum es bei Node.js geht. Vielleicht liegt es daran, dass ich hauptsächlich ein webbasierter Entwickler von Geschäftsanwendungen bin. Was ist es und wozu dient es?
Mein bisheriges Verständnis ist:
- Das Programmiermodell ist ereignisgesteuert, insbesondere die Art und Weise, wie es mit E / A umgeht .
- Es verwendet JavaScript und der Parser ist V8 .
- Es kann leicht verwendet werden, um gleichzeitige Serveranwendungen zu erstellen.
Sind meine Erkenntnisse richtig? Wenn ja, was sind dann die Vorteile von Evented I / O, ist es nur mehr für die Parallelität? Ist die Richtung von Node.js auch ein Framework wie ein JavaScript-basiertes (V8-basiertes) Programmiermodell?
quelle
Ich benutze Node.js bei der Arbeit und finde es sehr mächtig. Ich würde gezwungen sein, ein Wort zu wählen, um Node.js zu beschreiben, und würde "interessant" sagen (was kein rein positives Adjektiv ist). Die Community ist lebendig und wächst. JavaScript kann trotz seiner Kuriositäten eine großartige Sprache zum Codieren sein. Und Sie werden täglich Ihr eigenes Verständnis von "Best Practice" und den Mustern von gut strukturiertem Code überdenken. Momentan fließt eine enorme Energie von Ideen in Node.js, und wenn Sie daran arbeiten, sind Sie all diesem Denken ausgesetzt - großartigem mentalem Gewichtheben.
Node.js in der Produktion ist definitiv möglich, aber weit entfernt von der "schlüsselfertigen" Bereitstellung, die in der Dokumentation anscheinend versprochen wird. Mit Node.js v0.6.x wurde "Cluster" in die Plattform integriert und stellt einen der wesentlichen Bausteine dar. Mein "Production.js" -Skript enthält jedoch immer noch ~ 150 Logikzeilen, um Dinge wie das Erstellen des Protokolls zu erledigen Verzeichnis, Recycling toter Arbeiter usw. Für einen "ernsthaften" Produktionsservice müssen Sie auch darauf vorbereitet sein, eingehende Verbindungen zu drosseln und all die Dinge zu erledigen, die Apache für PHP erledigt . Um fair zu sein, hat Ruby on Rails genau dieses Problem. Es wird über zwei komplementäre Mechanismen gelöst: 1) Ruby auf Schienen / Knoten setzen.Apache / Lighttd ). Der Webserver kann statische Inhalte effizient bereitstellen, auf die Protokollierung zugreifen, URLs neu schreiben, SSL beenden , Zugriffsregeln durchsetzen und mehrere Unterdienste verwalten. Bei Anforderungen, die den eigentlichen Knotendienst erfüllen, leitet der Webserver die Anforderung weiter. 2) Verwenden eines Frameworks wie Unicorn , das die Arbeitsprozesse verwaltet, sie regelmäßig recycelt usw. Ich habe noch kein Node.js-Serving-Framework gefunden, das vollständig gebacken zu sein scheint. es mag existieren, aber ich habe es noch nicht gefunden und verwende immer noch ~ 150 Zeilen in meiner handgerollten "Production.js".
Das Lesen von Frameworks wie Express lässt den Eindruck entstehen, dass die Standardpraxis darin besteht, alles über einen einzigen Node.js-Service zu bedienen ... "app.use (express.static (__ dirname + '/ public'))" . Für Dienste und Entwicklungen mit geringerer Auslastung ist dies wahrscheinlich in Ordnung. Sobald Sie jedoch versuchen, Ihren Service zeitaufwändig zu belasten und ihn rund um die Uhr laufen zu lassen, werden Sie schnell die Motive entdecken, die große Websites dazu veranlassen, gut gebackenen, gehärteten C-Code wie Nginx auf ihre Website zu setzen und alle zu verwalten der statischen Inhaltsanforderungen (... bis Sie ein CDN wie Amazon CloudFront einrichten )). Für eine etwas humorvolle und unverfroren negative Einstellung sehen Sie diesen Kerl .
Node.js findet auch immer mehr Nicht-Service-Anwendungen. Selbst wenn Sie etwas anderes zum Bereitstellen von Webinhalten verwenden, können Sie Node.js als Build-Tool verwenden, indem Sie Ihren Code mit npm- Modulen organisieren, mit Browserify in ein einzelnes Asset zusammenfügen und mit uglify-js für die Bereitstellung minimieren . Für den Umgang mit dem Web ist JavaScript eine perfekte Impedanzanpassung und häufig die einfachste Angriffsroute. Wenn Sie beispielsweise eine Reihe von JSON- Antwortnutzdaten durchsuchen möchten , sollten Sie mein Unterstrich-CLI- Modul verwenden, das Dienstprogramm für strukturierte Daten.
Für und Wider:
Im Vergleich zu einem einfachen One-Process-per-Request-Modell ( LAMP ):
Im Gegensatz zum Schreiben eines "echten" Dienstes in Java / C # / C (C? Wirklich?)
Eine weitere Perspektive zu JavaScript und Node.js finden Sie unter Von Java zu Node.js , einem Blogbeitrag über die Eindrücke und Erfahrungen eines Java-Entwicklers beim Erlernen von Node.js.
Module Wenn der Knoten unter Berücksichtigung, bedenken Sie, dass Ihre Wahl von JavaScript - Bibliotheken werden DEFINE Ihre Erfahrungen. Die meisten Benutzer verwenden mindestens zwei, einen asynchronen Musterhelfer (Step, Futures, Async) und ein JavaScript-Zuckermodul ( Underscore.js ).
Helfer / JavaScript Sugar:
Asynchrone Mustermodule:
Um alles über die asynchronen Bibliotheken zu lesen, lesen Sie dieses Panel-Interview mit den Autoren.
Web Framework:
Testen:
Lesen Sie auch die offizielle Liste der empfohlenen Node.js-Module. Das Node Modules Wiki von GitHub ist jedoch viel vollständiger und eine gute Ressource.
Um Node zu verstehen, ist es hilfreich, einige der wichtigsten Designoptionen zu berücksichtigen:
Node.js ist EVENT -BASIERT und ASYNCHRON / NON-BLOCKING. Ereignisse wie eine eingehende HTTP-Verbindung lösen eine JavaScript-Funktion aus, die ein wenig Arbeit erledigt und andere asynchrone Aufgaben wie das Herstellen einer Verbindung zu einer Datenbank oder das Abrufen von Inhalten von einem anderen Server startet. Sobald diese Aufgaben gestartet wurden, wird die Ereignisfunktion beendet und Node.js wird wieder in den Ruhezustand versetzt. Sobald etwas anderes passiert, z. B. die Herstellung der Datenbankverbindung oder der externe Server, der mit Inhalten antwortet, werden die Rückruffunktionen ausgelöst und mehr JavaScript-Code ausgeführt, wodurch möglicherweise noch mehr asynchrone Aufgaben (wie eine Datenbankabfrage) ausgelöst werden. Auf diese Weise verschachtelt Node.js gerne Aktivitäten für mehrere parallele Workflows und führt alle Aktivitäten aus, die zu einem beliebigen Zeitpunkt nicht blockiert sind. Aus diesem Grund leistet Node.js hervorragende Arbeit bei der Verwaltung von Tausenden von gleichzeitigen Verbindungen.
Warum nicht wie alle anderen auch nur einen Prozess / Thread pro Verbindung verwenden?In Node.js ist eine neue Verbindung nur eine sehr kleine Heap-Zuordnung. Das Hochfahren eines neuen Prozesses benötigt erheblich mehr Speicher, auf einigen Plattformen ein Megabyte. Die tatsächlichen Kosten sind jedoch die mit dem Kontextwechsel verbundenen Gemeinkosten. Wenn Sie 10 ^ 6 Kernel-Threads haben, muss der Kernel viel Arbeit leisten, um herauszufinden, wer als nächstes ausgeführt werden soll. Es wurde viel Arbeit in die Erstellung eines O (1) -Planers für Linux gesteckt, aber am Ende ist es viel effizienter, einen einzelnen ereignisgesteuerten Prozess zu haben, als 10 ^ 6 Prozesse, die um die CPU-Zeit konkurrieren. Unter Überlastungsbedingungen verhält sich das Multiprozessmodell außerdem sehr schlecht und es fehlen wichtige Verwaltungs- und Verwaltungsdienste, insbesondere SSHD (was bedeutet, dass Sie sich nicht einmal in die Box einloggen können, um herauszufinden, wie geschraubt es wirklich ist).
Node.js ist SINGLE THREADED und LOCK FREE . Node.js hat als sehr bewusste Designauswahl nur einen einzigen Thread pro Prozess. Aus diesem Grund ist es grundsätzlich unmöglich, dass mehrere Threads gleichzeitig auf Daten zugreifen. Somit werden keine Schlösser benötigt. Fäden sind hart. Wirklich sehr, sehr schwer. Wenn Sie das nicht glauben, haben Sie nicht genug Thread-Programmierung durchgeführt. Das richtige Sperren ist schwierig und führt zu Fehlern, die wirklich schwer zu finden sind. Durch das Eliminieren von Sperren und Multithreading verschwindet eine der schlimmsten Fehlerklassen. Dies könnte der größte Vorteil des Knotens sein.
Aber wie nutze ich meine 16-Core-Box?
Zwei Wege:
Mit Node.js können Sie einige wirklich mächtige Dinge tun, ohne ins Schwitzen zu geraten. Angenommen, Sie haben ein Node.js-Programm, das eine Vielzahl von Aufgaben ausführt, einen TCP- Port auf Befehle überwacht und einige Bilder codiert, was auch immer. Mit fünf Codezeilen können Sie ein HTTP-basiertes Webverwaltungsportal hinzufügen, das den aktuellen Status aktiver Aufgaben anzeigt. Dies ist EINFACH zu tun:
Jetzt können Sie eine URL eingeben und den Status Ihres laufenden Prozesses überprüfen. Wenn Sie einige Schaltflächen hinzufügen, haben Sie ein "Verwaltungsportal". Wenn Sie ein laufendes Perl / Python / Ruby-Skript haben, ist es nicht ganz einfach, nur ein Verwaltungsportal einzurichten.
Aber ist JavaScript nicht langsam / schlecht / böse / Spawn-of-the-Devil? JavaScript hat einige seltsame Kuriositäten, aber mit "den guten Teilen" gibt es dort eine sehr mächtige Sprache, und auf jeden Fall ist JavaScript DIE Sprache auf dem Client (Browser). JavaScript ist hier, um zu bleiben; Andere Sprachen zielen darauf als IL ab, und Weltklasse-Talente konkurrieren um die Entwicklung der fortschrittlichsten JavaScript-Engines. Aufgrund der Rolle von JavaScript im Browser wird ein enormer technischer Aufwand betrieben, um JavaScript schnell zum Laufen zu bringen. V8ist die neueste und beste Javascript-Engine, zumindest für diesen Monat. Die anderen Skriptsprachen werden sowohl in Bezug auf Effizienz als auch in Bezug auf Stabilität (Sie sehen sich an, Ruby) umgehauen. Und es wird nur besser, wenn große Teams bei Microsoft, Google und Mozilla an dem Problem arbeiten und um die beste JavaScript-Engine konkurrieren (es ist kein JavaScript- "Interpreter" mehr, da alle modernen Engines Tonnen von JIT ausführenKompilieren unter der Haube mit Interpretation nur als Fallback für einmal ausgeführten Code). Ja, wir alle wünschen uns, wir könnten einige der seltsameren JavaScript-Sprachoptionen korrigieren, aber es ist wirklich nicht so schlimm. Und die Sprache ist so verdammt flexibel, dass Sie wirklich kein JavaScript codieren, sondern Step oder jQuery - mehr als jede andere Sprache definieren die Bibliotheken in JavaScript die Erfahrung. Um Webanwendungen zu erstellen, müssen Sie ohnehin JavaScript kennen, sodass das Codieren auf dem Server eine Art Synergie von Fähigkeiten bietet. Ich habe mich nicht davor gefürchtet, Client-Code zu schreiben.
Wenn Sie JavaScript WIRKLICH hassen, können Sie außerdem syntaktischen Zucker wie CoffeeScript verwenden . Oder irgendetwas anderes, das JavaScript-Code erstellt, wie das Google Web Toolkit (GWT).
Apropos JavaScript, was ist ein "Abschluss"? - Eine ziemlich ausgefallene Art zu sagen, dass Sie Variablen mit lexikalischem Gültigkeitsbereich über Anrufketten hinweg beibehalten. ;) So was:
Sehen Sie, wie Sie "myData" einfach verwenden können, ohne etwas Unangenehmes zu tun, wie es in einem Objekt zu verstecken? Und anders als in Java muss die Variable "myData" nicht schreibgeschützt sein. Diese leistungsstarke Sprachfunktion macht die asynchrone Programmierung weniger ausführlich und weniger schmerzhaft.
Das Schreiben von asynchronem Code wird immer komplexer sein als das Schreiben eines einfachen Single-Threaded-Skripts. Mit Node.js ist es jedoch nicht viel schwieriger und Sie erhalten neben der Effizienz und Skalierbarkeit für Tausende von gleichzeitigen Verbindungen viele Vorteile. ..
quelle
V8 ist eine Implementierung von JavaScript. Hiermit können Sie (unter anderem) eigenständige JavaScript-Anwendungen ausführen.
Node.js ist einfach eine für V8 geschriebene Bibliothek, die ereignisgesteuerte E / A ausführt. Dieses Konzept ist etwas schwieriger zu erklären, und ich bin sicher, dass jemand mit einer besseren Erklärung antworten wird als ich ... Das Wesentliche ist, dass Sie einfach nicht warten , anstatt Eingaben oder Ausgaben vorzunehmen und darauf zu warten, dass dies geschieht damit es zu Ende ist. Fragen Sie beispielsweise nach der zuletzt bearbeiteten Zeit einer Datei:
Dies kann einige Millisekunden oder Sekunden dauern. Mit ereignisgesteuerter E / A lösen Sie einfach die Anforderung aus und fügen statt zu warten einen Rückruf hinzu, der ausgeführt wird, wenn die Anforderung abgeschlossen ist:
Dies ähnelt dem JavaScript-Code im Browser (z. B. mit Funktionen im Ajax- Stil).
Weitere Informationen finden Sie in dem Artikel Node.js, der wirklich aufregend ist und meine Einführung in die Bibliothek / Plattform war. Ich fand ihn ziemlich gut.
quelle
Node.js ist ein Open Source-Befehlszeilentool, das für den serverseitigen JavaScript-Code entwickelt wurde. Sie können einen Tarball herunterladen , die Quelle kompilieren und installieren. Damit können Sie JavaScript-Programme ausführen.
Das JavaScript wird von V8 ausgeführt , einer von Google entwickelten JavaScript-Engine, die im Chrome- Browser verwendet wird. Es verwendet eine JavaScript-API, um auf das Netzwerk und das Dateisystem zuzugreifen.
Es ist beliebt für seine Leistung und die Fähigkeit, parallele Operationen durchzuführen.
Es folgen einige gute Artikel zum Thema.
quelle
Die Abschlüsse sind eine Möglichkeit, Code in dem Kontext auszuführen, in dem er erstellt wurde.
Für die Übereinstimmung bedeutet dies, dass Sie Variablen definieren, dann eine nicht blockierende E / A- Funktion initiieren und ihr eine anonyme Funktion für ihren Rückruf senden können.
Wenn die Aufgabe abgeschlossen ist, wird die Rückruffunktion im Kontext mit den Variablen ausgeführt. Dies ist der Abschluss.
Der Grund, warum Schließungen für das Schreiben von Anwendungen mit nicht blockierenden E / A so gut sind, ist, dass es sehr einfach ist, den Kontext von Funktionen zu verwalten, die asynchron ausgeführt werden.
quelle
Zwei gute Beispiele beziehen sich darauf, wie Sie Vorlagen verwalten und progressive Verbesserungen damit verwenden. Sie benötigen nur ein paar leichte Teile des JavaScript-Codes, damit es perfekt funktioniert.
Ich empfehle Ihnen dringend, diese Artikel anzuschauen und zu lesen:
Wählen Sie eine beliebige Sprache aus und versuchen Sie sich zu merken, wie Sie Ihre HTML-Dateivorlagen verwalten und was Sie tun müssen, um einen einzelnen CSS- Klassennamen in Ihrer DOM- Struktur zu aktualisieren (z. B. hat ein Benutzer auf einen Menüpunkt geklickt und diesen als markiert markiert "ausgewählt" und aktualisieren Sie den Inhalt der Seite).
Mit Node.js ist es so einfach wie im clientseitigen JavaScript-Code. Holen Sie sich Ihren DOM-Knoten und wenden Sie Ihre CSS-Klasse darauf an. Holen Sie sich Ihren DOM-Knoten und innerHTML Ihren Inhalt (dazu benötigen Sie zusätzlichen JavaScript-Code. Lesen Sie den Artikel, um mehr zu erfahren).
Ein weiteres gutes Beispiel ist, dass Sie Ihre Webseite mit JavaScript kompatibel machen können, das mit demselben Code ein- oder ausgeschaltet wird. Stellen Sie sich vor, Sie haben eine Datumsauswahl in JavaScript, mit der Ihre Benutzer jedes Datum mithilfe eines Kalenders abrufen können. Sie können denselben JavaScript-Code schreiben (oder verwenden), damit er mit ein- oder ausgeschaltetem JavaScript funktioniert.
quelle
Es gibt eine sehr gute Fast-Food-Analogie, die das ereignisgesteuerte Modell von Node.js am besten erklärt. Weitere Informationen finden Sie im vollständigen Artikel Node.js, Arztpraxen und Fast-Food-Restaurants - Grundlegendes zur ereignisgesteuerten Programmierung
Hier ist eine Zusammenfassung:
Node.js ist ereignisgesteuert, aber die meisten Webserver sind threadbasiert. York erklärt, wie Node.js funktioniert:
Sie verwenden Ihren Webbrowser, um eine Anforderung für "/about.html" auf einem Node.js-Webserver zu stellen.
Der Node.js-Server akzeptiert Ihre Anfrage und ruft eine Funktion zum Abrufen dieser Datei von der Festplatte auf.
Während der Node.js-Server auf das Abrufen der Datei wartet, wird die nächste Webanforderung bearbeitet.
Wenn die Datei abgerufen wird, wird eine Rückruffunktion in die Serverwarteschlange von Node.js eingefügt.
Der Node.js-Server führt diese Funktion aus, die in diesem Fall die Seite "/about.html" rendert und an Ihren Webbrowser zurücksendet.
quelle
Nun, ich verstehe das
Für mich bedeutet das, dass Sie in allen drei Annahmen richtig waren. Die Bibliothek sieht vielversprechend aus!
quelle
Vergessen Sie auch nicht zu erwähnen, dass Googles V8 SEHR schnell ist. Es konvertiert tatsächlich den JavaScript-Code in Maschinencode mit der angepassten Leistung der kompilierten Binärdatei. Zusammen mit all den anderen großartigen Dingen ist es Wahnsinnig schnell.
quelle
F: Das Programmiermodell ist ereignisgesteuert, insbesondere die Art und Weise, wie es mit E / A umgeht .
Richtig. Es werden Rückrufe verwendet, sodass bei jeder Anforderung zum Zugriff auf das Dateisystem eine Anforderung an das Dateisystem gesendet wird und Node.js dann mit der Verarbeitung der nächsten Anforderung beginnt. Es würde sich nur um die E / A-Anforderung kümmern, wenn es eine Antwort vom Dateisystem erhält. Zu diesem Zeitpunkt wird der Rückrufcode ausgeführt. Es ist jedoch möglich, synchrone E / A-Anforderungen zu stellen (dh Anforderungen zu blockieren). Es ist Sache des Entwicklers, zwischen asynchron (Rückruf) oder synchron (Warten) zu wählen.
F: Es verwendet JavaScript und der Parser ist V8.
Ja
F: Es kann leicht zum Erstellen gleichzeitiger Serveranwendungen verwendet werden.
Ja, obwohl Sie ziemlich viel JavaScript von Hand codieren müssten. Es ist möglicherweise besser, sich ein Framework wie http://www.easynodejs.com/ anzusehen, das eine vollständige Online-Dokumentation und eine Beispielanwendung enthält.
quelle