Über unsMediaKontaktImpressum
Nils Röhrig 09. Juli 2024

Mit SvelteKit und Cloudflare® zur verteilten Web-App - Am Rande des Netzwerks

Wer in den letzten Jahren im Bereich der Webentwicklung aufmerksam war, wird an der Nennung von "Edge Computing" wohl nicht vorbeigekommen sein. Die Hosting-Firma Netlify bietet "Edge Functions" an, beim Wettbewerber Vercel gibt es stattdessen die "Edge Runtime" und bei Cloudflare, Inc. heißt das Angebot "Cloudflare Workers®", um nur ein paar Beispiele zu nennen. Doch auch wenn es durch die häufige Nennung so scheinen mag, so ist der Begriff und die zugrunde liegende Idee keineswegs neu. Bereits vor über zwanzig Jahren wurde das damalige Verteilungssystem von Akamai beschrieben, was als Blaupause für heutige Edge-Netzwerke betrachtet werden kann [1]. Vergleichsweise neu ist allerdings, dass diese Technologien beispielsweise durch die oben genannten Anbieter für Web-Entwickler aller Art erschwinglich und zugänglich geworden sind. Hinzu kommt, dass viele JavaScript-Web-Frameworks – z.B. Next.js für React, Nuxt.js für Vue oder SvelteKit [2] für Svelte – direkte Unterstützung für Edge-Umgebungen mitbringen und damit die Entwicklung und Veröffentlichung von Applikationen in Edge-Umgebungen ebenfalls vereinfachen. Eine gute Zeit also, die Idee einmal Revue passieren zu lassen und zu sehen, wie eine Edge-Web-App mit dem Web-Framework SvelteKit und der Plattform von Cloudflare entstehen kann.

Was ist Edge Computing?

Zunächst muss dafür die Frage beantwortet werden, was Edge Computing eigentlich ist. Grundsätzlich handelt es sich dabei mehr um eine Strategie als um eine konkrete Technologie. Die Firma Red Hat bezeichnet Edge Computing beispielsweise als "Computing, das nahe am physischen Standort der Nutzenden oder der Datenquelle stattfindet" [3]. Daraus lässt sich ableiten, dass bei Edge Computing vor allem der physische Standort der Berechnungen eine Rolle spielt und weniger die gewählten Technologien. Es geht also darum, geteilte Ressourcen über viele verschiedene Standorte hinweg zu verteilen. Diese Eigenschaft findet vielfältige Anwendungsfälle, die häufig mit der Webentwicklung gar nichts zu tun haben. Beispiele hierfür sind die Verarbeitung von großen Mengen an Sensordaten in modernen Fabriken und Fahrzeugen, aber auch die standardisierte Ausführung von Software in Mobilfunkmasten. Generell ist Edge Computing immer dann interessant, wenn die Übertragung von Daten in ein zentrales Rechenzentrum zu teuer oder zu langsam ist oder Echtzeitberechnungen notwendig sind.

Zum Verständnis von Edge Computing gehört aber auch, die einzelnen Arten von Edges und deren physische Standorte zu begreifen. Dabei lässt sich Edge Computing als eine Anzahl sich umschließender Kreise auffassen. Jeder weitere Kreis ist dabei ein weiterer Schritt hin zum äußeren Netzwerkrand und damit den Endbenutzer:innen.

Im Vorschlag von Red Hat [3] werden insgesamt vier Kreise benannt, die jeweils eine Ausführungsumgebung für Software darstellen können. Ausgehend vom Mittelpunkt heißen diese wie folgt:

  • Der Core ist das zentrale Rechenzentrum eines Cloud-, Telekommunikations- oder anderen großen Unternehmens und zählt nicht als Netzwerk-Kante.
  • Die ServiceProvider Edge ist der Übergangspunkt zwischen Internet Service- oder Telekommunikationsprovider zum weiteren Internet.
  • Als End User Premises Edge wird der Übergang vom weiteren Internet in die Umgebung von Endbenutzer:innen bezeichnet. Das können beispielsweise Zugänge zu Einzelhandelsgeschäften oder Fabriken sein. Es zählen aber auch Zugänge zu Privathaushalten oder Fahrzeugen dazu.
  • Die Device Edge stellt den äußersten Netzwerkrand dar. Hier sind beispielsweise Systeme zu finden, die Sensoren direkt und mit Hilfe proprietärer Protokolle verbinden, wie sie in modernen Fabriken zu finden sind.

