VorwortEs gibt zwei Haupttypen von Vue3-Sandboxen
Browser kompilierte Version Ergebnis der Renderfunktionskompilierung <div>{{test}}</div> <div>{{Math.floor(1)}}</div> Zu _Vue = Vue; Rückgabefunktion rendern(_ctx, _cache, $props, $setup, $data, $options) { mit (_ctx) { Konstante { toDisplayString: _toDisplayString, VNode erstellen: _createVNode, Fragment: _Fragment, offenerBlock: _openBlock, Block erstellen: _createBlock, } = _Vue; zurückkehren ( _openBlock(), _Block erstellen( _Fragment, null, [ _createVNode("div", null, _toDisplayString(test), 1 /* TEXT */), _createVNode( "div", null, _toDisplayString(Math.floor(1)), 1 /* TEXT */ ), ], 64 /* STABILES_FRAGMENT */ ) ); } }; Aus dem obigen Code können wir erkennen, dass der Variablenkennung kein Präfix hinzugefügt wurde, sondern sie nur mit der Syntax „with“ umschlossen ist, um die Gültigkeitskette zu erweitern. Wie wird also die JS-Sandbox-Interception erreicht? Beispielsweise die Variable test. Theoretisch gibt es in der aktuellen Bereichskette keine Testvariable. Die Variable wird vom vorherigen Bereich aus durchsucht, bis der globale Bereich gefunden wird. Tatsächlich wird jedoch nur nach _ctx gesucht. Das Prinzip ist sehr einfach. _ctx ist ein Proxy-Objekt. Wie verwenden wir also Proxy zum Abfangen? Der Beispielcode lautet wie folgt: const GLOBALS_WHITE_LISTED = "Unendlich, undefiniert, NaN, ist endlich, ist NaN, parseFloat, parseInt, decodeURI," + "URI-Komponente dekodieren,URI kodieren,URI-Komponente kodieren,Mathematik,Zahl,Datum,Array," + "Objekt, Boolescher Wert, Zeichenfolge, Regulärer Ausdruck, Karte, Satz, JSON, Intl, BigInt"; const isGloballyWhitelisted = (Schlüssel) => { gibt GLOBALS_WHITE_LISTED.split(",").includes(Schlüssel); zurück }; const hasOwn = (Objekt, Schlüssel) => { gibt Object.prototype.hasOwnProperty.call(Objekt, Schlüssel) zurück; }; const Herkunft = {}; const _ctx = neuer Proxy (Ursprung, { get(Ziel, Schlüssel, Empfänger) { wenn (hasOwn(Ziel, Schlüssel)) { Reflect.get(Ziel, Schlüssel, Empfänger); } anders { konsole.warnen( `Auf die Eigenschaft ${JSON.stringify(key)} wurde während des Renderns zugegriffen ` + `ist aber in der Instanz nicht definiert.` ); } }, hat(Ziel, Schlüssel) { // Wenn es ein globales Objekt ist, gib „false“ zurück, löse kein „Get Interception“ aus und suche nach Variablen aus dem vorherigen Bereich. // Wenn es kein globales Objekt ist, gib „true“ zurück und löse „Get Interception“ aus. return !isGloballyWhitelisted(key); }, }); Der Code ist sehr einfach. Warum kann ein so einfacher Code ein Abfangen erreichen? Lokale vorkompilierte Version<div>{{test}}</div> <div>{{Math.floor(1)}}</div> Zu importieren { toDisplayString als _toDisplayString, createVNode als _createVNode, Fragment als _Fragment, openBlock als _openBlock, Block erstellen als _createBlock, } von "vue"; Exportfunktion rendern(_ctx, _cache, $props, $setup, $data, $options) { zurückkehren ( _openBlock(), _Block erstellen( _Fragment, null, [ _createVNode("div", null, _toDisplayString(_ctx.a), 1 /* TEXT */), _createVNode( "div", null, _toDisplayString(Math.floor(1)), 1 /* TEXT */ ), ], 64 /* STABILES_FRAGMENT */ ) ); } Aus dem obigen Code können wir ersehen, dass den Nicht-Whitelist-Bezeichnern die Variable _ctx vorangestellt ist. Wie wird das also gemacht? Beim lokalen Kompilieren der Vorlage wird während der Konvertierungsphase der variable Ausdrucksknoten NodeTypes.SIMPLE_EXPRESSION vorangestellt. Der Beispielcode lautet wie folgt: const GLOBALS_WHITE_LISTED = "Unendlich, undefiniert, NaN, ist endlich, ist NaN, parseFloat, parseInt, decodeURI," + "URI-Komponente dekodieren,URI kodieren,URI-Komponente kodieren,Mathematik,Zahl,Datum,Array," + "Objekt, Boolescher Wert, Zeichenfolge, Regulärer Ausdruck, Karte, Satz, JSON, Intl, BigInt"; const isGloballyWhitelisted = (Schlüssel) => { gibt GLOBALS_WHITE_LISTED.split(",").includes(Schlüssel); zurück }; const isLiteralWhitelisted = (Schlüssel)=>{ returniere 'true, false, null, this'.split(',').includes(Schlüssel) } Exportfunktion processExpression( Knoten ) { const rewriteIdentifier = (roh) => { gibt `_ctx.${raw}` zurück } const rawExp = node.inhalt wenn (istSimpleIdentifier(rawExp)) { const isAllowedGlobal = isGloballyWhitelisted(rawExp) const isLiteral = isLiteralWhitelisted(rawExp) wenn (!istAllowedGlobal && !istLiteral) { node.content = rewriteIdentifier(Rohdatenausdruck) } Rückgabeknoten } Natürlich ist der obige Code nur eine vereinfachte Version. Das ursprüngliche Plugin präzisiert auch __props $setup, verkürzt den variablen Abfragepfad, verbessert die Leistung und kompiliert komplexe Ausdrücke wie Pfeilfunktionen über Babel. Zusammenfassen Der gesamte Sandbox-Mechanismus von vue3 js wird erklärt. Die browserkompilierte Version hat mich lange gestört, weil ich nicht wusste, dass sie Abfragen mit Anweisungsvariablen abfangen kann. siehe Proxy-Handler.hat Dies ist das Ende dieses Artikels mit der detaillierten Erklärung des Vue3-Sandbox-Mechanismus. Weitere relevante Inhalte zum Vue3-Sandbox-Mechanismus 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! |
1. Verfeinern Sie den Selektor Durch die Verwendu...
Dieser Artikel stellt die Blue-Green-Bereitstellu...
So verwenden Sie die Concat-Funktion in MySQL: CO...
Vorwort Wenn wir das MySQL-Datenbankkennwort verg...
Szenario: Mit zunehmender Datenmenge ist die Fest...
mysql5.5.28 Installations-Tutorial zu Ihrer Infor...
Das Betrachten einer Website ist eigentlich wie di...
1.html Teil Code kopieren Der Code lautet wie folg...
In diesem Artikelbeispiel wird der spezifische Co...
Auf dem Server läuft ein Taskprozess. Wenn wir ih...
Neue Fragen Kommen und gehen Sie in Eile. Seit de...
Einführung Dies ist Ihnen sicherlich schon einmal...
Inhaltsverzeichnis Vorwort Die Rolle des Schlüsse...
Inhaltsverzeichnis Klassenkomponente Funktionale ...
1. Ordner löschen Beispiel: rm -rf /usr/java Das ...