– Es ist nicht das serverseitige Rendering.

Nathan Sebhastian
Jan 6 – 6 min read

Das Jahr 2020 war eine verrückte Fahrt für uns alle. Zum Jahresende hat das React Team vor kurzem spannende Forschungen zu einer neuen Art und Weise angekündigt, React-Apps mit React Server Components zu erstellen.

Bitte bedenken Sie, dass React Server Components noch in der Entwicklung ist und noch nicht für die Produktion empfohlen wird. Das Feature ist völlig optional und Sie können Ihre Komponente immer noch so schreiben, wie Sie es heute tun.

Sie können sich den einstündigen Vortrag und die Demo hier ansehen, aber hier ist ein 5-minütiger Leitfaden, der die wichtigsten Punkte hervorhebt und erklärt.

Wenn Sie außerdem neugierig darauf sind, wie die neuen Komponenten von React in zukünftigen Designsystemen eine Rolle spielen, empfehle ich Ihnen folgende Lektüre:

React Server Component ist eine Möglichkeit, React-Komponenten zu schreiben, die serverseitig gerendert werden, um die Leistung von React-Anwendungen zu verbessern.

Eines der Probleme, mit denen man bei der Entwicklung von Anwendungen mit React konfrontiert wird, ist die übliche hohe Anzahl von Netzwerkanfragen, während die Benutzer darauf warten, dass die von ihnen angeforderten Seiten/Daten verfügbar werden:

Das Abrufen von Daten mit useEffect führt zu einer Verzögerung sinnvoller Interaktion

Der heute übliche Ansatz zum Abrufen von Daten ist beispielsweise der Aufruf von APIs über den useEffect Hook:

useEffect(() => {
axios.get("URL HERE")
.then((response) => {
// set data into state setData(response.data);
})
.catch((error) => {
console.log(error);
});
}, );

Auch wenn daran nichts auszusetzen ist, kostet dieser Datenabruf immer etwas Zeit, um etwas Sinnvolles für den Benutzer zu erstellen.

Das andere Problem ist natürlich die Größe der Pakete. Minification, Code-Splitting, Eliminierung von totem Code sind einige Beispiele für Methoden, die verwendet werden, um die Bundle-Größe von React-Anwendungen zu reduzieren. Und warum? Weil eine große Paketgröße Zeit zum Herunterladen benötigt. Nicht jeder hat Zugang zu einem schnellen Gerät und schnellem Internet:

React-Bundle-Problem

React-Server-Komponenten helfen dabei, die beiden oben genannten Probleme zu lösen und vieles mehr.

Wie React Server Components funktionieren

Da sich React Server Components noch in der experimentellen Phase befindet, können sich die Implementierungsdetails dieses Features noch ändern. Dennoch können Sie sich einige der Kernkonzepte aneignen, indem Sie sich die Demo ansehen.

Das erste, was auffällt, ist, dass es mehrere Pakete mit einer experimentellen Version in der package.json-Datei gibt:

"react": "0.0.0-experimental-3310209d0",
"react-dom": "0.0.0-experimental-3310209d0",
"react-fetch": "0.0.0-experimental-3310209d0",
"react-fs": "0.0.0-experimental-3310209d0",
"react-pg": "0.0.0-experimental-3310209d0",
"react-server-dom-webpack": "0.0.0-experimental-3310209d0",

Die react , react-dom und react-server-dom-webpack verwenden eine experimentelle Version, die die React Server Component ermöglicht, während react-fetch , react-fs und react-pg eine Gruppe von Wrapper-Paketen sind, die für die Interaktion mit dem Input/Output-System verwendet werden (Sie werden React IO Libraries genannt)

Der nächste Punkt ist, dass diese Demo von Express.js betrieben wird, was Sinn macht, weil man einen Server braucht, um die Komponenten zu rendern. Aber das wirft auch die Frage auf: Bedeutet das, dass Server-Komponenten nur in einer JavaScript-Umgebung funktionieren? Was ist mit Go, Java und anderen serverseitigen Umgebungen?

Möglicherweise werden wir in Zukunft Unterstützung für andere Umgebungen sehen, also lassen wir diesen Punkt erst einmal beiseite.

Natürlich können sich all diese Implementierungsdetails in Zukunft ändern, wenn die Forschung voranschreitet.

Wenn man sich den Code im Ordner src/ ansieht, kann man drei Arten von Erweiterungen für die Komponentendateien erkennen:

  • .server.js Die Erweiterung weist auf Server-Komponenten hin
  • .client.js Die Erweiterung weist auf React-Client-Komponenten hin
  • Die reguläre .js Erweiterung ist für gemeinsame Komponenten. Diese Komponenten können auf dem Server oder dem Client ausgeführt werden, je nachdem, wer sie importiert.

Wenn Sie die Anwendung mit dem Befehl npm start starten, werden zwei Aufgaben gleichzeitig ausgeführt:

  • Der Node-Server, der mit dem Skript server/api.server.js ausgeführt wird
  • Der Webpack-Build für das clientseitige React-Bundle, der mit dem Skript scripts/build.js ausgeführt wird

