Führen Sie Ihre Next.js Anwendung auf Fastly aus

Mithilfe unserer neuen next-compute-js-Bibliothek können Sie Ihre Next.js Anwendung jetzt auf unserer Compute@Edge Plattform hosten. Dabei profitieren Sie sowohl vom Programmiererlebnis mit dem Next.js Framework als auch von unserem blitzschnellen, weltweiten Edge-Netzwerk. Sie benötigen nicht einmal einen Origin-Server.

Next.js ist ein beliebtes, auf JavaScript basierendes Server-Framework, das sich hervorragend für Entwickler eignet. Man kann damit für das Frontend in React schreiben und einige der besten, für die Produktivumgebung erforderlichen Funktionen bequem einrichten. Ob statisches oder Server-Side Rendering, Smart Bundling oder Route Prefetching – all dies lässt sich mit kleinstem Konfigurationsaufwand erledigen.

Was ist so toll an Next.js?

Mit Frameworks wie Next.js lassen sich moderne Websites unglaublich einfach entwickeln. Wie leicht, zeige ich Ihnen anhand eines Code-Beispiels, bei dem wir eine React-Komponente programmieren, die „Hallo Welt!“ ausgibt und über das Route-Verzeichnis einer Website bereitgestellt wird. Als erstes benötigen wir Node.js. Erstellen Sie ein Verzeichnis und verwenden Sie npm zur Installation einiger Abhängigkeiten:

mkdir my-app
cd my-app
npm -y init
npm install react react-dom next

Legen wir nun ein paar Verzeichnisse für unsere Inhalte an:

mkdir pages
mkdir public

Als Nächstes erstellen wir unter pages/index.js eine Datei mit der Komponente.

export default function Index() {
  return (
    <div>Hello, World!</div>
  );
};

Jetzt können Sie den Entwicklungsserver starten:

npx next dev

Jetzt müssen Sie nur noch in Ihrem Webbrowser http://localhost:3000/ aufrufen.

01-hello-world

Toll, oder? Vielleicht sieht das nicht besonders beeindruckend aus, aber wir haben gerade eine komplette Entwicklungsumgebung mit React eingerichtet. Mit einer Datei unter pages/index.js rendert der Next.js Server die React Komponente, und ihre Ausgabe wird im Browser angezeigt.

02-index

Ihnen steht jetzt die volle Leistungsfähigkeit von React zur Verfügung. Sie können nutzerdefinierte Komponenten erstellen, bereits geschriebene Komponenten einbinden oder Komponenten von Drittanbietern laden. Sollten Sie Änderungen an der Datei pages/index.js vornehmen, werden diese im laufenden Betrieb geladen, sodass Sie während der Entwicklung sofortiges Feedback in Ihrem Browser erhalten.

Mit Next.js können Sie Ihre Pfade nach Konventionen routen. Wenn Sie Dateien im Dateisystem ablegen, wird die Datei am entsprechenden Ort von Next.js bereitgestellt. Wenn Sie also eine ähnliche Datei unter pages/about.js hinzufügen, wird sie unter http://localhost:3000/about verfügbar. Falls Sie dynamische Segmente in Ihren Pfaden benötigen, ist das auch kein Problem. Erstellen Sie pages/users/[id].js (mit eckigen Klammern im Dateinamen), und die Komponente in dieser Datei erhält ihre ID über die Eigenschaften, die dieser Komponente übermittelt werden. Möchten Sie statische Dateien wie Bilder, Schriftarten oder eine robots.txt-Datei bereitstellen? Legen Sie solche Dateien einfach in dem Verzeichnis public ab und sie werden wie gewohnt bereitgestellt.

Next.js bietet zahlreiche Funktionen: Integrierte CSS-Unterstützung, Layouts, serverseitiges Rendering und MDX-Unterstützung sind nur einige Beispiele, von denen viele nur sehr wenig oder gar keine Konfiguration erfordern. Mit Next.js können Sie sogar API-Routen hinzufügen – Ihre API in JavaScript, die durch Platzieren von JavaScript Dateien unter pages/api/ geroutet wird.

Wenn Sie bereit sind, produktiv zu gehen, erstellen Sie Ihre Website anhand mehrerer Zwischendateien:

npx next build

Damit werden alle für die Ausführung der einzelnen Seiten Ihrer Website erforderlichen Dateien kompiliert und in einem Verzeichnis namens .next abgelegt. Es werden eine Reihe von Optimierungen vorgenommen, darunter auch die Aufteilung des Codes. So wird beim Laden einer bestimmten Seite nur die minimal notwendige Menge an JavaScript an den Browser gesendet. Next.js rendert alle möglichen React Komponenten mithilfe des serverseitigen Renderings schon vorab. Sollten Sie das bereits selbst ausprobiert haben, wissen Sie schon, wie viel Zeit diese Funktion spart. Auf die Details von .next werde ich hier nicht genauer eingehen, aber es ist, kurz gesagt, einfach genial.

06-build

Sobald die Artefakte Ihrer Website erstellt sind, können Sie mit folgendem Code mit der Bereitstellung der Website beginnen:

