Ist Node.js ein Framework? [geschlossen]

35

Ich sehe immer wieder Personalvermittler, Entwickler usw., die auf Node.js als Framework verweisen. Meiner Meinung nach liegt dies an der Unwissenheit darüber, was Node.js wirklich ist.

In Stellenbeschreibungen wird Node.js häufig als Bibliothek in AngularJS , React usw. gruppiert. Im Allgemeinen wird es meiner Ansicht nach von jemandem eingegeben, der den Unterschied nicht kennt (Personalabteilung, Personalvermittler usw.).

Meiner Meinung nach ist Node.js eine Plattform oder eine Laufzeitumgebung. Es schaltet die DOM-API (JavaScript im Browser) für verschiedene andere APIs wie das Dateisystem aus (da es als Server und nicht im Browser ausgeführt wird).

Warum denken die Leute, dass Node.js ein Framework ist? Liege ich falsch? Ist es eigentlich ein Rahmen?

Ndugger
quelle
5
Nicht besonders, aber ich konnte die Verwirrung sehen.
ndugger
1
Vor langer Zeit, als der Knoten zum ersten Mal herauskam, habe ich auf SO eine Antwort gepostet, die besagt, dass der Knoten kein Framework ist. Diese Antwort wurde damals extrem abgelehnt. Heutzutage glauben nur sehr wenige Leute, die node verwenden, dass dies ein Framework ist. Es ist ein Framework in dem gleichen Sinne wie Swift ein Framework ist oder Go ein Framework ist oder Rust ein Framework ist. Moderne Programmiersprachen haben einfach APIs auf sehr hoher Ebene, die früher als Frameworks implementiert wurden. "Plattform" ist ein gutes Wort. Ich würde sagen, es ist selbst ein Dolmetscher (unter Verwendung der traditionellen Unix-Bedeutung dieses Wortes)
slebetman
Beachten Sie, dass Node die DOM-API nicht ausschaltet und alles, was Sie mit Javascript ausführen können, mit oder ohne Node weiterhin verfügbar ist.
Rob
@slebetman Was ist die "andere" Bedeutung des Interpreters? Ich wusste nicht, dass es dort auch eine Debatte gibt! : S
J. Abrahamson

Antworten:

44

Es ist ein bisschen schwer zu sagen, weil diese Wörter nicht gut definiert sind. Im allgemeinen Sprachgebrauch finde ich es etwas untypisch, Node.js als Framework zu bezeichnen, aber es fällt mir schwer, darüber zu streiten, warum genau dies nicht der Fall ist.

Das alles wird schwierig, und ich sehe oft einen sehr schlechten Sprachgebrauch. Deshalb werde ich explizit vorgehen und ganz unten anfangen


JavaScript ist eine Computersprache, dh eine Reihe von Konventionen, die es uns ermöglichen, eine Reihe von Texten so zu lesen und zu interpretieren, dass sie eine Ausführungssemantik haben . Klassen von Programmen, die als Interpreter , Compiler , Transpiler , Linters , Highlighter usw. bezeichnet werden, nehmen alle Text auf und versuchen, etwas mit diesem herkömmlichen Verständnis der Codeausführung zu tun.

  • Interpreter führen die Ausführungssemantik tatsächlich durch , indem sie einen Computer bedienen - normalerweise Ihren Computer. Sie können sie sich als einen kleinen Mann in Ihrem Computer vorstellen, der Schalter wie "Diesen Charakter drucken" umlegt, basierend auf Anweisungen, die in Ihrem JavaScript-Programm geschrieben wurden.
  • Compiler versuchen, den JavaScript-Text in einen neuen Satz von Text zu konvertieren, der eine Ausführungssemantik für eine andere Sprache aufweist - möglicherweise einen Text mit der besonderen Eigenschaft, die Computer direkt ausführen können.
  • Transpiler sind insofern eine verallgemeinerte Form des Compilers, als sie JavaScript-Text in eine andere Sprache aufnehmen und Text in einer anderen Sprache ausgeben. Der Unterschied ist also ein wenig subjektiv, aber normalerweise denkt man an einen Compiler, der einen Code mit sehr niedriger Ebene ausgibt , und an einen Transpiler, der einen Code mit hoher Ebene ausgibt .
  • Linters , highlighters , Typ Kontrolleure , usw. alle nehmen in JavaScript Text und Ausgabe eine Art analytischen Produkt, markierten Text zB, die durch die Ausführungssemantik beeinflusst wird, aber nicht wirklich repräsentativ für sie.