Edge Computing in der Web-Entwicklung

Von den oben genannten Kanten ist in der Webentwicklung vor allem die Service Provider Edge interessant, denn dort stellen auch die einleitend genannten Edge-Anbieter ihre Dienste bereit. Der bekannteste Anwendungsfall für Edge Computing ist in diesem Zusammenhang das sogenannte Content Delivery Network (CDN). Ein solches CDN ermöglicht in erster Linie die Verteilung statischer Web-Ressourcen – z.B. Stylesheets, Skripte oder Bilder – über viele globale Standorte hinweg. Das Ziel hierbei ist einerseits eine höhere Auslieferungsgeschwindigkeit an Web-Clients, weil ein großer Teil einer Website oder Web-App nahe des physischen Standorts des Clients bereitgestellt wird. Daneben ist aber auch eine Verteilung der Anfragelast über viele Standorte hinweg förderlich für die Antwortzeiten des Gesamtsystems. Neben der Bereitstellung statischer Daten haben CDN-Anbieter aber auch in der Vergangenheit tatsächliches Computing, also Berechnungen, an die Netzwerk-Kante ausgelagert. Ein prominentes Beispiel dafür ist die Möglichkeit, im CDN bereitgestellte Bilder auf Anfrage in unterschiedlichen Größen und Formaten zu beziehen. Diese Berechnungen werden an der Kante ausgeführt und die Ergebnisse danach für zukünftige Anfragen gecached und im CDN verteilt.

Die Verwendung von CDNs ist bekannt und seit vielen Jahren alltäglicher Bestandteil der Webentwicklung. Die jüngeren Entwicklungen im Edge Computing zeigen aber die Ausbaumöglichkeiten dieser Idee, denn wie bereits am Beispiel der Bilder gesehen, können die einzelnen Knoten im Edge-Netzwerk auch Berechnungen ausführen. Diese Möglichkeiten werden heute einfacher als je zuvor zugänglich gemacht, sodass prinzipiell jede Webentwicklerin und jeder Webentwickler Nutzen daraus ziehen kann. So ist es inzwischen möglich, neben statischen Dateien und dynamischen Berechnungen auch die Datenhaltung direkt an der Kante abzulegen.

In vielen Fällen handelt es sich bei den Ausführungsumgebungen für diese Berechnungen um die V8 JavaScript Engine, die unter anderem auch im Web Browser Chrome von Google und der JavaScript-Laufzeitumgebung Node.js zum Einsatz kommt. Hieraus ergibt sich eine wichtige Eigenschaft, denn in den Edge-Ausführungsumgebungen können meist keine vollwertigen Node.js-Anwendungen ausgeführt werden, da die meisten Bibliotheken, die Node.js standardmäßig mitbringt, dort nicht zur Verfügung stehen. Stattdessen stellen die Anbieter neben den eingebauten Features von V8 meist eigene Bibliotheken bereit. Diese dienen beispielsweise der Interaktion mit anbieterspezifischen Features, wie verschiedenen Datenhaltungsangeboten. Sie können aber auch die Kompatibilität mit etablierten Standards auf Websites sichern, sodass Code sowohl im Web Browser als auch in der Edge-Umgebung ausgeführt werden kann.

Was ist Cloudflare Pages™?

