denken: HTML ist eine Tag-Sprache und nur JS kann Urteile und Schleifen implementieren. Vorlagen enthalten Anweisungen, Interpolationen und JS-Ausdrücke, die Urteile, Schleifen usw. implementieren können. Daher sind Vorlagen kein HTML und müssen daher in eine Art JS-Code konvertiert werden. Wie wird diese Kompilierung durchgeführt? Analyse: Unter Vorlagenkompilierung versteht man den Prozess, bei dem eine Vorlage in eine Renderfunktion kompiliert wird. Dieser Prozess kann grob in drei Phasen unterteilt werden: 1. analysieren Der Parser konvertiert hauptsächlich Template-Strings in Vorlagenzeichenfolgen: <div> <p>{{Nachricht}}</p> </div> Element-ASTs AST bezieht sich auf den abstrakten Syntaxbaum und ähnelt { tag: "div" // Knotentyp (1 Bezeichnung, 2 Textknoten mit wörtlichem Ausdruck, 3 normaler Textknoten oder Kommentarknoten) Typ: 1, // statischer Stammknoten staticRoot: false, // Statischer Knoten static: false, schlicht: wahr, // Verweis auf das übergeordnete Knotenelement Beschreibungsobjekt parent: undefiniert, // Nur wenn der Knotentyp 1 ist, gibt es ein attrsList-Attribut, bei dem es sich um ein Objektarray handelt, das den ursprünglichen HTML-Attributnamen und -wert attrsList speichert: [], // Wie oben, der Unterschied besteht darin, dass attrsMap den HTML-Attributnamen und -Wert in Schlüssel-Wert-Paaren speichert: attrsMap: {}, //Speichert das Elementbeschreibungsobjekt aller untergeordneten Knoten dieses Knotens children: [ { Schlagwort: "p" Typ: 1, staticRoot: false, statisch: falsch, schlicht: wahr, übergeordnet: {tag: "div", ...}, attrsList: [], attrsMap: {}, Kinder: [{ Typ: 2, text: "{{message}}", statisch: falsch, // Wenn der Knotentyp 2 ist, enthält das Objekt den Ausdruck expression: "_s(message)" }] } ] } 1.1 Regeln für das AbfangenHauptsächlich durch Beurteilen des Werts von html.indexof('<') in der Vorlage, um zu bestimmen, ob das Tag oder der Text abgefangen werden soll. Der Abfangvorgang: Streicherteil `<div><p>{{Nachricht}}<p></div>` 1.2 Teil des AbfangprozessesErste Interception
/** Zusammenfassend lässt sich sagen: Tags abgleichen, Attribute extrahieren und Hierarchien erstellen*/ // Nach dem obigen Abgleich ist die verbleibende Zeichenfolge: `<p>{{Nachricht}}<p></div>` Zweite Interception /** Wie oben*/ // Nach dem obigen Abgleich ist die verbleibende Zeichenfolge: `{{Nachricht}}</p></div>` Das dritte Abfangen
Zum Beispiel: /** Zusammenfassend lässt sich sagen, dass der Typ bestimmt und der Text abgefangen werden muss*/ // Nach dem obigen Abgleich ist die verbleibende Zeichenfolge: `</p></div>` Vierte Interception
/** Zusammenfassend lässt sich sagen: Ordnen Sie das Etikett zu und bestimmen Sie die Ebene*/ // Nach dem obigen Abgleich ist die verbleibende Zeichenfolge: `</div>` Die fünfte Interception/** Wie oben*/ Beenden 1.3 Parser-Zusammenfassung
2. Optimieren Die Hauptfunktion des Optimierers besteht darin, den statischen Inhalt des generierten AST zu optimieren und statische Knoten zu markieren. Um jedes Mal erneut zu rendern, müssen keine neuen Knoten für den statischen Teilbaum erstellt werden, und 2.1 Statische KnotenDurchlaufen Sie den AST-Syntaxbaum, finden Sie alle statischen Knoten und markieren Sie sie Funktion ist statisch (Knoten) { // Ausdruck wenn (Knotentyp === 2) { return false } //Text wenn (Knotentyp === 3) { returniere wahr } /** 1. Die dynamische Bindungssyntax kann nicht verwendet werden, d. h. das Tag darf keine Attribute haben, die mit v-, @ oder :; beginnen. Es kann nur einer der */ zurück !!(node.pre || ( !node.hasBindings && !Knoten.wenn && !Knoten.für && !isBuiltInTag(node.tag) && isPlatformReservedTag(node.tag) && !isDirectChildOfTemplateFor(Knoten) && Objekt.Schlüssel(Knoten).Jeder(istStatischerSchlüssel) )) } 2.2 Statischer StammknotenDurchlaufen Sie den Baum nach den obigen Schritten, finden Sie den statischen Stammknoten und markieren Sie ihn 2.3 Optimierer-Zusammenfassung
3. Codegenerator generierenDie Funktion des Codegenerators besteht darin, über den AST-Syntaxbaum eine Codezeichenfolge zu generieren. Die Codezeichenfolge wird in die Rendering-Funktion gepackt. Nachdem die Rendering-Funktion ausgeführt wurde, kann ein Vnode abgerufen werden. 3.1 JS mit Syntax Die Verwendung von with kann die Art und Weise ändern, wie nach freien Variablen in {} gesucht wird, und nach freien Variablen in {} als Attribute von const obj = {a: 100, b: 200} mit(Objekt) { konsole.log(a) console.log(b) // console.log(c) // meldet einen Fehler} Codezeichenfolge Analysieren Sie die von Parse generierten Element-ASTs und verketten Sie sie zu Zeichenfolgen. mit(diesem){return _c('div',_c('p',[_v(Nachricht)])])} Holen Sie sich die Renderfunktion: /** Der Codestring kann die Renderfunktion der aktuellen Komponente über die neue Funktion ('Codestring') abrufen*/ const stringCode = `mit(diesem){return _c('div',_c('p',[_v(Nachricht)])])}` const render = neue Funktion (StringCode). Um verschiedene Anweisungen, Interpolationen und JS-Ausdrücke anzuzeigen, können Sie const-Compiler = erforderlich('vue-template-compiler') // Interpolation const template = `<p>{{message}}</p>` const Ergebnis = Compiler.Compile(Vorlage) Konsole.log(Ergebnis.Rendern) // mit(diesem){return _c('p',[_v(_s(Nachricht))])} Vue-Quellcode, um die Bedeutung der Abkürzungsfunktion zu finden Der Quellcode zur Kompilierung der Vorlage befindet sich im Paket `vue-template-compiler` [2] Funktion installRenderHelpers(Ziel) { target._c = Element erstellen // Tag v-once ziel._o = Einmal markieren // In Zahlentyp konvertieren target._n = toNumber // In Zeichenfolge konvertieren target._s = toString // Rendern Sie v-for ziel._l = Renderliste // Rendere normale Slots und Slots mit eingeschränktem Gültigkeitsbereich target._t = renderSlot // Rendere statische Knoten durch staticRenderFns target._m = renderStatic // Holen Sie sich das Filterziel._f = resolveFilter //Überprüfe den Tastencode des Tastaturereignisses target._k = Schlüsselcodes prüfen target._b = bindObjectProps // Einen Text-Vnode erstellen target._v = TextVNode erstellen // Einen leeren Vnode erstellen target._e = erstelleEmptyVNode target._u = auflösenScopedSlots target._g = bindObjectListeners //Verarbeitung des Modifikators target._p = prependModifier } Zusammenfassung: Beim Vue-Scaffolding wird Der Analyseprozess besteht darin, die Zeichenfolge in kleinen Segmenten abzufangen und dann einen Stapel beizubehalten, um die DOM-Tiefe zu speichern. Wenn alle Zeichenfolgen abgefangen wurden, wird ein vollständiger AST analysiert. Der Optimierungsprozess besteht darin, alle Knoten rekursiv zu markieren, um anzuzeigen, ob es sich um statische Knoten handelt, und dann die statischen Stammknoten erneut rekursiv zu markieren. In der Codegenerierungsphase wird rekursiv eine Zeichenfolge mit Funktionsausführungscode generiert. Der rekursive Prozess ruft je nach Knotentyp unterschiedliche Generierungsmethoden auf. Dies ist das Ende dieses Artikels über die Einzelheiten der Vue-Vorlagenkompilierung. Weitere relevante Inhalte zur Vue-Vorlagenkompilierung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Implementierung einer geplanten Sicherung in Mysql5.7
>>: Implementierung der Docker Compose-Mehrcontainerbereitstellung
Inhaltsverzeichnis Fehler 1: Zu viele Datenspalte...
Dieser Artikel veranschaulicht anhand von Beispie...
In diesem Artikelbeispiel wird der spezifische Co...
1. Beim Ausführen des Projekts werden folgende Fe...
1. Einleitung In diesem Artikel wird hauptsächlic...
Als Vue-Benutzer ist es an der Zeit, React zu erw...
Wie unten dargestellt: Führen Sie hauptsächlich A...
1. Bereiten Sie sich im Voraus vor Zu Ihrer Beque...
1. Erstellen Sie eine Datenbankautorisierungserkl...
Inhaltsverzeichnis 1. Vorbereitung 1. Bereiten Si...
Wirkung der Operation html <Kopf> <meta ...
Downloadadresse der offiziellen MySQL-Website: ht...
Ubuntu 16.04 installiert standardmäßig die PHP7.0...
Es gibt einige Unterschiede zwischen Filter und H...
MySQL-Volltextsuche, chinesische Lösung Kürzlich ...