npx next start

Herzlichen Glückwunsch, Ihre optimierte Website ist jetzt auf einem lokalen Node.js Server eingerichtet und läuft.

07-next start

Wie Sie sehen, ist Next.js für die Ausführung auf einem Node.js Server konzipiert. Wenn Sie auf einige der dynamischen Dynamic-Runtime-Funktionen verzichten können, ist es aber auch möglich, mehrere statische Ausgabedateien mit

<u>next export</u>
zu exportieren. Diese lassen sich anschließend als Dateibündel hochladen, um sie von einem herkömmlichen Webserver aus bereitzustellen. 

Doch wie funktioniert das Ganze mit Fastly? Wir bieten zwar keinen traditionellen Webserver an, Sie können aber natürlich auch statische Websites über Fastly bereitstellen (aufregende Neuigkeiten dazu in Kürze!). Wir verwenden Wasm Binärdateien, die Sie aus JavaScript kompilieren können. Heißt das, man kann den von Next.js generierten Output bereitstellen und gleichzeitig die serverseitigen Komponenten auf der Edge mit Compute@Edge ausführen? Ja, das geht tatsächlich!

Wir präsentieren: @fastly/next-compute-js

Lernen Sie den jüngsten Neuzugang zu unserer wachsenden Bibliothek an Entwickler-Tools kennen. next-compute-js bietet eine Kombination aus Projektstrukturierung und einer Next.js Runtime-Umgebung für unsere Compute@Edge Plattform. Dazu wird mit genau denselben Artefakten gearbeitet, die mit dem Befehl „next build“ erstellt wurden. Es werden alle Funktionen der Next.js Runtime-Umgebung geboten – mit Ausnahme der von der Vercel Edge-Laufzeitumgebung abhängigen Elemente, für die man derzeit noch eine komplette Node.js Runtime-Umgebung braucht.

Zudem ist next-compute-js besonders nutzerfreundlich. Nun aber weiter mit unserem obigen Beispiel. Nachdem Sie „next build“ ausgeführt haben, sollte jetzt ein .next-Verzeichnis vorhanden sein. Führen Sie next-compute-js wie folgt aus:

npx @fastly/next-compute-js

Der Output zeigt an, dass eine Compute@Edge Anwendung in einem neuen Verzeichnis unter compute-js initialisiert wird. Die Abhängigkeiten werden installiert und ein paar Augenblicke später kehren Sie zur Eingabeaufforderung zurück.

08-npx next-compute-js

Versuchen wir, dies auf dem Fastly Entwicklungsserver auszuführen. Vorausgesetzt, Sie haben die Fastly CLI installiert, führen Sie einfach den Befehl „fastly compute serve“ aus:

cd compute-js
fastly compute serve

Das war’s schon! Ihre Next.js Anwendung läuft jetzt als Compute@Edge Anwendung – allerdings immer noch lokal. Und wie lässt sich das Ganze auf die Produktivumgebung übertragen? Ganz einfach – mit dem Befehl „fastly compute publish“:

# This is equivalent to 'vercel deploy --prebuilt'
# if you were deploying to Vercel.
cd compute-js
fastly compute publish
10-publish

Ich empfehle Ihnen, die folgenden Zeilen in den Skriptabschnitt der Datei package.json Ihres Next.js Projekts einzufügen, damit Sie die Befehle zum Erstellen, Testen und Bereitstellen Ihres Next.js Projekts jederzeit zur Hand haben:

{
  "scripts": {
    "fastly-serve": "next build && cd compute-js && fastly compute serve",
    "fastly-publish": "next build && cd compute-js && fastly compute publish"
  }
}

Weitere Schritte sind mit diesem einfachen Tool nicht erforderlich.

Entwickeln Sie wie gewohnt mit next dev. Testen Sie mit npm run fastly-serve und stellen Sie anschließend die Anwendung mit npm run fastly-publish in der Cloud bereit.

Moment! Braucht man denn keinen Origin-Server?

Nein, der Origin-Server entfällt! next-compute-js packt Ihr gesamtes .next-Verzeichnis als Teil Ihrer Wasm Binärdatei. Sämtliche Inhalte sind weltweit über die Ihren Besuchern geografisch am nächsten gelegenen Fastly POPs verfügbar. Dabei ist kein Origin-Server für die Next.js Anwendung notwendig. Somit bietet diese Lösung beides: ein großartiges Programmiererlebnis für Entwickler und eine hochperformante Produktivumgebung.

Weitere Informationen zur Funktionsweise finden Sie in dieser nutzerdefinierten Implementierung der NextServer Klasse, die von Next.js bereitgestellt wird und die entsprechenden Dateien aus der Wasm Binärdatei lädt.

Welche Funktionen von Next.js werden unterstützt?