Wie oben bereits erwähnt, bieten verschiedene Unternehmen die Möglichkeit an, Anwendungen an der Netzwerk-Kante auszuführen. Einer dieser Anbieter ist die amerikanische Firma Cloudflare. Ihr Produktportfolio umfasst mit Cloudflare Workers und Cloudflare Pages zwei für Edge-Anwendungen interessante Angebote. Beide Produkte sind zudem im kostenlosen Einsteiger-Plan von Cloudflare beinhaltet, sodass nicht einmal eine Kostenhürde besteht, um erste Schritte zu machen. Mit den Worten des Anbieters gesagt, handelt es sich bei Cloudflare Pages um eine "JAMstack platform for frontend developers to collaborate and deploy websites" [4]. In erster Linie sind damit statische Websites gemeint, die automatisch bei Änderung aus einem Git-Repository gebaut und global im CDN von Cloudflare veröffentlicht werden können. Cloudflare Workers® bietet eine Umgebung zur Veröffentlichung von "serverless code instantly across the globe to give it exceptional performance, reliability, and scale"[5]. Hierbei handelt es sich also um eine Ausführungsumgebung für dynamischen Code an der Netzwerk-Kante ohne die Notwendigkeit für ein zentrales Rechenzentrum. Beide Produkte lassen sich auch sehr gut zusammen verwenden. So bietet Cloudflare Pages die Möglichkeit, dynamische Funktionen in Form von Cloudflare Workers direkt in die Website oder Web-App zu integrieren. Diese Integration ermöglicht einerseits das serverseitige Rendern von HTML-Dokumenten, andererseits aber auch den Zugang zu den Laufzeitbibliotheken von Cloudflare Workers. Dazu zählen neben Web-Standards wie Fetch API und WebCrypto auch Schnittstellen zu den verfügbaren Datenhaltungsoptionen, wie beispielsweise Cloudflare Workers KV und Cloudflare D1.

Diese Optionen erlauben es, Daten direkt aus der Edge-Anwendung zu lesen und zu speichern, ohne dass eine separate zentrale Datenbank erforderlich ist. KV bietet die einfachste Lösung in Form eines Schlüssel-Wert-Speichers, während D1 eine umfassende Datenbank auf SQLite-Basis darstellt. Beide Optionen zeichnen sich durch automatische globale Verteilung und Zugänglichkeit über eine Laufzeitbibliothek in Cloudflare Workers-Funktionen aus.

Bis jetzt wurde gezeigt, dass Web-Entwickler:innen mithilfe von Cloudflare oder ähnlichen Anbietern global verteilte Edge-Anwendungen einfach betreiben können. Dennoch bleibt die Frage offen, wie diese Apps effektiv umgesetzt werden können. An dieser Stelle kommen die bereits erwähnten Edge-tauglichen Web-Frameworks ins Spiel.

Was ist SvelteKit?

Wenn heutzutage Websites oder Web-Apps erstellt werden, kommen oft UI-Frameworks oder -Bibliotheken wie React, Vue oder Svelte zum Einsatz. Typischerweise ist deren Anwendungsfall aber auf den Browser beschränkt, auch wenn diese Tools grundsätzlich die Ausführung auf dem Server unterstützen können. In der Vergangenheit war es üblich, HTML-Dokumente dynamisch auf dem Server zu generieren und dann über Progressive Enhancement im Client mit JavaScript anzureichern – oder auch nicht. Danach hat für etwa eine Dekade das Pattern der Single Page Application (SPA) vorgeherrscht, also eine rein clientseitige JavaScript-Applikation, die beispielsweise über REST-basierte APIs mit dem Server kommuniziert. In letzter Zeit ist aber ein Trend zu beobachten, der wieder zurück zu den Wurzeln des serverseitigen Renderns mit Progressive Enhancement geht. Ein wesentlicher Unterschied zur Vergangenheit ist dabei der Einsatz derselben Technologie für die client- und die serverseitige Entwicklung. Das bedeutet, dass Webentwickler:innen, die mit Svelte oder einem anderen UI-Framework vertraut sind, das eigene Wissen problemlos auch auf die serverseitige Verarbeitung übertragen können. Dies wird unter anderem auch von den eingangs genannten JavaScript-Web-Frameworks vorangetrieben, die in einer vertrauten Umgebung einen fließenden Übergang ermöglichen und mit Unterstützung von Progressive Enhancement sogar Applikationen ermöglichen, die ohne clientseitiges JavaScript auskommen.