Lassen Sie uns nun ein wenig in die Ausführungssemantik eintauchen. Im Allgemeinen beinhaltet die Ausführungssemantik einen Prozess des Lesens von Sprachtext und des Erreichens einer Beschreibung einer abstrakten Maschine oder einer Beschreibung beobachtbarer Nebenwirkungen . Was ich vorschlagen möchte, ist, dass beide davon ausgehen, dass es eine Art "Low-Level-API" geben muss, um die Maschine zu bedienen oder die beobachtbaren Effekte auszuführen. Diese werden normalerweise als Teil der Laufzeitumgebung betrachtet

  • Die Laufzeitumgebung oder Laufzeit ist eine Menge von angenommenen Grundelementen, die die Sprachkonvention benötigt, um zu funktionieren. Was die Sprache angeht, gibt es möglicherweise Vermutungen über ihr Verhalten, aber sie sind nicht beobachtbar. In der obigen Bildsprache des Interpreten drückt der "Mann drinnen" einfach auf die Schalter der Laufzeit - er kann nicht persönlich überprüfen, was sie tun.

Das Wort Laufzeit wird gewöhnlich missbraucht, um sowohl die Menge der angenommenen Grundelemente selbst als auch eine tatsächliche Instanziierung derselben zu bezeichnen.


Also, jetzt kommen wir zu etwas Haarigem. Eine Sprache ist eine Reihe von Konventionen, die die Existenz einer Laufzeit voraussetzen, um ihrer Ausführungssemantik einen Sinn zu verleihen. Es "untersucht" sie niemals, da sie außerhalb des Anwendungsbereichs liegen.

Um eine Sprache tatsächlich verwenden zu können, benötigen Sie neben einer Laufzeitimplementierung einen Compiler oder Interpreter. Der Compiler / Interpreter und diese Laufzeit gehen Hand in Hand, wenn Sie Ihren Code tatsächlich ausführen .

  • Chrome V8 , oft als Engine bezeichnet , ist ein Paket, das einen Interpreter, Compiler und eine Laufzeitimplementierung enthält, die mit der Laufzeitschnittstelle kompatibel ist, die von den ECMA-Standard-JavaScript-Konventionen gefordert wird.

Wo passt Node.js dazu?

Wir müssen es in Teile zerlegen:

  1. Node.js erweitert die JavaScript-Sprache durch die Bereitstellung einer größeren Anzahl von Laufzeitumgebungsprimitiven, die außerhalb des Geltungsbereichs der ECMA-Standards liegen. Dazu gehören Dinge wie Datei - I / O . Dies bedeutet, dass Node.js die Sprache ändert und in gewisser Weise eine neue Sprache ist: "Node.js JavaScript"
  2. Node.js enthält als Paket einen Interpreter und einen Compiler. Es stiehlt nur diese von V8.
  3. Node.js bietet eine Implementierung der Laufzeitumgebung Node.js , mit der "Node.js JavaScript" ausgeführt werden kann.
  4. Node.js bietet eine Reihe von Standardbibliotheken, die auf den neuen Grundelementen aufgebaut sind und den Endbenutzern von "Node.js JavaScript" den Zugriff erleichtern.

Node.js ist also eine Menge Dinge!

Aber ist es ein Rahmen?


Hier fällt die Terminologie völlig auseinander - niemand hat eine gute, konsistente und aussagekräftige Definition dessen, was ein Framework eigentlich ist.

Es gibt Debatten, die toben: "Was ist ein Framework gegenüber einer Bibliothek?" Und sie enden mit unbefriedigenden Dingen wie "Eine Bibliothek nennt man etwas und ein Framework nennt man etwas". Ich möchte nicht einmal wirklich eine so traurige Erklärung ans Tageslicht bringen - aber JavaScript und insbesondere Node.js JavaScript sind ein schwerer Schlag für diese Definition, da die gesamte Callback-Passing-Technik bedeutet, dass Sie ständig zwischen Anrufen wechseln und angerufen werden.

Meiner persönlichen Meinung nach gibt es hier etwas Wesentliches. Ich möchte keine klare Linie ziehen, sondern nur sagen

  • Ein Satz Code ist bibliotheksähnlich, wenn er wie ein Satz Legos funktioniert : teilbar und für die Montage vorgesehen. Es mag zwar einige Beispiele für die Verwendung der Bibliothek geben, der Benutzer muss sie jedoch in der Regel selbst nach seinen Bedürfnissen zusammenstellen.
  • Ein Satz von Code ist Framework-ähnlich, wenn er nicht teilbar ist und Konventionen impliziert *: Wenn Teile davon auseinandergezogen werden, können viele Annahmen scheitern. Sie müssen daher die konventionelle Verwendung verstehen , um ein Framework ordnungsgemäß zu verwenden.

Dies ist zwar eine Hand-Wave-Linie, aber ich möchte einen wirklich interessanten Punkt zu Frameworks herausgreifen:

Frameworks beinhalten eine Reihe von Konventionen zur Interpretation von Code. Sie sind daher eine eigene Sprache.

Vielleicht möchten die Leute auch darüber streiten, aber wenn Sie meine frühere Definition gekauft haben, dass eine Sprache nur eine Reihe von Konventionen ist, die einen Textblock zum Leben erwecken, dann immer dann, wenn Sie eine neue Ebene von Konventionen aufstellen. ' habe eine neue sprache gebaut. Vielleicht sind die Rohstoffe bei Frameworks die semantischen Interpretationen ihrer Host-Sprache anstelle von Rohtextdateien, aber die Idee ist dieselbe!


