Diese Beitragsserie ist auf NgateSystems.com indiziert. Dort finden Sie auch eine äußerst nützliche Stichwortsuchfunktion.
Letzte Bewertung: 24. November
Im vorherigen Beitrag wurde eine Svelte-Webanwendung erstellt, die vollständig aus einfachem HTML besteht. Es enthielt kein Javascript und nutzte daher keine der hochentwickelten dynamischen HTML-Generierungsfunktionen von Svelte. Dieser Beitrag kratzt nur an der Oberfläche der Svelte-Funktionen, soll Ihnen aber ein Gefühl für die Leistungsfähigkeit der Sprache vermitteln.
Objektiv betrachtet ist eine Webanwendung eine komplexe Hierarchie aus HTML-Seiten, Popups, Tabellen, Formularen und Schaltflächen. Diese schwindelerregende Ansammlung visueller Elemente wird durch Daten „informiert“. Tabellen werden mit JavaScript-Array-Inhalten aufgeblasen. Popups erscheinen und verschwinden auf Geheiß von Flaggenfeldern. Formulare blühen mit Daten auf, wenn sie per Maus- und Tastatureingabe „gestochen“ werden. Kurz gesagt: Es ist kompliziert. Wie kann in dieser Situation eine Art Ordnung geschaffen werden?
Zusammenfassend wird der Datenbestand, der das Erscheinungsbild einer Webanwendung zu jedem Zeitpunkt definiert, als Zustand der Webanwendung bezeichnet. Es wurden große Anstrengungen in die Softwareentwicklungstechnologie gesteckt, die es einfacher machen soll, Webanwendungen zu schreiben, die effizient reagieren, wenn sich der Status ändert. Plattformen wie Svelte sind ausdrücklich darauf ausgelegt, eine gute Reaktionsfähigkeit zu bieten.
Sehen wir uns Sveltes Ansatz zur Definition von Staat und seiner Umsetzung von Reaktivität an.
Eine häufige Funktion einer Webseite ist ein Popup-Fenster, das beim Starten angezeigt wird (normalerweise nervig), aber dann, wie gefällig, verschwindet, wenn Sie darauf klicken. Sehen wir uns an, wie Sie mit Svelte State und Reactivity nutzen können, um dies in einer Webanwendung zu implementieren.
In Javascript müssen Sie eine Variable definieren, bevor Sie sie verwenden können. Also zum Beispiel ein Befehl wie
console.log(myDataItem);
wird einen Fehler auslösen, es sei denn, Sie haben ihn irgendwo früher im Code mit einer Anweisung wie
definiert
let myDataItem;
Nebenbei bemerkt: Sie werden es nützlich finden, Zugriff auf einen „Spielplatz“ zu haben, auf dem Sie schnell Teile von JavaScript wie diesen ausprobieren können. Die „Inspektor“-Ansicht einer beliebigen Browserseite bietet eine solche Spielwiese: Öffnen Sie den Inspektor auf einer beliebigen Seite und wählen Sie in der Menüleiste die Registerkarte „Konsole“ aus. Alternativ können Sie die Javascript-Konsole bei PlayCode ausprobieren.
Über das let-Schlüsselwort von JavaScript gibt es viel zu sagen (fragen Sie chatGPT nach „scope“), aber let hat in Svelte eine zusätzliche Bedeutung, da Sie State so definieren. In einem Svelte-Programm wird jede mit let definierte Variable Teil des Programmstatus.
Na und? Nun, ich habe vorhin gesagt, dass Zustandsvariablen – Variablen, die das Erscheinungsbild einer Webanwendung definieren – „reaktiv“ sind. Das bedeutet, dass sich das Erscheinungsbild der Webanwendung automatisch entsprechend ändert, wenn sich ihr Wert ändert. Angenommen, Sie verwenden eine boolesche Variable „popupVisible“, um den Status des Popups zu definieren. Könnte Svelte – eine reaktive Plattform – den Wert der Variablen verwenden, um zu bestimmen, ob das Popup sichtbar ist oder nicht? Lass es uns versuchen.
Hier ist der Code, den ich verwenden möchte. Ich erkläre gleich, was es bewirkt:
//src/routes/ page.svelte – Entfernen Sie diese Zeile vor der Ausführung <script> let popupVisible = true; Funktion togglePopup() { popupVisible = !popupVisible; } </script> <div> {#if popupVisible} <-Taste > <p>Der Code ist hier in zwei Abschnitte unterteilt. Der obere Abschnitt „script“, definiert durch <script></script> Tags, deklariert eine popupVisible-Javascript-Variable und eine togglePopup()-Funktion. Der untere Abschnitt „Vorlage“ gibt HTML an, das durch einen Svelte-Logikblock {#if} {/if} „moderiert“ wird. Svelte-Code kann auf Variablen und Funktionen verweisen, die im <script> Abschnitt zur Anleitung zur HTML-Codegenerierung. Referenzen werden in geschweifte Klammern {} eingeschlossen, es sei denn, sie werden direkt innerhalb eines Logikblocks verwendet – ausführliche Informationen finden Sie in der Svelte-Dokumentation unter Basic Markup and Logic Blocks.</p> <p>Der oben angezeigte Code ist sehr grob. Ein „Popup“ wird normalerweise durch ein <div> definiert. Tag formatiert mit einem Rahmen und etwas Positionierungs-CSS. Hier habe ich einen <Button> Tag – etwas, das häufiger zum Definieren des „Submit“-Elements in einem Formular verwendet wird. Ich habe dies einfach deshalb getan, weil ich dadurch einige technische Details vermeiden kann, die Sie ablenken könnten. Ich habe den Button „Popup“ blau eingefärbt, damit Sie ihn sehen können.</p> <p>Wenn Sie noch eine Kopie des Skelettprojekts svelte-dev Svelte haben, das in Post 2.1 erstellt wurde, versuchen Sie, diesen Code zu verwenden, um den gesamten Inhalt von src/routes/page.svelte zu ersetzen. Wenn Sie ein Terminal für das Projekt öffnen und den Entwicklungsserver wie zuvor starten, sollte Ihr Browser nun zum Leben erwachen und den unten gezeigten Bildschirm anzeigen:</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173277643775221.jpg" alt="NgSysV.Creating a simple Reactive Svelte webapp"></p> <p>Das blaue Rechteck ist das „Pop-up“. Es wird beim Start angezeigt, da zu diesem Zeitpunkt die Variable „popupVisible“ auf „true“ gesetzt ist und die Svelte-Logik, die die HTML-Generierung der Seite steuert, angewiesen wird, eine <Schaltfläche> zu erstellen. Tag in diesem Fall.</p> <p>Versuchen Sie nun, auf das Popup zu klicken. Magie! Es verschwindet. Dies liegt daran, dass die <Schaltfläche> Das Tag, das das Popup angibt, enthält eine onClick-Klausel, die bewirkt, dass ein Klick auf das Element die Funktion togglePopup ausführt. Dies wiederum setzt die Variable popupVisible auf false.</p><p>Ich habe vorhin gesagt, dass das Ändern einer Svelte-„Status“-Variable dazu führt, dass Svelte den Bildschirm aktualisiert, indem der Vorlagenabschnitt der Seite erneut ausgeführt wird. Der Vorlagenabschnitt wird also erneut ausgeführt und da der Wert von popupVisible nun „false“ ist, wird der <button> Der Code, der das Popup anzeigt, wird umgangen und hinterlässt eine leere Seite.</p> <p>Nehmen Sie sich jetzt einen Moment Zeit, um dies auf sich wirken zu lassen. Wenn Sie immer noch mit dem primitiven DOM-Manipulationscode gearbeitet hätten, den ich in Beitrag 1.1 eingeführt habe, hätte dieser Effekt nur durch das Schreiben einiger einigermaßen technischer (und wahrscheinlicher) Texte erzielt werden können eher ineffizienter) Low-Level-Code. Hier mussten Sie lediglich den Wert einer Variablen ändern. Sveltekit hat die komplizierten Konsequenzen <strong>automatisch</strong> (und, seien Sie versichert, effizient) bewältigt. </p> <p>Kurz gesagt: Svelte bietet Ihnen eine Hochsprache, mit der Sie die mühsamen Details der Browser-Bildschirmverwaltung dem Framework überlassen können. </p> <p><em>Im Oktober 2024 führte Svelte 5 eine Reihe von Verbesserungen seiner Reaktivitätsdefinitionsvereinbarungen ein. Das oben beschriebene let-Konstrukt funktioniert immer noch gut für alles in dieser Beitragsreihe, aber für komplexere Anforderungen steht jetzt ein neues Runenkonzept zur Verfügung. Weitere Informationen finden Sie unter „Was sind Runen“.</em></p> <h4> 2.2 Dateneingabe </h4> <p>Machen wir das Pop-up etwas interessanter. Stellen Sie sich vor, Sie hätten die Aufgabe, eine „Produktliste“ für ein produzierendes Unternehmen zu verwalten. Sie benötigen ein Dienstprogramm, das die aktuelle Liste anzeigt und Ihnen das Hinzufügen neuer Produkte ermöglicht. In der Praxis möchten Sie natürlich auch, dass Einträge bearbeitet und gelöscht werden können, aber lassen Sie uns die Dinge vorerst einfach halten. </p> <p>Sehen Sie sich den folgenden Code an. Es wird wahrscheinlich Ihre JavaScript-Kenntnisse erweitern, aber die internen Kommentare sollten helfen.<br> </p> <pre class="brush:php;toolbar:false">//src/routes/ page.svelte – Entfernen Sie diese Zeile vor der Ausführung <script> let popupVisible = false; let newProductNumber = ""; let products = []; // Ein Array von Produktobjekten {productNumber: productNumber} </script> <div> <p>Der Abschnitt „Vorlage“ beginnt hier mit der Überprüfung des Werts von popupVisible. Wenn dies falsch ist (was beim Start der Fall sein wird, da die Variable gerade im Abschnitt „Skript“ initialisiert wurde), zeigt die Webanwendung die aktuelle Liste der „Produkte“ der Webanwendung an (ein Array von Produktnummern, die in einem Produktarray gespeichert sind). </p> <p>Der Code geht nun weiter und zeigt eine Schaltfläche „Ein weiteres Produkt hinzufügen“ an – jetzt eine normale, nicht die verrückte Version, die im vorherigen Beispiel verwendet wurde. Aber wie zuvor verfügt es über eine zugehörige on:click-Funktion, und diese setzt den Wert von popupVisible auf true.</p> <p>Was passiert, wenn auf die Schaltfläche geklickt wird? Da popupVisible eine reaktive Variable ist, aktualisiert die Webanwendung ihren Bildschirm.</p> <p>Dieses Mal wird der Produktanzeigeabschnitt des Formulars ignoriert und die Steuerung wird direkt zum zweiten Teil des Vorlagenabschnitts verschoben.</p><p>Hier sehen Sie eher etwas wie ein herkömmliches Popup. Dieses verwendet ein <form> Tag innerhalb eines Containers div> um Eingaben für eine newProductNumber-Statusvariable zu sammeln. Hier wird ein spezieller „bind“-Qualifizierer von Svelte verwendet, um newProductNumber mit der Tastatureingabe des Benutzers zu synchronisieren. Jedes Mal, wenn der Benutzer ein Zeichen in das Feld <input> des Formulars eingibt, wird newProductNumber aktualisiert. <p>Wenn der Benutzer schließlich auf die Schaltfläche „Registrieren“ des Formulars klickt, ist seine on:click-Funktion somit in der Lage, eine vollständig aktualisierte newProductNumber in das Produktarray zu verschieben und das Feld „popupVisible“ zurückzusetzen.</p> <p>Da es sich bei popupVisible um eine reaktive Variable handelt, wird schließlich der Abschnitt „Vorlage“ des Codes erneut ausgeführt und das Popup wird durch die aktualisierte Liste der Produktnummern ersetzt.</p> <p>Ein oder zwei andere Dinge könnten Sie verwirren. Im vorherigen Beispiel verwies der anon:click-Qualifizierer auf eine Funktion, die im <script> der Webanwendung definiert war. Abschnitt. In dieser neuen Version von page.svelte wird die Funktion jedoch explizit innerhalb des <button> definiert. HTML-Spezifikation des Feldes. Beide Ansätze sind vollkommen gültig. Die hier verwendete Version sieht für Sie vielleicht etwas seltsam aus, aber es handelt sich um eine weit verbreitete Anordnung, die den Vorteil hat, dass die Logik der Funktion an ihrem Aufrufpunkt definiert wird. Dadurch ist es viel einfacher zu erkennen, was vor sich geht. </p> <p>Als Referenz der Ausdruck:<br> „() => { .... }“ sagt: „Hier ist eine Funktion, die durch die folgenden JavaScript-Anweisungen definiert wird: „{ .... }“. Es gibt viele Varianten. Bitten Sie chatGPT, Ihnen ein Tutorial zu „arrow“ zu geben " Funktionen .</p> <p>Im weiteren Verlauf werden Sie auch feststellen, dass ich bei meinem „Styling“ viel experimentierfreudiger geworden bin. Es gibt zum Beispiel eine Überschrift und alles ist schön zentriert (CSS-„Vererbung“ sorgt dafür, dass die > </p><p>Aber das ist genug Hintergrundwissen. Sehen wir uns die Webapp in Aktion an. Fügen Sie den neuen Code über den aktuellen Inhalt Ihrer page.svelte-Datei ein, speichern Sie ihn und öffnen Sie (falls erforderlich) ein Terminal in Ihrem Projekt und starten Sie Ihren Entwicklungsserver mit dem Befehl npm run dev -- --open neu. Folgendes sollten Sie in Ihrem Browser sehen::</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173277643810144.jpg" alt="NgSysV.Creating a simple Reactive Svelte webapp"></p> <p>Und Folgendes sollten Sie sehen, wenn Sie auf die Schaltfläche klicken:<br><br></p> <p><img src="https://img.php.cn/upload/article/000/000/000/173277643952736.jpg" alt="NgSysV.Creating a simple Reactive Svelte webapp"></p> <p>Da es keine Validierung für das Feld „newProductNumber“ gibt, werden Sie feststellen, dass Sie sowohl Zeichen als auch Zahlen eingeben können – wir werden dies in einem zukünftigen Beitrag beheben. Wenn Sie jedoch auf die Schaltfläche „Registrieren“ klicken, sollte das Popup durch die ursprüngliche Seite mit der Anzeige des Lagerbestands ersetzt werden und die „Nummer“ Ihres neuen Produkts zur Liste hinzugefügt werden.</p> <p>Dieses Stück Svelte fängt fast an, wie ein Informationssystem auszusehen! </p><h3> 3. Vorwärts und aufwärts </h3> <p>Dieser Beitrag hat Ihnen einen kurzen Einblick in die Schlüsselkonzepte gegeben, die in der Svelte-Sprache verkörpert sind. Leider gibt es einen Haken. Wie Sie sicher bemerkt haben, ist das Beispiel „Inventar“, das Sie gerade gesehen haben, praktisch nutzlos, da jedes Mal, wenn Sie die Webanwendung schließen, die Produktliste verschwindet! Der nächste Schritt besteht daher darin, Ihnen die <strong>Firestore</strong>-Datenbanktechnologie von Google vorzustellen. Dadurch können Sie <strong>persistenten</strong> Speicher auf einem Serverhost erstellen. </p> <h3> Nachtrag (a): Wenn etwas schief geht – Untersuchen von Layoutproblemen mit dem Chrome Inspector </h3> <p>In Beitrag 2.1 wurde unter „Wenn etwas schief geht“ beschrieben, wie man mit einigen der gröberen Probleme umgeht, die bei der Entwicklung einer Webanwendung auftreten können. Aber jetzt, wo Sie auf einem fortgeschritteneren Niveau arbeiten, benötigen Sie ein ausgefeilteres Werkzeug. Dieser Abschnitt stellt Ihnen den „Chrome Inspector“ vor, ein unschätzbares Hilfsmittel bei der Korrektur von Problemen mit dem Bildschirmlayout Ihrer Webanwendung und Logikfehlern in Ihrem JavaScript (und vielem mehr, wie Sie später in dieser Serie sehen werden).</p> <p>Der Inspektor wird auf einer Webanwendungsseite gestartet, indem Sie mit der rechten Maustaste auf die Seite klicken und die Option „Inspizieren“ auswählen. Hier ist ein Beispiel für die Ausgabe:</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173277644070139.jpg" alt="NgSysV.Creating a simple Reactive Svelte webapp"></p> <p>In diesem Screenshot habe ich:</p>
Wenn Sie das selbst ausprobieren, werden Sie feststellen, dass die Überschrift einige farbige Grafiken erhalten hat. Diese zeigen Ihnen die Größe und Position der Ränder, Ränder und Abstände an, die Ihrem Text hinzugefügt wurden. Das rechte Inspektionspanel bietet weitere Details. Wenn Sie im Menü auf die Registerkarte „Rechnet“ klicken, erhalten Sie eine Grafik, in der die Farbcodierung und die detaillierten Größenangaben für die verschiedenen Elemente erläutert werden. Wenn Sie auf die Registerkarte „Stile“ klicken, werden Details zu den Stilen angezeigt, die dem Text zugeordnet sind. Der erste Satz von Einträgen in der Liste bestätigt die Stile, die explizit mit dem Tag > festgelegt wurden
Das Schöne an diesem Bedienfeld ist, dass Sie mithilfe des Inspektors die Auswirkungen von Änderungen und Hinzufügungen von Stilen sehen können. Angenommen, Sie möchten eine rote Schriftart für die Überschrift ausprobieren, klicken irgendwo oben im Bedienfeld auf den Eintrag „element.style“ und geben „Farbe: Rot“ ein. Die Überschrift wird jetzt gefälligst rot. Beachten Sie die Möglichkeit, die Autovervollständigung zum Ausprobieren verschiedener Farben zu nutzen.
Ich möchte nicht weiter darauf eingehen, aber ich denke, Sie sollten anfangen zu verstehen, wie diese Funktion Ihnen ein präzises und intuitives Werkzeug zur Untersuchung und Behebung von Layoutproblemen bieten kann. Weitere Informationen finden Sie in der Dokumentation von Google zum Inspektor bei DevTools.
Seien Sie bereit, einige Zeit dafür aufzuwenden. Da der Inspektor ein komplexes Werkzeug ist, wird es eine Weile dauern, bis Sie ihn sicher nutzen können. Aber diese Zeit wird gut investiert sein. Der Inspector hat mir sicherlich unzählige Stunden blinden Experimentierens mit Quellcodeeinstellungen erspart. Die grafische Darstellung des Inspektors macht alle verborgenen Eigenschaften von Elementbreiten, Rändern und Innenabständen sichtbar.
Der Inspektor kann Ihnen auch dabei helfen, Logikfehler zu finden, indem er Ihnen ermöglicht, Ihren Quellcode anzuzeigen und „Haltepunkte“ in Zeilen zu setzen, in denen die Ausführung angehalten werden soll. Nachdem Sie die Webanwendung aktualisiert haben (wobei der Inspektor noch geöffnet ist), können Sie die Feldwerte an jedem Haltepunkt überprüfen. Hier ist ein Screenshot des Inspektors in Aktion:
In diesem Screenshot habe ich:
Die Auswirkung all dessen war, dass die Webanwendung in den „Code-Debug“-Modus versetzt wurde. Im Moment debugge ich den Abschnitt der Webanwendung, was etwas sinnlos ist, da er nur einmal ausgeführt wird und Sie genau wissen, was er tut. Aber lassen Sie uns die einzelnen Schritte durchgehen, denn sie werden Ihnen helfen, ein Gefühl dafür zu bekommen, was der Debugger im JavaScript-Quellcode für Sie tun kann.
Derzeit wird die Webanwendung vor der Ausführung der ersten Anweisung angehalten und hat daher nichts Nützliches getan. Fahren Sie jedoch mit der nächsten Anweisung fort, indem Sie auf die Schaltfläche „Weiter gehen“ klicken. Beachten Sie, dass die Hervorhebung nun in die zweite Zeile verschoben wurde. Fahren Sie mit der Maus über das Feld „popupVisible“ in der ersten Zeile und beachten Sie, dass jetzt ein Tooltip mit dem aktuellen Wert angezeigt wird – natürlich „false“. Wiederholen Sie den Trick, um die Einstellungen von newProductNumber und Produkten zu bestätigen.
Der Wert des Inspektors wird deutlicher sichtbar, wenn Sie Haltepunkte in Javascript-Funktionen setzen, die im