Praktisch alle wichtigen Funktionen sind verfügbar:

  • Routing von statischen Dateien

  • Statische und dynamische geroutete React Seiten

  • Router, imperatives Routing, flaches Routing, Link

  • Statische Generierung ohne Daten

  • Serverseitige Generierung mit statischen Eigenschaften bzw. Pfaden

  • Serverseitiges Rendering mit serverseitigen Eigenschaften

  • Clientseitiges Abrufen und SWR

  • Integriertes CSS bzw. integrierte CSS-Module

  • Komprimierung (gzip)

  • E-Tag-Generierung

  • Header, Rewrites, Redirects, internationales Routing

  • Layouts

  • Schriftartenoptimierung

  • MDX

  • Individuelle Anpassung von App, Dokument und Fehlerseite

  • API-Routen und -Middleware

Die folgenden Funktionen werden noch nicht unterstützt, sind aber in Entwicklung:

  • Image Optimizer

  • Vorschaumodus

Aufgrund der Plattformunterschiede ist derzeit nicht geplant, die folgenden Funktionen zu unterstützen (aber man sollte niemals „nie“ sagen):

  • Edge-API-Routen und Edge-API-Middleware

  • Stufenweise statische Regeneration

  • Dynamisches Importieren

Und was ist mit API-Routen?

Ja, sogar API-Routen werden unterstützt. Mit Next.js können wir APIs in JavaScript schreiben und sie über die Pfadverzeichnisse zur Verfügung stellen, genau wie Sie es mit Seiten tun würden.

Probieren wir es aus! Fügen Sie Ihrem Projekt eine Datei unter pages/api/hello/[name].js (mit eckigen Klammern im Dateinamen) hinzu:

export default function handler(req, res) {
  const { name } = req.query;
  res.statusCode = 200;
  res.end(JSON.stringify({message: `Hello, ${name}!`}));
}

Führen Sie nach dem Hinzufügen das Programm aus:

npm run fastly-serve

Rufen Sie nun http://127.0.0.1:7676/api/hello/World auf. Sie sehen Folgendes:

{"message": "Hello, World!"}

Sie sehen, dass die URL zum Aufrufen der API direkt dem Pfad der Datei zugeordnet und der Wert des dynamischen Segments [name] über das Objekt req.query zugänglich ist. So einfach geht das.

Sollten Sie sich über die Request- und Response-Objekte wundern, die an den API-Route-Handler übergeben werden: Wir verwenden @fastly/http-compute-js, um Ihnen req- und res-Objekte im Node.js Stil zur Verfügung zu stellen, und erweitern diese dann mit den API Route Request Helpers. Auf diese Weise lassen sich diese Handler so schreiben, dass sie mit next dev kompatibel sind. Die Stream-Schnittstelle des req-Objekts ist mit dem Textkörper-Stream der Compute@Edge Anfrage verbunden. Sobald der Handler den Output an das res-Objekt gesendet hat, werden die gesendeten Daten zusammen mit den Kopfzeilen und dem Statuscode in ein Response-Objekt gepackt. Dieses kann dann von Compute@Edge bedient werden.

Damit und mit all den anderen unterstützten Funktionen von Next.js ist Compute@Edge eine überzeugende Plattform für Ihre Next.js Anwendungen.

Ein neues Zuhause für Ihre Next.js Anwendungen

Das Ergebnis ist eine nahtlose Integration von Next.js in Compute@Edge: Sie können Ihre Next.js Anwendungen jetzt ohne Origin-Server auf Compute@Edge hosten. Profitieren Sie bei der Entwicklung von den fantastischen Funktionen von Next.js. Nutzen Sie anschließend Compute@Edge, die schnellste Edge-Computing-Plattform auf dem Markt, für weltweite Präsenz und zur Bereitstellung in der Produktivumgebung.

Im nächsten Blogpost werfen wir einen Blick auf @fastly/compute-js-static-publish. Dabei handelt es sich um eines der Tools, die wir hier kurz erwähnt haben und mit denen Sie ganze statische Websites von der Edge aus bereitstellen können.

Wir bei Fastly arbeiten weiter an der Entwicklung von Tools, mit denen Sie noch mehr Code auf der Edge ausführen und schneller entwickeln können. Gleichzeitig wollen wir die Verwendung einer breiteren Auswahl an Tools ermöglichen. Wir würden gerne erfahren, ob Sie diese Tools nutzen und was Sie damit machen. Schreiben Sie uns auf Twitter und lassen Sie es uns wissen!

Katsuyuki Omuro
Senior Software Engineer, Developer Relations
Veröffentlicht am

Lesedauer: 6 Min.

Sie möchten sich mit einem Experten austauschen?
Sprechen Sie mit einem Experten
Diesen Beitrag teilen
Katsuyuki Omuro
Senior Software Engineer, Developer Relations

Katsuyuki („Kats“) Omuro ist ein in Japan tätiger Developer und Echtzeit-Web-Enthusiast aus dem Developer Relations Team. Er tüftelt Dinge leidenschaftlich gerne aus und teilt sein Wissen mit anderen, um sie beim Lernen und der Weiterentwicklung zu unterstützen.

Sie möchten loslegen?

Setzen Sie sich mit uns in Verbindung oder erstellen Sie einen Account.