Daher bin ich total glücklich, Node.js als Framework zu bezeichnen, auch wenn es ein bisschen gegen die Norm verstößt! Node.js fügt dem unformatierten JavaScript Funktionen hinzu , um die Sprache zu erweitern . Damit kommen neue Annahmen und Werkzeuge für das Arbeiten in dieser erweiterten Sprache. Funktionell sind diese Ideen dieselben wie die Ideen anderer gut akzeptierter Frameworks wie Ruby on Rails .

Ich würde behaupten, wenn Sie sich in diesem Moment etwas unwohl fühlen und behaupten möchten, dass Ruby on Rails und Node.js in dieser Hinsicht sehr unterschiedlich sind, dann bin ich natürlich genau bei Ihnen . Die Art der begrifflichen Welten, in denen die beiden leben, ist dramatisch unterschiedlich - ich möchte nur sagen, dass sie dasselbe sind: Konventionen zur Erweiterung der Fähigkeiten einer Basissprache in einem bestimmten Bereich.

Ich schlage auch gerne vor, dass die Domain von Node.js winzig und eng ist und daher die darin enthaltenen Konventionen einfach zu erklären und relativ einfach zu korrigieren sind. OTOH, Ruby on Rails, lebt in einer komplexen, schlecht definierten Domäne von "Business-Webanwendungen", was bedeutet, dass die darin enthaltenen Konventionen mit Sicherheit unscharf und fehlerhaft sind.


Aber all dies ist eine lange Art zu sagen, ja, Personalvermittler haben wahrscheinlich keine Ahnung, was sie meinen, wenn sie das sagen. Ich vermute, "Framework" klingt einfach wie ein besseres, gröberes Wort als "Runtime" oder "Engine".

J. Abrahamson
quelle
Hey, bemerkenswert ausgewogen! Also probably have no idea: 'Framework' ist ein Wort, das Sie verstehen können, ohne Programmierer zu sein, ein nützliches Feature, wenn Sie nicht wissen, wann es tatsächlich etwas bewirken würde.
n611x007
"Node.js fügt dem unformatierten JavaScript Funktionen hinzu, um die Sprache zu erweitern." Nicht wahr, es erweitert die Funktionalität und nicht die Sprache. Es ändert nichts an der Art und Weise, wie Sie Code schreiben müssen, wie es viele Frameworks erfordern. Es gibt andere Funktionen oder Objekte, die hinzugefügt werden können, wie es eine enthaltene Bibliothek tun kann. Sie können es aufrufen oder wie jede neue Funktion oder jedes neue Objekt verwenden. Der Programmierstil ändert sich nicht, die Sprachgrundlagen sind gleich, nur einige Funktionen werden hinzugefügt. Es handelt sich also nicht um ein Framework oder eine Erweiterung der Sprache, Javascript mit hinzugefügten Standard-Plattformbibliotheken und damit Funktionalität.
Codebeat
Klar, ich kann deiner Seite voll und ganz folgen. Ich denke, die Leitung hier ist verschwommen. Beide Denkweisen sind sinnvoll. Genau genommen erweitert Node JS durch die Bereitstellung einer FFI, die dann das Kernstück darstellt, mit dem Node anschließend weitere Systembibliotheken bereitstellen kann. Auf der anderen Seite, während „Kern“ -Knoten nur die Laufzeit (und dieses FFI) ist, meinen die meisten Leute, wenn sie über Knoten sprechen, tatsächlich „die Kernlaufzeit, die FFI-Erweiterungen und die darauf aufgebauten grundlegenden Bibliotheksfunktionen“ ist, wie Knoten gepackt wird.
J. Abrahamson
20

Node.js® ist eine JavaScript- Laufzeitumgebung, die auf der V8-JavaScript-Engine von Chrome basiert.

Quelle

Knoten ist eine Laufzeit oder Umgebung. Es ist kein Rahmen. Leute (ich glaube) verstehen das oft falsch, weil Frameworks wie Express mit node allgegenwärtig sind.

Lesen Sie mehr über Laufzeiten und Frameworks, wenn Sie interessiert sind.

Rlemon
quelle
inb4 ", aber auf der About-Seite steht" Als asynchrones ereignisgesteuertes Framework ".
Rlemon
3
Ist das Embedded v8 nicht die Laufzeit? ;-)
johannes
@johannes Ich bin geneigt, Ihnen diesbezüglich zuzustimmen. V8 ist die Laufzeit und Node erweitert einfach die Tools, die dem Entwickler zur Verfügung stehen (http-Server, util usw.). Ich denke also, dass das Framework-Label immer noch funktioniert. Trotzdem handelt es sich um eine modifizierte v8-Umgebung. Knoten ist nicht etwas, das Sie nur in Ihr Projekt "einbeziehen". Es ist alles eine Frage der Perspektive, denke ich.
Nick
@rlemon, das Part- Framework wurde entfernt.
Ebram Khalil