Es gab Witze nach dem Urlaub, dass JavaScript sich für Server-Side Rendering entschieden hat. Ich glaube, das wurzelte in
- Die Basecamp-Gang veröffentlicht Hotwire, was wie Marketing-Glamour für eine Kombination von Technologien wirkt. „HTML über das Draht“, sagen sie, was bedeutet, dass der Server HTML generiert und ausliefert und die clientseitige JavaScript-Logik den Aufgaben überlässt, die nur clientseitige JavaScript-Logik bewältigen kann.
- Die React-Gang mit Introducing Zero-Bundle-Size React Server Components, was meiner Meinung nach der erste Schritt des Kernprojekts in Richtung Server-Side-Anything ist.
Ich bin ganz Ohr für Marketing-Hype, aber es ist erwähnenswert, dass dies nur frische Ansätze für bereits solide (wenn ich es wagen darf, *alte*) Ideen sind.
Turbo („Das Herzstück von Hotwire“) ist eine Weiterentwicklung von Turbolinks, was eine äußerst einfache Grundidee ist: Klicks auf interne Links abfangen. Anstatt dass der Browser die Seite komplett neu lädt, wird der Inhalt der neuen Seite per fetch geladen, an Ort und Stelle eingefügt und die URL mittels History.pushState() aktualisiert. Nun hat man das Gefühl einer Single Page App, ohne eine SPA erstellt zu haben. Das ist äußerst praktisch, wenn man seine App bereits in Rails mit ERB-Vorlagen erstellt hat.
Aber ist das wirklich effizient? Nun, bisher war es nicht besonders beliebt. Die Denkweise war, dass das *Netzwerk* der Engpass ist, also lassen wir so wenig wie möglich über das Netzwerk senden. „So wenig wie möglich“ bedeutet normalerweise JSON. Wenn man JSON auf dem Client erhält, benötigt man nun ein Vorlagensystem auf dem Client, um es in nutzbaren DOM umzuwandeln. Mit dieser Technik zahlt man zwei Kosten: 1) das Laden einer clientseitigen Bibliothek 2) die Daten-zu-DOM-Verarbeitung. Wenn man „HTML über das Draht“ sendet, zahlt man keine dieser Kosten (schneller), sendet aber theoretisch größere Datenpakete über das Netzwerk (langsamer), was davon ausgeht, dass HTML schwerer ist als JSON, was... fragwürdig ist.
Also... *es kommt darauf an*. Es hängt davon ab, wie groß die Datenpakete sind und was damit geschehen soll.
Man würde erwarten, dass die React-Meinung lautet: Auf jeden Fall den Client nutzen. Aber das stimmt nicht mit der neuen Vorschau auf serverseitige Komponenten überein. Das Video macht überdeutlich: Das „Rendern“ der Komponenten auf dem Server ist schneller, besonders in verschachtelten Komponentensituationen, in denen viele der Komponenten für das Abrufen ihrer eigenen Daten verantwortlich sind. Was kommt dann über das Netzwerk? Ist es DOM-fertiges HTML? Hier nicht. Aus einem kurzen Blick auf das Video scheint die Netzwerkantwort ein proprietäres Format¹ zu sein, das eine React-Komponente beschreibt. Das scheint wichtig zu sein, da es bedeutet, dass das clientseitige JavaScript-Bundle diese Komponente überhaupt nicht enthält und Zustand² hin und her geschickt werden kann. Lauren Tan macht im Video auch klar: Das ist *so etwas wie* SSR, aber unterschiedlich von dem, wie etwas wie Next.js heute SSR macht. Und der Punkt ist, das Next.js von morgen weitaus besser zu machen.
Also: **Server**. Sie sind einfach gut darin, bestimmte Dinge zu tun (sagt der Typ, der in seinen WordPress-Blog tippt). Es scheint tatsächlich eine gewisse Dynamik dahin zu geben, weniger auf dem Client zu tun, was meiner Meinung nach die meisten von uns zustimmen würden, dass es in letzter Zeit ein wenig zu viel geworden ist, wobei die Asset-Größen immer weiter wachsen.
Lassen Sie uns diese Server an den Rand schieben, während wir schon dabei sind.
- Es ist ein proprietäres Format. Man sagt mir, es sei wie „JSON mit Löchern“, also Stücke von JSON, die durch Leerzeilen voneinander getrennt sind. Aber während das Format eine geringe Rolle spielt, weil man vielleicht aus Debugging-Gründen Netzwerk-Anfragen inspizieren muss, spricht hier React mit React, es ist keine offene API, bei der das Format viel wichtiger wäre.
- Der Haupt-„Zustand“, der übermittelt wird, ist so etwas wie die aktuelle Route. Man sagt mir, man schickt so wenig wie möglich an den Server. Der Server hält keinen Zustand.
Oh ja. Bitte. Ihr habt 10 Jahre gebraucht, um zu erkennen, dass wir uns in die falsche Richtung bewegen, aber HURRA.
Ich habe mich gegen diesen gesamten Move-everything-to-client-js-Ding aus viel grundlegenderen Gründen wie progressive enhancement gewehrt, aber hey, was diesen Wahnsinn stoppt, ist mir recht.
(Und nein – bitte lasst den nächsten Hype nicht CDN EVERYTHING!!1 sein)
Du magst keine CDNs?
Auf der anderen Seite, wenn Sie einen Nicht-Web-Client (z. B. mobil) erstellen müssen, haben Sie möglicherweise all diese praktischen APIs zur Datenbeschaffung verloren, da Sie diese nicht zur Unterstützung Ihrer SPA erstellt haben.
Das stimmt nicht ganz, oder? Ich würde argumentieren, dass man in einem gut gestalteten System Controller einfügen könnte, die Ihre bestehenden Dienste nutzen, um eine API bereitzustellen.
Auch diese SSRs verwenden dieselbe API auf dem Server, sodass diese intakt bleibt...
Was ich will, ist
komponentengetriebene Entwicklung mit JSX (und TypeScript)
statisch/servergeneriertes HTML
dynamische Komponentenwiederverwendung auf dem Client
nur dynamische Komponenten an den Browser liefern (hier scheitern Next/Gatsby etc., sie senden statische Inhalte zweimal, einmal als HTML, dann als JS/JSON, und verursachen die zusätzlichen Kosten der Rehydrierung); es gibt viel gute Arbeit in diesem Bereich, einschließlich Microsite, das ich gerade benutze (und seit heute dazu beitrage); Server Components können das wahrscheinlich auch leisten
Build-Tools, die den statisch/dynamischen Unterschied zu einem erstklassigen Konzept machen, indem sie entsprechende Konfigurations-APIs bereitstellen
dynamische Client-Implementierungen, die den statisch/dynamischen Unterschied zu einem erstklassigen Konzept machen, indem sie entsprechende Laufzeit-APIs bereitstellen
Compiler, die den statisch/dynamischen Unterschied mit statischer Analyse automatisieren können; Marko macht bereits *all das* außer der Unterstützung für JSX
html {Server: js
}
Ihr solltet alle AureliaJs ausprobieren.
Ich liebe HTML, CSS und JavaScript. Es ist mein Glaube, dass sie jede und die meisten Benutzeroberflächenanwendungen bewältigen können.
Das gesagt, ist es nicht einfach, den Zustand zu verwalten, ein oder zweiseitige Bindungen zu haben, einfache Routen usw.
Aurelia kommt hierher, es bietet genau das, auf eine KISS-Art und Weise. Ich mache tatsächlich HTML, CSS & JS und Aurelia ist überhaupt nicht aufdringlich und ist äußerst praktisch, während es mir erlaubt, den Geist dessen zu bewahren, was ich gerne tue. (Kein HTML in JS-seltsames Zeug, einfache Zustandsverwaltung, schöne Komponenten).
Fügen Sie hinzu, dass Sie leicht Pug, Sass und TypeScript verwenden können, wenn Sie es vorziehen, einfach, am einfachsten.
Sie machen kein Aurelia, sie wollen keinen Platz wegnehmen, sie wollen verschwinden und Sie das tun lassen, was Sie lieben.
https://aurelia.io/
(Es ist auch Open Source, es gibt keine GAFAM dahinter oder irgendein Big Tech ;)).
Halten Sie das Web offen, transparent und schön
Sie gehen davon aus, dass das Rendern auf dem Server schneller ist, das stimmt nur, wenn Sie dort über ausreichende Rechenressourcen verfügen, dies muss jedoch nicht der Fall sein.
Der ursprüngliche Server kann stark überlastet sein, wenn die gesamte Berechnung dorthin geht. Die Antwort muss also der Edge-Server sein. Sie müssen jedoch ein gutes CDN für eine gute Edge-Verteilung verwenden und dann den Edge-Server vom CDN-Anbieter selbst verwenden.
Nehmen wir an, es ist Cloudflare. Der Edge-Server muss also ein Cloudflare Worker sein. CF gibt an, dass sie skalieren, was gut ist. Sie skalieren jedoch zu einem Preis. Sie müssen pro Anfrage bezahlen, wenn Sie das tägliche oder monatliche Limit überschreiten, obwohl es bereits das billigste ist, das ich mir vorstellen kann.
Und seien wir realistisch. Cloudflare ist keine Magie. Es betreibt seinen eigenen Cluster am Edge und hat seine eigene Kapazität. Es wird niemals ausreichen, wenn jede darauf laufende Website vollständig serverseitig gerendert wird.
Wenn Sie es jedoch rein auf der Client-Seite tun, können Sie Ihr Frontend rein statisch halten. Keine Berechnung auf dem Server bedeutet, dass Ihre ursprünglichen Server und Edge-Server glücklicher sind, daher sind Sie glücklicher und schließlich sind Ihre Benutzer glücklicher.
Und noch etwas ist, dass Edge-Server langsam sind. Cloudflare Worker sind im Vergleich zu Benutzergeräten streng langsam. Sie haben wahrscheinlich eine Multi-Core-, nicht schlechte CPU und wahrscheinlich eine brauchbare GPU und ausreichend Speicher: obwohl er nicht ganz für Sie verfügbar ist. Aber an den Edge-Servern, nun, Sie wissen, wie schlecht es ist.
Das Gegenteil ist der Fall.
@Chris Coyier
Für E/A-gebundene Aufgaben stimme ich zu, dass CF-Worker schneller sein können, da sie Daten aus dem CF-Cache und CF-KV schneller abrufen können. Und sie können den Originalserver normalerweise schneller erreichen.
Aber für rechenintensive Aufgaben sind Benutzergeräte schneller, und Sie können mit CF-Workern nicht einmal effektiv rechnen, da diese 128 MB-50 ms haben.
Aber serverseitiges Rendering hat seine eigenen Nachteile
* Wenn Sie es ohne clientseitiges Rendering tun, haben Sie eine nicht so langsame erste Ladezeit, aber eine nicht so schnelle zweite Ladezeit.
* Wenn Sie beides tun, haben Sie eine schnelle erste und eine schnelle zweite Ladezeit, aber Sie laden bei der ersten Ladezeit alles zweimal herunter.
Mit
link: preload(und link[rel=“preload“] und Caching wie Service Worker) anstelle all dieser SSRs haben Sie* schnelle erste Ladezeit, so schnell wie Ihre SSR, wenn Sie Server-Push nutzen können, und andernfalls nur einen zusätzlichen Roundtrip.
* schnelle zweite Ladezeit, schneller als alles andere ohne Preloading.
* minimieren Sie den Download
* und Sie behalten die Berechnung auf der Client-Seite: Sie zahlen weniger, und Ihr Benutzer wird sich an diesen 128 MB-50 ms nicht stören.