Für Webentwickler:innen, die mit Svelte vertraut sind, stellt sich in diesem Zuge das Web-Framework SvelteKit als geeignete Option dar, da es vom selbem Team entwickelt wird, das auch Svelte entwickelt. Die Autoren bezeichnen SvelteKit als "framework for rapidly developing robust, performant web applications using Svelte" [6]. Während die Kernaufgabe von Svelte das Rendering von UI-Komponenten im Browser ist, geht SvelteKit weit darüber hinaus und stellt viele Funktionalitäten bereit, die von einer vollständigen Web-App benötigt werden. Das umfasst beispielsweise einen Router, der den Zugang zu den einzelnen Funktionen der Web-App über URLs bereitstellt. Ein anderes Beispiel sind die sog. Form Actions, die einen simplen Weg anbieten, HTML-Formulardaten auf standardkonformem Wege serverseitig zu verarbeiten. Durch optionales integriertes Progressive Enhancement ist zudem gewährleistet, dass die User Experience so flüssig gestaltet werden kann, wie das auch bei SPAs der Fall ist. Darüber hinaus bietet SvelteKit viele weitere Funktionen, die sich nahtlos und mit hohem Fokus auf Simplizität in die Entwicklung einfügen. Da sich die Arbeit mit SvelteKit aber am besten anhand eines praktischen Beispiels erklären lässt, wird im Folgenden eine kleine Notiz-App beschrieben, die mit SvelteKit entwickelt und auf Cloudflare Pages bereitgestellt wird.

Initialisierung der SvelteKit-App

Zunächst muss sichergestellt werden, dass auf dem Entwicklungssystem Node.js 18.13 oder höher installiert ist. Anschließend kann mit dem Kommando npm create svelte@latest eine neue SvelteKit-App initialisiert werden. Das CLI-Tool fragt zunächst nach dem Zielverzeichnis, in dem die App erzeugt werden soll. Nach dessen Eingabe folgen einige Abfragen, die abseits von der Frage nach dem Template gemäß der eigenen Präferenzen gewählt werden können. Für das Beispiel wurden folgende Antworten gewählt:

  1. Which Svelte app template? – Skeleton project
  2. Add type checking with TypeScript? – No
  3. Select additional options – ESLint, Prettier.

Um die Initialisierung abzuschließen, müssen nach dem Wechsel in das angegebene Zielverzeichnis die Abhängigkeiten der App mit dem Kommando npm install installiert werden. Um die App später auf Cloudflare Pages deployen zu können, sollte zudem ein Git-Repository für die App initialisiert werden, das entweder auf GitHub oder auf GitLab gehostet wird. Um den Entwicklungsserver zu starten, kann das Kommando npm run dev verwendet werden. Daraufhin kann die neu erstellte App im Web-Browser unter http://localhost:5173 betrachtet werden.

Erstellung der Startseite

Jede SvelteKit-App besteht fundamental aus Seiten, die im Web-Browser aufgerufen werden und innerhalb der App über Routen definiert werden. Wie in anderen vergleichbaren Frameworks auch, arbeitet der SvelteKit-Router dateibasiert. Das bedeutet, dass die Hierarchie der Seiten im Dateisystem zugleich die Hierarchie der Seiten im Web ist. Routen werden in SvelteKit-Projekten dabei standardmäßig im /src/routes-Verzeichnis angelegt. Angenommen, die SvelteKit-App würde über die URL example.com aufgerufen werden, so würde eine passende Datei in /src/routes eine Seite erzeugen, die über example.com/ erreichbar wäre. Analog dazu wäre eine Seite im Verzeichnis /src/routes/create über example.com/create erreichbar.

Routen bestehen dabei aus Dateien, deren Namen mit einem + beginnen. Diese haben in SvelteKit eine besondere Bedeutung, denn sie werden vom Framework als Ort für bestimmte Operationen gewertet. Zentral ist dabei die +page.svelte. Diese Datei ist eine Svelte-Komponente und gleichzeitig der Ort, an dem das Markup der Seite hinterlegt wird. Die Startseite der Notiz-Applikation sollte logischerweise auch Notizen anzeigen. Dafür wird die Datei /src/routes/+page.svelte zunächst mit dem Code aus Listing 1 gefüllt.

