Heim >Web-Frontend >js-Tutorial >Optimieren Sie die Leistung einer VUE -App mit asynchronen Komponenten
Möchten Sie Vue.js von Grund auf lernen? Holen Sie sich eine ganze Sammlung von Vue -Büchern, die sich mit Fundamentaldaten, Projekten, Tipps und Tools und mehr mit SitePoint Premium abdecken. Machen Sie jetzt nur 14,99 USD/Monat.
einseitige Anwendungen, die manchmal einen kleinen Flack für ihre langsame anfängliche Last kopieren. Dies liegt daran, dass der Server traditionell ein großes JavaScript -Bündel an den Client sendet, das heruntergeladen und analysiert werden muss, bevor auf dem Bildschirm etwas angezeigt wird. Wie Sie sich vorstellen können, kann dies, da Ihre App an Größe wächst, immer problematischer.
Zum Glück gibt es beim Erstellen einer Vue -Anwendung mit Vue CLI (die Webpack unter der Haube verwendet) eine Reihe von Maßnahmen, die man ergreifen kann, um dem entgegenzuwirken. In diesem Artikel werde ich nachweisen, wie asynchrone Komponenten und Webpack-Code-Splitting-Funktionen nach dem ersten Rendern der App in Teile der Seite geladen werden können. Dadurch hält die anfängliche Ladezeit auf ein Minimum und verleiht Ihrer App ein knapperes Gefühl.
Um diesem Tutorial zu folgen, benötigen Sie ein grundlegendes Verständnis von Vue.js und optional node.js.
Bevor wir in das Erstellen von asynchronen Komponenten eintauchen, schauen wir uns an, wie wir normalerweise eine Komponente laden. Dazu verwenden wir eine sehr einfache Nachrichtenkomponente:
<span><!-- Message.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><h1</span>></span>New message!<span><span></h1</span>></span> </span><span><span><span></template</span>></span> </span>
Nachdem wir unsere Komponente erstellt haben, laden wir sie in unsere App.vue -Datei und zeigen Sie sie an. Wir können die Komponente einfach importieren und der Komponentenoption hinzufügen, damit wir sie in unserer Vorlage verwenden können:
<span><!-- App.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><div</span>></span> </span> <span><span><span><message</span>></span><span><span></message</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></template</span>></span> </span> <span><span><span><script</span>></span><span> </span></span><span><span><span>import <span>Message</span> from "./Message"; </span></span></span><span><span><span>export default { </span></span></span><span><span> <span>components: { </span></span></span><span><span> <span>Message </span></span></span><span><span> <span>} </span></span></span><span><span><span>}; </span></span></span><span><span></span><span><span></script</span>></span> </span>
Aber was passiert jetzt? Die Meldungskomponente wird immer dann geladen, wenn die Anwendung geladen wird, sodass sie in der anfänglichen Last enthalten ist.
Dies klingt möglicherweise nicht nach einem großen Problem für eine einfache App, aber betrachten Sie etwas Komplexeres wie einen Webladen. Stellen Sie sich vor, ein Benutzer fügt einem Korb Elemente hinzu und möchte dann einchecken. Klicken Sie also auf die Schaltfläche Checkout, in der ein Feld mit allen Details der ausgewählten Elemente wiedergegeben wird. Mit der obigen Methode wird dieses Checkout -Kontrollkästchen im ersten Bundle enthalten, obwohl wir nur die Komponente benötigen, wenn der Benutzer auf die Schaltfläche Checkout klickt. Es ist sogar möglich, dass der Benutzer durch die Website navigiert, ohne jemals auf die Schaltfläche Checkout zu klicken, was bedeutet, dass es nicht sinnvoll ist, Ressourcen beim Laden dieser potenziell nicht verwendeten Komponente zu verschwenden.
Um die Effizienz der Anwendung zu verbessern, können wir sowohl faule Lade- als auch Code -Spalt -Techniken kombinieren.
Beifaules Laden geht es darum, die anfängliche Last einer Komponente zu verzögern. Sie können auf Websites wie Medium.com faulen Laden in Aktion sehen, auf denen die Bilder kurz vor erforderlich sind. Dies ist nützlich, da wir nicht alle Bilder für einen bestimmten Beitrag vorne mit dem Laden von Ressourcen verschwenden müssen, da der Leser den Artikel auf halber Strecke überspringen könnte.
Mit dem Code -Spaltungsfunktions -Webpack können Sie Ihren Code in verschiedene Bündel aufteilen, die dann zu einem späteren Zeitpunkt auf Bedarf oder parallel geladen werden können. Es kann verwendet werden, um bestimmte Codesteile nur dann zu laden, wenn sie benötigt oder verwendet werden.
Zum Glück ist Vue für dieses Szenario mit etwas bezeichnet, das als dynamische Importe bezeichnet wird. Diese Funktion führt eine neue funktionsähnliche Form des Imports ein, die ein Versprechen zurückgibt, das die angeforderte (VUE) Komponente enthält. Da der Import eine Funktion ist, die eine Zeichenfolge empfängt, können wir leistungsstarke Dinge wie Lademodule mit Ausdrücken tun. In Chrome sind dynamische Importe seit Version 61 verfügbar. Weitere Informationen dazu finden Sie auf der Google Developers -Website.
Die Code -Aufteilung wird von Bundlern wie Webpack, Rollup oder Paket erledigt, die die dynamische Importsyntax verstehen und für jedes dynamisch importierte Modul eine separate Datei erstellen. Wir werden dies später auf der Registerkarte "Netzwerk" unserer Konsole sehen. Aber werfen wir zunächst einen Blick auf den Unterschied zwischen einem statischen und dynamischen Import:
<span><!-- Message.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><h1</span>></span>New message!<span><span></h1</span>></span> </span><span><span><span></template</span>></span> </span>
Lassen Sie uns dieses Wissen auf unsere Nachrichtenkomponente anwenden, und wir erhalten eine App.vue -Komponente, die so aussieht:
<span><!-- App.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><div</span>></span> </span> <span><span><span><message</span>></span><span><span></message</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></template</span>></span> </span> <span><span><span><script</span>></span><span> </span></span><span><span><span>import <span>Message</span> from "./Message"; </span></span></span><span><span><span>export default { </span></span></span><span><span> <span>components: { </span></span></span><span><span> <span>Message </span></span></span><span><span> <span>} </span></span></span><span><span><span>}; </span></span></span><span><span></span><span><span></script</span>></span> </span>
Wie Sie sehen, wird die Funktion import () ein Versprechen, das die Komponente zurückgibt, auflöst, was bedeutet, dass wir unsere Komponente asynchron erfolgreich geladen haben. Wenn Sie einen Blick auf die Registerkarte "Netzwerk" der Devtools werfen, werden Sie eine Datei namens 0 feststellen, die Ihre asynchrone Komponente enthält.
Jetzt, da wir asynchrone Komponenten im Griff haben, ernten wir wirklich ihre Leistung, indem wir sie nur laden, wenn sie wirklich benötigt werden. Im vorherigen Abschnitt dieses Artikels habe ich den Anwendungsfall eines Checkout -Kontrollkästchens erläutert, das nur geladen wird, wenn der Benutzer auf die Schaltfläche Checkout trifft. Lassen Sie uns das ausbauen.
Wenn Sie keine Vue -CLI installiert haben, sollten Sie das jetzt greifen:
<span><!-- Message.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><h1</span>></span>New message!<span><span></h1</span>></span> </span><span><span><span></template</span>></span> </span>
Verwenden Sie als Nächst
<span><!-- App.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><div</span>></span> </span> <span><span><span><message</span>></span><span><span></message</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></template</span>></span> </span> <span><span><span><script</span>></span><span> </span></span><span><span><span>import <span>Message</span> from "./Message"; </span></span></span><span><span><span>export default { </span></span></span><span><span> <span>components: { </span></span></span><span><span> <span>Message </span></span></span><span><span> <span>} </span></span></span><span><span><span>}; </span></span></span><span><span></span><span><span></script</span>></span> </span>Wechseln Sie in das Projektverzeichnis und installieren Sie die Ant-Design-Vue-Bibliothek, die wir zum Styling verwenden:
<span>// static import </span><span>import <span>Message</span> from "./Message"; </span> <span>// dynamic import </span><span>import("./Message").then(<span>Message</span> => { </span> <span>// Message module is available here... </span><span>}); </span>Importieren Sie als nächstes die Ant -Design -Bibliothek in SRC/main.js:
<span><!-- App.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><div</span>></span> </span> <span><span><span><message</span>></span><span><span></message</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></template</span>></span> </span> <span><span><span><script</span>></span><span> </span></span><span><span><span>import <span>Message</span> from "./Message"; </span></span></span><span><span><span>export default { </span></span></span><span><span> <span>components: { </span></span></span><span><span> <span><span>Message</span>: () => import("./Message") </span></span></span><span><span> <span>} </span></span></span><span><span><span>}; </span></span></span><span><span></span><span><span></script</span>></span> </span>Erstellen Sie schließlich zwei neue Komponenten in SRC/Comonents, Checkout.vue und Elements.Vue:
<span>npm i -g @vue/cli </span>Machen Sie die Storeansicht
vue create my-storehier ist nichts Besonderes. Wir tun lediglich eine Nachricht und das Rendern einer
Öffnen Sie als Nächst
In dieser Datei zeigen wir ein Einkaufswagensymbol mit der aktuellen Menge an gekauften Artikeln an. Die Elemente selbst werden aus einem Element -Array gezogen und als Dateneigenschaft deklariert. Wenn Sie auf die Schaltfläche
kaufen<span>cd my-store </span><span>npm i ant-design-vue </span>kaufen, wird die AddItem -Methode aufgerufen, die den betreffenden Artikel in ein Einkaufslisten -Array drückt. Dies wird wiederum die Gesamtsumme des Wagens erhöhen.
Wir haben auch eine Checkout
der Seite hinzugefügt, und hier beginnen die Dinge interessant:Wenn ein Benutzer auf diese Schaltfläche klickt, setzen wir eine Parameteranstellung so ein, dass sie wahr ist. Dieser wahre Wert ist sehr wichtig, um unsere asynchronisierte Komponente bedingt zu beladen.
<span>import 'ant-design-vue/dist/antd.css' </span>In einigen Zeilen finden Sie eine V-IF-Anweisung, in der nur der Inhalt des
Die Checkout -Komponente wird asynchron in der Komponentenoption im Abschnitt
Fügen wir den Code für die Checkout -Komponente in SRC/Komponenten/Checkout schnell hinzu.
<span>touch src/components/{Checkout.vue,Items.vue} </span>Hier schauen wir uns über die Requisiten ein, die wir als Einkaufsliste erhalten, und geben sie auf den Bildschirm aus.
Sie können die App mit dem Befehl npm run serve ausführen. Navigieren Sie dann zu http: // localhost: 8080/. Wenn alles nach Plan verlaufen ist, sollten Sie so etwas sehen, was im Bild unten gezeigt wird.
<span><span><span><template</span>></span> </span> <span><span><span><div</span> id<span>="app"</span>></span> </span> <span><span><span><h1</span>></span>{{ msg }}<span><span></h1</span>></span> </span> <span><span><span><items</span>></span><span><span></items</span>></span> </span> <span><span><span></div</span>></span> </span><span><span><span></template</span>></span> </span> <span><span><span><script</span>></span><span> </span></span><span><span><span>import items from "./components/Items" </span></span></span><span><span> </span></span><span><span><span>export default { </span></span></span><span><span> <span>components: { </span></span></span><span><span> items </span></span><span><span> <span>}, </span></span></span><span><span> <span>name: 'app', </span></span></span><span><span> <span>data () { </span></span></span><span><span> <span>return { </span></span></span><span><span> <span>msg: 'My Fancy T-Shirt Store' </span></span></span><span><span> <span>} </span></span></span><span><span> <span>} </span></span></span><span><span><span>} </span></span></span><span><span></span><span><span></script</span>></span> </span> <span><span><span><style</span>></span><span> </span></span><span><span><span><span>#app</span> { </span></span></span><span><span> <span>font-family: 'Avenir', Helvetica, Arial, sans-serif; </span></span></span><span><span> <span>-webkit-font-smoothing: antialiased; </span></span></span><span><span> <span>-moz-osx-font-smoothing: grayscale; </span></span></span><span><span> <span>text-align: center; </span></span></span><span><span> <span>color: #2c3e50; </span></span></span><span><span> <span>margin-top: 60px; </span></span></span><span><span><span>} </span></span></span><span><span> </span></span><span><span><span>h1<span>, h2</span> { </span></span></span><span><span> <span>font-weight: normal; </span></span></span><span><span><span>} </span></span></span><span><span> </span></span><span><span><span>ul { </span></span></span><span><span> <span>list-style-type: none; </span></span></span><span><span> <span>padding: 0; </span></span></span><span><span><span>} </span></span></span><span><span> </span></span><span><span><span>li { </span></span></span><span><span> <span>display: inline-block; </span></span></span><span><span> <span>margin: 0 10px; </span></span></span><span><span><span>} </span></span></span><span><span> </span></span><span><span><span>a { </span></span></span><span><span> <span>color: #42b983; </span></span></span><span><span><span>} </span></span></span><span><span></span><span><span></style</span>></span> </span>
Versuchen Sie, mit Ihrer Registerkarte "Netzwerk" im Speicher zu klicken, um sich selbst zu versichern, dass die Checkout -Komponente nur geladen wird, wenn Sie auf die Schaltfläche Checkout klicken.
Sie können auch den Code für diese Demo auf GitHub finden.
Es ist sogar möglich, eine Lade- und/oder Fehlerkomponente zu definieren, wenn die asynchronisierte Komponente einige Zeit in Anspruch nimmt, um zu laden oder nicht zu laden. Es kann nützlich sein, eine Ladeanimation anzuzeigen, aber denken Sie daran, dass dies Ihre Anwendung wieder verlangsamt. Eine asynchrone Komponente sollte klein und schnell geladen sein. Hier ist ein Beispiel:
<span><!-- Message.vue --> </span><span><span><span><template</span>></span> </span> <span><span><span><h1</span>></span>New message!<span><span></h1</span>></span> </span><span><span><span></template</span>></span> </span>
Erstellen und Implementieren von asynchronen Komponenten ist sehr einfach und sollte Teil Ihrer Standardentwicklungsroutine sein. Aus UX -Sicht ist es wichtig, die anfängliche Ladezeit so weit wie möglich zu verkürzen, um die Aufmerksamkeit des Benutzers aufrechtzuerhalten. Hoffentlich hat dieses Tutorial Ihnen dabei geholfen, Ihre eigenen Komponenten asynchron zu laden und die Bedingungen auf sie zu verjüngen (faule Last) der Komponente.
vue.comPonent ('async-example', function (resist, ablehnen) {
setTimeout (function () {Vorlage: '
vue.comPonent ('async-example', function (resist, ablehnen) {
setTimeout (function () {Vorlage: '
Das obige ist der detaillierte Inhalt vonOptimieren Sie die Leistung einer VUE -App mit asynchronen Komponenten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!