Bei einem Blick auf das Server-Skript können Sie sehen, dass app.server.js in die Datei importiert wird:

const ReactApp = require('../src/App.server').default;

Und später als Node Writable Stream verarbeitet wird:

const {pipeToNodeWritable} = require('react-server-dom-webpack/writer');async function renderReactTree(res, props) {
await waitForWebpack();
const manifest = readFileSync(
path.resolve(__dirname, '../build/react-client-manifest.json'),
'utf8'
);
const moduleMap = JSON.parse(manifest);
pipeToNodeWritable(React.createElement(ReactApp, props), res, moduleMap);
}

Der Code unter der .server.js-Erweiterung einschließlich seiner Abhängigkeiten ist nicht im Client-Bundle enthalten, was bedeutet, dass er keinen Einfluss auf die Bundle-Größe hat.

Server-Komponenten haben direkten Zugriff auf die Datenbank oder das Dateisystem auf dem Server, so dass Sie alle Daten, die Sie benötigen, abholen und beim ersten Rendering an den Client senden können. Sie können das Beispiel in der NoteList.server.js Datei sehen:

export default function NoteList({searchText}) {const notes = db.query(
`select * from notes where title ilike order by id desc`,

).rows;
return notes.length > 0 ? (
<ul className="notes-list">
{notes.map((note) => (
<li key={note.id}>
<SidebarNote note={note} />
</li>
))}
</ul>
) : (
<div className="notes-empty">
{searchText
? `Couldn't find any notes titled "${searchText}".`
: 'No notes created yet!'}{' '}
</div>
);
}

Server Komponenten können keine Interaktivität haben, was bedeutet, dass Sie keine useState oder Listener auf der Server-Seite erstellen können. Man muss Zustände auf der Client-Seite setzen und sie von den Server-Komponenten importieren.

Server-Komponenten werden mit Daten vom Server geladen

Was ist der Vorteil von React Server Component?

  • Server-Komponenten sind nicht im Bundle enthalten. Sie werden nie vom Browser heruntergeladen und haben keinen Einfluss auf die Bundle-Größe
  • Sie können die Bundle-Größe reduzieren, indem Sie statische, reine Rendering-Komponenten auf die Server-Seite verlagern und die interaktiven, zustandsabhängigen Komponenten auf der Client-Seite belassen
  • Server-Komponenten können auf Server-seitige Ressourcen zugreifen. Sie können Daten direkt aus der Datenbank oder dem Dateisystem abrufen, und sie können auch von APIs abrufen, genau wie auf der Client-Seite
  • Server-Komponenten können auch GraphQL-Abfragen lesen

Wie unterscheidet sich das vom Server Side Rendering?

SSR, wie es heute in React-Anwendungen funktioniert, sendet einfach Komponenten, die als HTML gerendert werden, an den Client, damit Ihre App eine schnelle Antwort zu haben scheint. Der Benutzer kann nichts mit Ihrer Anwendung tun, bis das JavaScript heruntergeladen ist.

React Server Components ist anders. Wie in der Demo gezeigt, werden die Serverkomponenten nicht als HTML gerendert, sondern in einem speziellen Format, das in den Client gestreamt wird. Für den Stream gibt es noch kein Standardprotokoll, aber er sieht dem JSON-Format sehr ähnlich. Hier ist ein Teil der Antwort:

M1:{"id":"./src/SearchField.client.js","chunks":,"name":""}

Während SSR nur einmal für das anfängliche Rendering verwendet wird, können Server Components mehrere Male erneut abgerufen werden, um die Daten (im Fall der Demo die Markdown-Posts) erneut zu rendern.

Fazit

React Server Components ist ein neues, aufregendes Feature, das die Art und Weise verändern kann, wie Entwickler ihre React-Anwendungen schreiben. Es ermöglicht React-Anwendungen, Pakete zu importieren, ohne die Größe des Client-Bundles zu beeinflussen, und so eine statische Repräsentation der Anwendung zu erstellen, die durch die Verwendung von Client-Komponenten interaktiv gemacht werden kann.

Entwickler können auch sowohl Server-Komponenten als auch Client-Komponenten unter einem einzigen DOM-Baum verwenden, was es ermöglicht, Server-Komponenten erneut abzurufen, ohne den Zustand der Client-Komponenten zu zerstören.

Da diese Funktion jedoch noch experimentell ist, ist es schwer zu bestimmen, wie nützlich sie in der freien Wildbahn wirklich sein wird. Zum einen kann diese Funktion derzeit nur in der Node.js-Serverumgebung verwendet werden.

Das React-Team konzentriert sich derzeit darauf, diese Funktion in Meta-Frameworks wie Next.js und Gatbsy zu integrieren, was bedeutet, dass es noch einige Zeit dauern könnte (wenn überhaupt), bis wir Unterstützung für andere serverseitige Sprachen wie PHP, Python, Go oder Ruby sehen.

Zusammenfassend lässt sich sagen, dass clientseitiges React nicht verschwindet. Serverseitiges React ist optional.

Auch habe ich meine Gedanken zu Should you create a design system for React Server Components? geteilt, was Sie interessieren könnte.

Articles

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.