Listing 1: Anzeige einer statischen Liste von Notizen auf der Startseite
  <script>
     let notes = [
       { id: 'ee2bb', title: 'Einkaufsliste', content: 'Milch, Brot, Butter' },
       { id: '8aaaf', title: 'ToDo', content: 'Aufräumen, Lernen, Einkaufen' },
       { id: '20a77', title: 'Ideen', content: 'Neue App, Urlaub, Sport' }
     ];
  </script>
   
   <h1>Alle Notizen</h1>
  {#each notes as note (note.id)}
    <article>
      <h2>{note.title}</h2>
      <p>{note.content}</p>
    </article>
  {/each}

Wie ab Zeile 2 zu sehen ist, werden die Notizen in diesem Fall direkt in der Komponente definiert. In einer SPA könnte die statische Definition der Liste beispielsweise durch einen dynamischen Request gegen ein API ersetzt werden. Da SvelteKit aber nicht nur clientseitig, sondern auch serverseitig ausgeführt werden kann, stellt das Framework eine spezifische Funktionalität für das Laden von Seitendaten in Form von Load Functions bereit. Diese werden in speziellen Dateien namens +page.js oder +page.server.js in direkter Nachbarschaft der Komponente angelegt und sind damit routenspezifisch. Der Unterschied zwischen den beiden Dateien liegt im Ausführungsort. Die +page.server.js wird ausschließlich auf dem Server ausgeführt, während die +page.js nur beim erstmaligen Aufruf der Route im Zuge des Server-Side-Renderings ausgeführt wird. Danach wird diese Datei nur noch clientseitig ausgeführt. Damit eignen sich beide Dateien auch für unterschiedliche Dinge, denn eine Datei die nur serverseitig ausgeführt wird, kann auch mit sensiblen Daten arbeiten, die dem Client besser vorbehalten bleiben.

Für die Startseite der Notiz-Applikation sollen die Notizen serverseitig geladen werden, da sie später direkt an der Netzwerk-Kante abgelegt werden sollen. Dort hat der Client keinen Zugriff und braucht den Server sozusagen als Mittelsmann. Dieser muss die Daten dann über eine passende Funktion abrufen, das HTML rendern und dann an den Client übertragen. Zunächst wird dafür eine neue Datei namens /src/routes/+page.server.js erstellt und mit dem Code aus Listing 2 gefüllt.

Listing 2: Serverseitige Bereitstellung der Notizen für die Startseite

   let notes = [
     { id: 'ee2bb', title: 'Einkaufsliste', content: 'Milch, Brot, Butter' },
     { id: '8aaaf', title: 'ToDo', content: 'Aufräumen, Lernen, Einkaufen' },
     { id: '20a77', title: 'Ideen', content: 'Neue App, Urlaub, Sport' }
   ];
   
   export async function load() {
     return {
       notes
    };
  }

Die Datei exportiert eine Funktion namens load, die vom Framework serverseitig ausgeführt wird, wann immer die Seite aufgerufen wird. Diese Funktion ist dafür verantwortlich, alle von der Seite benötigten Daten zu sammeln und der Seiten-Komponente bereitzustellen. Der Rückgabewert entspricht dabei genau der Datenstruktur, die dann in der Komponente zur Verfügung steht. Um die Daten nutzen zu können, muss /src/routes/+page.svelte gemäß Listing 3 angepasst werden.

Listing 3: Nutzung der übergebenen Notizen in der Komponente

   <script>
     export let data;
   </script>
   
   <h1>Alle Notizen</h1>
   {#each data.notes as note (note.id)}
     <article>
       <h2>{note.title}</h2>
       <p>{note.content}</p>
    </article>
  {/each}

Erstellen von Notizen

Die Seite zeigt nun die Notizen an, die in der load-Funktion bereitgestellt wurden. Diese sind zwar nach wie vor statisch, kommen nun aber vom Server und könnten dort auch auf beliebigem anderen Wege geladen werden. Zunächst soll aber eine Möglichkeit geschaffen werden, neue Notizen zu erstellen. Dafür wird eine neue Seite unter /src/routes/create/+page.svelte angelegt, deren Inhalt in Listing 4 notiert ist.

Listing 4: Das Formular zur Erstellung einer Notiz

  <form action="?/addNote" method="post">
    <label for="title">Titel:</label>
    <input type="text" name="title" required />
    <label for="content">Inhalt:</label>
    <textarea name="content" required></textarea>
    <button type="submit">Notiz erstellen</button>
  </form>

Bei diesem Code handelt es sich um ein standardkonformes HTML-Formular. Das einzige SvelteKit-spezifische Merkmal ist der Inhalt des Action-Attributs des Formular-Elements. Mit der Angabe von ?/addNote wird dem Framework mitgeteilt, dass die Verarbeitung des Formulars in einer Form Action auf der gleichen Seite mit dem Namen addNote stattfinden soll. Wenn das Formular im aktuellen Zustand abgeschickt wird, kommt es allerdings noch zum Fehler, denn die gewünschte Form Action existiert bislang noch nicht. Um diese zu erzeugen, wird eine weitere Datei unter /src/routes/create/+page.server.js angelegt. In Listing 5 ist der Inhalt der neuen Datei zu finden.

Listing 5: Die Form Action zur Verarbeitung des Formulars aus Listing 4

  import { notes } from '$lib/notes';
  import { redirect } from '@sveltejs/kit';
   
  export const actions = {
     async addNote({ request }) {
       const formData = await request.formData();
       const id = Math.random().toString(16).slice(10);
       notes.push({
        id,
        title: formData.get('title'),
        content: formData.get('content')
      });
      redirect(302, '/');
    }
  };

Die eingegebenen Daten aus dem Formular sind über die request.formData()-Methode erhältlich. Dabei handelt es sich um ein standardkonformes FormData-Objekt [7], das eine get()-Methode zur Verfügung stellt, die einzelne Schlüssel aus den Formularen auslesen kann. Die daraus erhaltenen Daten werden zusammen mit einer zufälligen hexadezimalen ID in einem Notes-Array gespeichert, das aus $lib/notes.js importiert wird. Wenn alles erfolgreich war, wird nach der Verarbeitung auf die Startseite weitergeleitet. In diesem Zustand produziert die Seite bei Aufruf allerdings noch einen Fehler, weil das importierte Objekt noch nicht existiert. Um das zu ändern, wird eine neue Datei /src/lib/notes.js mit dem Inhalt aus Listing 6 erzeugt.

Listing 6: Das importierte notes-Array

  export const notes = [
    { id: 'ee2bb', title: 'Einkaufsliste', content: 'Milch, Brot, Butter' },
    { id: '8aaaf', title: 'ToDo', content: 'Aufräumen, Lernen, Einkaufen' },
    { id: '20a77', title: 'Ideen', content: 'Neue App, Urlaub, Sport' }
  ];

Ist die Datei angelegt, kommt es nicht länger zu einem Fehler. Wenn nun mit dem Formular eine neue Notiz erstellt wird, folgt wie erwartet eine Weiterleitung auf die Startseite. Allerdings fällt sofort auf, dass die neue Notiz gar nicht erscheint. Um das zu ändern, muss die Datei /src/routes/+page.server.js gemäß Listing 7 angepasst werden.

Listing 7: Die angepasste Ladefunktion für die Startseite

  import { notes } from '$lib/notes';
  
  export async function load() {
    return {
      notes
    };

Bei der erneuten Anzeige der Seite werden neue Notizen jetzt problemlos angezeigt. Die neuen Daten werden allerdings nur im Arbeitsspeicher des Servers abgelegt. Wird der Server neu gestartet, verfallen jegliche Änderungen und der Ursprungszustand wird wiederhergestellt. Um nützlich zu sein, braucht die Applikation daher eine bessere Strategie zur langfristigen Speicherung von Daten.

Bereitstellung der App über Cloudflare

Bevor es aber dazu kommt, sollte die Notiz-Applikation zunächst über Cloudflare bereitgestellt werden, wozu ein kostenfreier Cloudflare Account [8] benötigt wird. Sofern der aktuelle Stand des Projekts ins Git-Remote gepusht ist, kann mit den folgenden Schritten eine passende Cloudflare-Anwendung angelegt werden:

  1. Bei Cloudflare anmelden [9]
  2. Zum Menüpunkt "Workers und Pages" wechseln
  3. Button "Anwendung erstellen" betätigen
  4. Auf Tab "Pages" wechseln
  5. Button "Mit Git verbinden" betätigen
  6. Im GitHub- oder Gitlab-Tab mit dem jeweiligen Anbieter verbinden
  7. Repository der Notiz-Applikation wählen
  8. Button "Einrichtung starten" betätigen
  9. Als Framework-Voreinstellung "SvelteKit" wählen
  10. Button "Speichern und Bereitstellen" betätigen.

Im Anschluss startet Cloudflare die Bereitstellung. Sobald der Prozess abgeschlossen ist, kann die App unter der von Cloudflare angegebenen URL aufgerufen werden.

Speichern der Notizen in Workers KV

Die einfachste für diese Zwecke verfügbare Speicherungsoption bei Cloudflare ist Workers KV. Dabei handelt es sich um einen Schlüssel-Wert-Speicher, der Daten innerhalb von Workers-Funktionen global verfügbar macht. Workers KV ist innerhalb von Workers-Funktionen über eine simple Laufzeitschnittstelle verwendbar. Dort werden verschiedene Operationen zum Lesen, Schreiben oder Löschen von Schlüssel-Wert-Paaren bereitgestellt. Werden Daten geschrieben, sind sie innerhalb des selben Netzwerkstandorts unmittelbar verfügbar, das heißt, dass Requests, die beim selben Edge Node ankommen, sofort auf die neuen Daten zugreifen können. Bis zur globalen Verfügbarkeit können aber bis zu 60 Sekunden vergehen. Requests, die von anderen Edge Nodes bearbeitet werden, haben erst verzögert Zugriff auf die Daten. Die Persistenz in Workers KV ist damit eventuell konsistent, was die Technologie ungeeignet für häufiges Schreiben macht. Häufiges Lesen profitiert jedoch ungemein von der globalen Verteilung, weshalb es für Anwendungsfälle mit vielfachen Lesezugriffen sehr gut geeignet ist.

Damit Daten gespeichert werden können, muss ein KV Namespace angelegt werden. Namespaces ermöglichen die Trennung unterschiedlicher Typen von Schlüssel-Wert-Paaren, zum Beispiel nach Inhalt oder nach Anwendung. Die Einrichtung erfolgt unter dem Menüpunkt "Workers und Pages > KV" mit dem Button "Einen Namespace erstellen". Im Anschluss kann ein beliebiger Name vergeben werden – das Beispiel nutzt "NOTES_NAMESPACE" dafür. Über den Button "Hinzufügen" wird der neue Namespace erzeugt.

Um den angelegten Namespace nun in der Notiz-Applikation verfügbar zu machen, muss dieser noch über ein sogenanntes Binding mit der Cloudflare-Anwendung verknüpft werden. Auf diese Weise ist es möglich, Namespaces über verschiedene Anwendungen hinweg nutzbar zu machen. Ein Binding wird in den Einstellungen der Anwendung folgendermaßen angelegt:

  1. Menüpunkt "Workers und Pages" aufrufen
  2. Passende Anwendung auswählen
  3. Im Tab "Einstellungen" Menüpunkt "Funktionen" aufrufen.

Im Abschnitt "KV-Namespace-Bindungen" kann über den Button "Binding hinzufügen" eine Eingabemaske mit zwei Feldern angezeigt werden. Das erste Eingabefeld ist ein Freitext-Feld, das den Namen aufnimmt, unter dem der zu bindende Namespace später in der App verfügbar gemacht wird – das Beispiel nutzt hier der Einfachheit halber "NOTES_NAMESPACE". Das zweite Eingabefeld ermöglicht die Auswahl des Namespaces, der an den zuvor vergebenen Namen gebunden werden soll. Auch hier wird im Beispiel "NOTES_NAMESPACE" ausgewählt. Mit einem Klick auf den Button "Speichern" wird das Binding fertiggestellt.

Der Namespace ist über den gewählten Namen nun in der App verfügbar. SvelteKit stellt KV Bindings über das platform-Objekt bereit. Dieses Objekt ist eine Eigenschaft des RequestEvent-Objekts, das an die Lade-Funktionen auf dem Server übergeben wird. In Listing 8 finden sich die Anpassungen für die Notiz-Liste auf der Startseite /src/routes/+page.server.js.

Listing 8: Auflistung aller Werte im KV Namespace

   export async function load({ platform }) {
     const notesNs = platform.env.NOTES_NAMESPACE;
     const { keys } = await notesNs.list();
   
     return {
       notes: await Promise.all(keys.map((key) => notesNs.get(key.name, { 
         type: 'json' 
       })))
     };
   }

Über die list()-Methode des Namespaces werden zunächst alle Schlüssel gelistet, die der Speicher kennt. Mit diesen Schlüsseln können dann die zugehörigen Werte aus dem Speicher geladen werden. Dabei wird angegeben, dass der erwartete Datentyp das JSON-Format ist, was dafür sorgt, dass der Wert anstatt als Text gleich als strukturiertes Objekt bereitgestellt wird. Werden diese Änderungen auf Cloudflare bereitgestellt, bleibt die Startseite zunächst abseits der Überschrift leer. Das liegt daran, dass nun Werte aus dem Namespace geladen werden, der zu diesem Zeitpunkt aber noch leer ist. Um das zu ändern, muss die Form Action zum Erstellen von Notizen in /src/routes/create/+page.server.js gemäß Listing 9 aktualisiert werden.

Listing 9: Schreiben der eingegebenen Werte in den KV Namespace

   import { redirect } from '@sveltejs/kit';
   
   export const actions = {
     async addNote({ request, platform }) {
       const notesNs = platform.env.NOTES_NAMESPACE;
       const formData = await request.formData();
       const id = Math.random().toString(16).slice(10);
   
       await notesNs.put(
         id,
         JSON.stringify({
           id,
           title: formData.get('title'),
           content: formData.get('content')
         })
       );
   
       redirect(302, '/');
     }
   };

Nach der Bereitstellung dieser Änderungen können innerhalb der App neue Notizen erstellt werden. Wie oben beschrieben, sind die Werte aber nicht immer unmittelbar verfügbar, es kann also bis zu 60 Sekunden dauern, bis die Notiz angezeigt wird.

Fazit

Edge Computing ist aus der Web-Entwicklung heutzutage nicht mehrwegzudenken und gewinnt zunehmend an Verbreitung. Ein Faktor sind sicher die infrastrukturellen Vorteile der globalen Verteilung. Aber auch die Developer Experience, die mit modernen Tools einhergeht, kann als maßgeblicher Aspekt gesehen werden. Plattformen wie Cloudflare Pages und Frameworks wie SvelteKit machen es Webentwickler:innen enorm einfach, eine funktionale App einschließlich der Datenhaltung zu entwickeln und bereitzustellen.

In diesem Artikel wurde lediglich an der Oberfläche gekratzt. Viele Features der verwendeten Tools wurden zwecks Übersichtlichkeit nicht berücksichtigt. Aber auch Bereiche wie das lokale Testen der App vor der Bereitstellung wurden herausgehalten. Insgesamt dürfen Webentwickler:innen aber gespannt sein, was die Zukunft bringt und welche Verbesserungen und Vereinfachungen bevorstehen.

Quellen
  1. Dilley, J. et al., Globally Distributed Content Delivery, 2002
  2. Svelte contributors, SvelteKit • Web development, streamlined, 2023
  3. Red Hat, Inc., Was ist Edge Computing?, 2022
  4. Cloudflare, Inc., Cloudflare Pages, 2024
  5. Cloudflare, Inc., Cloudflare Workers®, 2021
  6. Svelte contributors, Introduction • Docs • SvelteKit, 2024
  7. Web API FormData
  8. Cloudflare Developer Platform
  9. Cloudflare Dashboard Login

Autor
Nils Röhrig

Nils Röhrig

Nils Röhrig ist Softwareentwickler, Redner und Trainer, der sich auf Frontend-Entwicklung mit dem Schwerpunkt Svelte spezialisiert hat.
>> Weiterlesen
Das könnte Sie auch interessieren
Kommentare (0)

Neuen Kommentar schreiben