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:
- 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"
- Node.js enthält als Paket einen Interpreter und einen Compiler. Es stiehlt nur diese von V8.
- Node.js bietet eine Implementierung der Laufzeitumgebung Node.js , mit der "Node.js JavaScript" ausgeführt werden kann.
- 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".