Ein umfassender Leitfaden zu React Suspense für effektives Ladezustandsmanagement, zugeschnitten auf internationale Entwickler und globales Anwendungsdesign.
React Suspense: Ladezustands-Koordination für ein globales Publikum meistern
In der heutigen vernetzten digitalen Landschaft ist die Bereitstellung nahtloser Benutzererlebnisse von größter Bedeutung. Für Entwickler, die Anwendungen für ein globales Publikum erstellen, bedeutet dies oft, die Komplexität asynchroner Operationen wie Datenabruf, Code-Splitting und dynamisches Laden von Komponenten zu bewältigen. Traditionell war die Verwaltung von Ladezuständen für diese Operationen eine fragmentierte und oft sich wiederholende Aufgabe, die zu unübersichtlichem Code und inkonsistenten Benutzeroberflächen führte. React Suspense, eine bahnbrechende Funktion, die vom React-Team eingeführt wurde, zielt darauf ab, die Art und Weise, wie wir mit diesen asynchronen Szenarien umgehen, zu revolutionieren und einen deklarativen und einheitlichen Ansatz zur Ladezustands-Koordination zu bieten.
Dieser umfassende Leitfaden befasst sich mit den Feinheiten von React Suspense, untersucht seine Kernkonzepte, praktischen Anwendungen und die Vorteile, die es Entwicklern weltweit bietet. Wir werden untersuchen, wie Suspense den Datenabruf vereinfacht, das Code-Splitting verbessert und zu einem leistungsfähigeren und angenehmeren Benutzererlebnis beiträgt, was besonders wichtig ist, wenn unterschiedliche internationale Benutzerbasen mit unterschiedlichen Netzwerkbedingungen und Erwartungen bedient werden.
Grundlegendes zu den Kernkonzepten von React Suspense
Im Kern ist React Suspense ein Mechanismus, der es Komponenten ermöglicht, die Darstellung zu "suspendieren", während auf den Abschluss asynchroner Operationen gewartet wird. Anstatt Ladesymbole oder bedingte Darstellungen innerhalb jeder Komponente manuell zu verwalten, ermöglicht Suspense eine deklarativere Definition von Fallback-UIs auf höherer Ebene. Das bedeutet, dass Sie React mitteilen können: "Während diese Komponente Daten abruft, zeige diesen Platzhalter an."
Die grundlegenden Bausteine von React Suspense sind:
- Suspense Component: Dies ist die primäre API für die Verwendung von Suspense. Sie umschließt Komponenten, die möglicherweise suspendieren, und bietet eine
fallback
-Prop. Dieser Fallback kann ein beliebiger React-Node sein, typischerweise ein Ladesymbol oder ein Skeleton Screen, der angezeigt wird, während die umschlossene Komponente 'suspendiert' ist. - Readables: Dies sind spezielle Objekte, die asynchrone Daten darstellen. Wenn eine Komponente versucht, von einem Readable zu lesen, das noch nicht bereit ist, wirft sie ein Promise. Suspense fängt dieses Promise ab und zeigt die Fallback-UI an.
- Resource: Dies ist die moderne Abstraktion für die Verwaltung asynchroner Daten in Suspense. Ressourcen sind Objekte, die eine
read()
-Methode bereitstellen. Wennread()
aufgerufen wird und die Daten noch nicht verfügbar sind, wirft sie ein Promise, das Suspense abfangen kann.
Das Schöne an diesem Ansatz liegt in seiner deklarativen Natur. Sie sagen React nicht imperativ wie ein Ladezustand angezeigt werden soll; Sie sagen ihm deklarativ was angezeigt werden soll, wenn eine asynchrone Operation ausgeführt wird. Diese Trennung der Zuständigkeiten führt zu saubererem und wartungsfreundlicherem Code.
Suspense für Datenabruf: Ein Paradigmenwechsel
Eine der bedeutendsten Fortschritte, die Suspense bringt, betrifft den Datenabruf. Vor Suspense umfassten gängige Muster:
- Verwendung von
useEffect
mituseState
, um Lade-, Fehler- und Datenzustände zu verwalten. - Implementierung von benutzerdefinierten Hook-Factories oder Higher-Order Components (HOCs), um die Datenabruflogik zu abstrahieren.
- Verlassen auf Bibliotheken von Drittanbietern, die oft ihre eigenen Muster zur Verwaltung des Ladezustands hatten.
Diese Methoden waren zwar funktional, führten aber oft zu Boilerplate-Code und einem verteilten Ansatz zur Behandlung asynchroner Daten. React Suspense bietet in Kombination mit Datenabrufbibliotheken, die sein Modell unterstützen (wie Relay und die aufkommende React Query Suspense-Integration), eine optimiertere Erfahrung.
Wie es mit dem Datenabruf funktioniert
Stellen Sie sich eine Komponente vor, die Benutzerprofildaten abrufen muss. Mit Suspense:
- Eine Resource definieren: Sie erstellen eine Resource, die die Datenabruflogik kapselt. Die
read()
-Methode dieser Resource gibt entweder die Daten zurück oder wirft ein Promise, das mit den Daten aufgelöst wird. - Mit Suspense umschließen: Die Komponente, die die Daten abruft, wird von einer
<Suspense>
-Komponente umschlossen, wobei einefallback
-Prop die UI definiert, die während des Ladens der Daten angezeigt werden soll. - Daten lesen: Innerhalb der Komponente rufen Sie die
read()
-Methode der Resource auf. Wenn die Daten noch nicht verfügbar sind, wird das Promise geworfen und dieSuspense
-Grenze rendert ihren Fallback. Sobald das Promise aufgelöst ist, wird die Komponente mit den abgerufenen Daten erneut gerendert.
Beispiel:
<!-- Assume 'userResource' is created with a fetchUser function -->
<Suspense fallback={<LoadingSpinner />}>
<UserProfile userId="123" />
</Suspense>
function UserProfile({ userId }) {
const user = userResource.read(userId); // This might throw a promise
return (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
);
}
Dieses Muster zentralisiert die Verwaltung des Ladezustands effektiv an der Suspense-Grenze und nicht innerhalb der UserProfile
-Komponente selbst. Dies ist eine deutliche Verbesserung der Wartbarkeit und Lesbarkeit.
Suspense für Code-Splitting: Verbesserung der anfänglichen Ladezeiten
Code-Splitting ist eine entscheidende Optimierungstechnik für moderne Webanwendungen, insbesondere solche, die sich an ein globales Publikum richten, bei dem die Netzwerklatenz erheblich variieren kann. Durch das Aufteilen des Codes Ihrer Anwendung in kleinere Chunks können Sie die anfängliche Payload-Größe reduzieren, was zu schnelleren anfänglichen Seitenladezeiten führt. Reacts React.lazy
und React.Suspense
arbeiten Hand in Hand, um das Code-Splitting deklarativer und benutzerfreundlicher zu gestalten.
Deklaratives Code-Splitting mit React.lazy
React.lazy
ermöglicht es Ihnen, eine dynamisch importierte Komponente als reguläre Komponente zu rendern. Es benötigt eine Funktion, die einen dynamischen import()
aufrufen muss. Das importierte Modul muss eine Standardkomponente exportieren.
const LazyComponent = React.lazy(() => import('./LazyComponent'));
Wenn eine mit React.lazy
erstellte Komponente zum ersten Mal gerendert wird, wird sie automatisch suspendiert, wenn sie noch nicht geladen wurde. Hier kommt React.Suspense
ins Spiel.
Integrieren von React.lazy
mit Suspense
Sie können Ihre Lazy-Loaded-Komponenten mit einer <Suspense>
-Komponente umschließen, um eine Fallback-UI bereitzustellen, während der Code der Komponente abgerufen und geparst wird.
<Suspense fallback={<LoadingIndicator />}>
<LazyComponent />
</Suspense>
Dieses Muster ist unglaublich leistungsstark für die Erstellung komplexer UIs, die Abschnitte von Inhalten bei Bedarf laden können. In einer E-Commerce-Plattform für internationale Kunden könnten Sie beispielsweise das Checkout-Modul erst Lazy-Loaden, wenn der Benutzer zur Kasse geht, oder länderspezifische Funktionen erst laden, wenn das Gebietsschema des Benutzers dies vorschreibt.
Vorteile für globale Anwendungen
- Reduzierte anfängliche Ladezeit: Benutzer in Regionen mit langsameren Internetverbindungen erleben eine schnellere anfängliche Darstellung, da sie nur den wesentlichen Code herunterladen.
- Verbesserte wahrgenommene Leistung: Durch die Anzeige eines Ladeindikators für Lazy-Loaded-Abschnitte fühlt sich die Anwendung reaktionsschneller an, auch wenn bestimmte Funktionen nicht sofort verfügbar sind.
- Effiziente Ressourcennutzung: Benutzer laden nur Code für Funktionen herunter, die sie aktiv verwenden, wodurch Bandbreite gespart und die Leistung auf Mobilgeräten verbessert wird.
Fehlerbehandlung mit Suspense
So wie Suspense Promises für das erfolgreiche Laden von Daten verarbeitet, kann es auch Fehler abfangen, die während asynchroner Operationen auftreten. Dies wird durch Error Boundaries erreicht.
Eine Error Boundary ist eine React-Komponente, die JavaScript-Fehler überall in ihrem untergeordneten Komponentenbaum abfängt, diese Fehler protokolliert und eine Fallback-UI anzeigt. Mit Suspense können Error Boundaries Fehler abfangen, die von Promises geworfen werden, die abgelehnt werden.
Implementieren von Error Boundaries
Sie können eine Error Boundary-Komponente erstellen, indem Sie eine Klassenkomponente mit einer oder beiden der folgenden Lifecycle-Methoden definieren:
static getDerivedStateFromError(error)
: Wird verwendet, um eine Fallback-UI zu rendern, nachdem ein Fehler aufgetreten ist.componentDidCatch(error, errorInfo)
: Wird verwendet, um Fehlerinformationen zu protokollieren.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error("Error caught by boundary:", error, errorInfo);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return <p>Etwas ist schief gelaufen. Bitte versuchen Sie es später noch einmal.</p>;
}
return this.props.children;
}
}
Um Fehler beim Suspense-fähigen Datenabruf abzufangen, würden Sie Ihre <Suspense>
-Komponente (die wiederum Ihre Datenabrufkomponente umschließt) mit einer <ErrorBoundary>
umschließen.
<ErrorBoundary>
<Suspense fallback={<LoadingSpinner />}>
<UserProfile userId="123" />
</Suspense>
</ErrorBoundary>
Wenn die Datenabruf-Resource ihr Promise ablehnt (z. B. aufgrund eines Netzwerkfehlers oder einer API, die einen Fehlerstatus zurückgibt), wird der Fehler geworfen. Die ErrorBoundary
fängt diesen Fehler ab und ihre Fallback-UI wird gerendert. Dies bietet eine elegante Möglichkeit, API-Fehler zu behandeln, die für die Aufrechterhaltung des Benutzervertrauens in verschiedenen Regionen von entscheidender Bedeutung ist.
Geschachtelte Suspense Boundaries
Eine leistungsstarke Funktion von Suspense ist die Fähigkeit, geschachtelte asynchrone Operationen zu verarbeiten. Sie können mehrere <Suspense>
Boundaries innerhalb Ihres Komponentenbaums haben, jede mit ihrem eigenen Fallback.
Wenn eine Komponente suspendiert, sucht React nach der nächstgelegenen umschließenden <Suspense>
Boundary, um ihren Fallback zu rendern. Wenn eine Komponente innerhalb einer <Suspense>
Boundary suspendiert, rendert sie den Fallback dieser Boundary. Wenn es mehrere geschachtelte Boundaries gibt, rendert React den Fallback der nächstgelegenen Boundary.
Beispiel:
<Suspense fallback={<AppLoading />}>
<!-- This component fetches user data -->
<UserProfile userId="123" />
<Suspense fallback={<CommentsLoading />}>
<!-- This component fetches comments for the user -->
<UserComments userId="123" />
</Suspense>
</Suspense>
In diesem Szenario:
- Wenn
UserProfile
suspendiert, wird<AppLoading />
gerendert. - Wenn
UserProfile
geladen wird, aberUserComments
suspendiert, wird<CommentsLoading />
gerendert. DieUserProfile
wäre in diesem Fall wahrscheinlich bereits sichtbar, da sie vor der Verarbeitung der geschachtelten Suspense-Boundary aufgelöst wurde.
Diese Fähigkeit ermöglicht eine detaillierte Kontrolle über Ladezustände. Für eine globale Anwendung benötigen Sie möglicherweise einen allgemeineren Ladeindikator für die gesamte App, während kritische anfängliche Daten geladen werden, und spezifischere Indikatoren für Abschnitte, die Inhalte asynchron laden, während der Benutzer mit ihnen interagiert. Dies ist besonders relevant für lokalisierte Inhalte, die basierend auf Benutzereinstellungen oder der erkannten Region abgerufen werden können.
Suspense und Server-Side Rendering (SSR)
React Suspense spielt auch eine wichtige Rolle beim Server-Side Rendering und ermöglicht ein leistungsfähigeres und konsistenteres Benutzererlebnis auf breiter Front. Beim SSR wird das anfängliche HTML auf dem Server gerendert. Bei datenintensiven Anwendungen sind jedoch bestimmte Daten möglicherweise zum Renderzeitpunkt nicht verfügbar.
Suspense kann in Verbindung mit Server-Rendering-Datenabrufbibliotheken das Rendern von Teilen der Seite verzögern, bis Daten auf dem Server verfügbar sind, und dann das HTML streamen. Dies wird oft als Streaming-SSR bezeichnet.
So funktioniert es:
- Server-Side Data Fetching: Bibliotheken, die Suspense unterstützen, können den Datenabruf auf dem Server initiieren.
- Streaming-HTML: Wenn Daten für verschiedene Komponenten verfügbar werden, können ihre entsprechenden HTML-Chunks an den Client gesendet werden.
- Client-Side Hydration: Auf dem Client kann React diese gestreamten Chunks hydratisieren. Wenn eine Komponente bereits vollständig gerendert ist und ihre Daten bereit sind, erfolgt die Hydratisierung sofort. Wenn sie auf dem Server suspendiert wurde und die Daten jetzt auf dem Client verfügbar sind, kann sie direkt gerendert werden. Wenn Daten noch ausstehen, wird der
fallback
verwendet.
Dieser Ansatz verbessert die wahrgenommene Ladezeit erheblich, da Benutzer Inhalte schrittweise sehen, sobald sie verfügbar sind, anstatt darauf zu warten, dass die gesamte Seite fertig ist. Für globale Benutzer, bei denen die Serverreaktionszeiten ein Faktor sein können, bietet Streaming-SSR mit Suspense einen spürbaren Vorteil.
Vorteile von Suspense mit SSR
- Progressives Laden: Benutzer sehen Inhalte schneller, auch wenn einige Teile noch geladen werden.
- Verbesserte Time to Interactive (TTI): Die Anwendung wird früher interaktiv, da wesentliche Komponenten bereit sind.
- Konsistente Erfahrung: Das Ladeerlebnis ist über verschiedene Netzwerkbedingungen und Serverstandorte hinweg einheitlicher.
Auswählen von Datenabrufbibliotheken für Suspense
Während React die Suspense-API bereitstellt, schreibt es nicht vor, wie Sie Daten abrufen. Sie benötigen Datenabrufbibliotheken, die sich in das Suspense-Modell integrieren, indem sie Promises werfen.
Wichtige Bibliotheken und Ansätze:
- Relay: Ein leistungsstarker GraphQL-Client, der von Facebook entwickelt wurde und seit langem erstklassige Unterstützung für Suspense bietet. Es eignet sich gut für komplexe Datengraphen und groß angelegte Anwendungen.
- React Query (mit Suspense-Integration): Eine beliebte Bibliothek zum Abrufen und Cachen von Daten, die einen Opt-in-Suspense-Modus bietet. Dies ermöglicht es Ihnen, die leistungsstarken Caching-, Hintergrundaktualisierungs- und Mutationsfunktionen mit den deklarativen Vorteilen von Suspense zu nutzen.
- Apollo Client (mit Suspense-Integration): Ein weiterer weit verbreiteter GraphQL-Client, der auch Suspense-Unterstützung für seine Abfragen bietet.
- Benutzerdefinierte Ressourcen: Für einfachere Anwendungsfälle oder bei der Integration mit vorhandener Datenabruflogik können Sie Ihre eigenen Ressourcenobjekte erstellen, die dem Suspense-Vertrag folgen (d. h. Promises werfen).
Bei der Auswahl einer Bibliothek für eine globale Anwendung sollten Sie Folgendes berücksichtigen:
- Leistungsmerkmale: Wie gut werden Caching, Hintergrundaktualisierungen und Fehlerwiederholungen unter verschiedenen Netzwerkbedingungen behandelt?
- Einfache Integration: Wie einfach ist es, Suspense mit Ihren vorhandenen Datenabrufmustern zu übernehmen?
- Community-Support und Dokumentation: Besonders wichtig für Entwickler in verschiedenen Regionen, die möglicherweise auf Community-Ressourcen angewiesen sind.
- SSR-Support: Entscheidend für die Bereitstellung schneller anfänglicher Ladezeiten weltweit.
Best Practices für die globale Implementierung von Suspense
Die effektive Implementierung von Suspense, insbesondere für ein globales Publikum, erfordert eine sorgfältige Berücksichtigung verschiedener Faktoren:
1. Granulare Fallbacks
Vermeiden Sie nach Möglichkeit einen einzelnen, anwendungsweiten Ladeindikator. Verwenden Sie geschachtelte <Suspense>
Boundaries, um spezifischere Fallbacks für verschiedene Abschnitte Ihrer UI bereitzustellen. Dies schafft eine ansprechendere Erfahrung, bei der Benutzer sehen, wie Inhalte schrittweise geladen werden.
Globale Überlegung: In Regionen mit hoher Latenz sind granulare Fallbacks noch wichtiger. Benutzer sehen möglicherweise, wie Teile der Seite geladen werden und interaktiv werden, während andere Abschnitte noch abgerufen werden.
2. Sinnvoller Fallback-Inhalt
Anstelle generischer Spinner sollten Sie Skeleton Screens oder Platzhalterinhalte verwenden, die dem tatsächlichen Inhalt, der angezeigt wird, visuell ähneln. Dies verbessert die wahrgenommene Leistung und bietet ein besseres Benutzererlebnis als ein leerer Bildschirm oder ein einfaches Ladesymbol.
Globale Überlegung: Stellen Sie sicher, dass die Fallback-Inhalte leichtgewichtig sind und selbst kein starkes asynchrones Laden erfordern, um eine Anhäufung von Verzögerungen zu vermeiden.
3. Strategie zur Fehlerbehandlung
Wie bereits erwähnt, integrieren Sie <ErrorBoundary>
-Komponenten, um Fehler bei Suspense-fähigen Operationen abzufangen. Stellen Sie klare, benutzerfreundliche Fehlermeldungen und Optionen zum Wiederholen von Aktionen bereit. Dies ist besonders wichtig für internationale Benutzer, die möglicherweise auf eine größere Bandbreite an Netzwerkproblemen oder unerwarteten Serverantworten stoßen.
Globale Überlegung: Lokalisieren Sie Fehlermeldungen und stellen Sie sicher, dass sie kultursensibel und in verschiedenen sprachlichen Hintergründen leicht verständlich sind.
4. Optimieren des Datenabrufs
Suspense erleichtert einen besseren Datenabruf, optimiert aber nicht auf magische Weise Ihre API-Aufrufe. Stellen Sie sicher, dass Ihre Datenabrufstrategien effizient sind:
- Rufen Sie nur die Daten ab, die Sie benötigen.
- Führen Sie bei Bedarf Batch-Anfragen durch.
- Nutzen Sie das Caching effektiv.
Globale Überlegung: Erwägen Sie Edge Computing oder Content Delivery Networks (CDNs), um API-Anfragen von Standorten aus bereitzustellen, die sich näher an Ihren Benutzern befinden, wodurch die Latenz reduziert wird.
5. Bundle-Größe und Code-Splitting
Nutzen Sie React.lazy
und Suspense für Code-Splitting. Importieren Sie Komponenten dynamisch, die nicht sofort benötigt werden. Dies ist entscheidend für Benutzer mit langsameren Netzwerken oder mobilen Datentarifen.
Globale Überlegung: Analysieren Sie die Bundle-Größen Ihrer Anwendung und identifizieren Sie kritische Pfade, die für Lazy-Loading priorisiert werden sollten. Bieten Sie optimierte Builds oder Funktionen für Regionen mit eingeschränkter Bandbreite an.
6. Testen auf verschiedenen Geräten und in verschiedenen Netzwerken
Testen Sie Ihre Suspense-Implementierung gründlich auf verschiedenen Geräten, Browsern und simulierten Netzwerkbedingungen (z. B. mithilfe der Netzwerkdrosselung in den Browser-Entwicklertools). Dies hilft Ihnen, Leistungsengpässe oder UX-Probleme zu identifizieren, die Benutzer in bestimmten Regionen überproportional beeinträchtigen könnten.
Globale Überlegung: Testen Sie insbesondere mit Netzwerkbedingungen, die denen in Ihren internationalen Zielmärkten üblichen ähneln.
Herausforderungen und Überlegungen
Suspense bietet zwar erhebliche Vorteile, aber es ist wichtig, sich potenzieller Herausforderungen bewusst zu sein:
- Lernkurve: Das Verständnis, wie Suspense geworfene Promises abfängt und verarbeitet, erfordert eine Änderung der Denkweise für Entwickler, die an traditionelle asynchrone Muster gewöhnt sind.
- Reife des Ökosystems: Obwohl sich das Ökosystem schnell weiterentwickelt, verfügen noch nicht alle Bibliotheken und Tools über eine erstklassige Suspense-Unterstützung.
- Debugging: Das Debuggen suspendierter Komponenten oder komplexer geschachtelter Suspense-Bäume kann manchmal schwieriger sein als das Debuggen herkömmlichen asynchronen Codes.
Globale Überlegung: Die Reife der Internetinfrastruktur variiert weltweit. Entwickler müssen sich bewusst sein, dass Benutzer möglicherweise langsamere Netzwerkgeschwindigkeiten oder weniger zuverlässige Verbindungen erleben, was die Herausforderungen bei der Implementierung neuer asynchroner Muster verschärfen kann. Gründliche Tests und robuste Fallback-Mechanismen sind der Schlüssel.
Die Zukunft von Suspense
React Suspense ist ein Eckpfeiler der laufenden Bemühungen von React, die Rendering-Leistung und das Entwicklererlebnis zu verbessern. Seine Fähigkeit, Datenabruf, Code-Splitting und andere asynchrone Operationen unter einer einzigen, deklarativen API zu vereinheitlichen, verspricht eine optimiertere und effizientere Möglichkeit, komplexe, interaktive Anwendungen zu erstellen. Da immer mehr Bibliotheken die Suspense-Integration übernehmen und das React-Team seine Fähigkeiten weiter verfeinert, können wir noch leistungsfähigere Muster erwarten, die die Art und Weise, wie wir für das Web entwickeln, weiter verbessern.
Für Entwickler, die sich an ein globales Publikum richten, geht es bei der Einführung von Suspense nicht nur darum, eine neue Funktion zu übernehmen, sondern darum, Anwendungen zu erstellen, die leistungsfähiger, reaktionsschneller und benutzerfreundlicher sind, unabhängig davon, wo sich Ihre Benutzer auf der Welt befinden oder wie ihre Netzwerkbedingungen sind.
Schlussfolgerung
React Suspense stellt eine bedeutende Weiterentwicklung in der Art und Weise dar, wie wir asynchrone Operationen in React-Anwendungen verwalten. Durch die Bereitstellung einer deklarativen Möglichkeit zur Behandlung von Ladezuständen, Code-Splitting und Datenabruf vereinfacht es komplexe UIs, verbessert die Leistung und führt letztendlich zu besseren Benutzererlebnissen. Für Entwickler, die Anwendungen für ein globales Publikum erstellen, sind die Vorteile von Suspense - von schnelleren anfänglichen Ladezeiten und progressivem Content-Rendering bis hin zu robuster Fehlerbehandlung und optimiertem SSR - von unschätzbarem Wert.
Wenn Sie Suspense in Ihre Projekte integrieren, denken Sie daran, sich auf granulare Fallbacks, sinnvolle Ladeinhalte, umfassende Fehlerbehandlung und effizienten Datenabruf zu konzentrieren. Indem Sie Best Practices befolgen und die unterschiedlichen Bedürfnisse Ihrer internationalen Benutzer berücksichtigen, können Sie die volle Leistung von React Suspense nutzen, um wirklich erstklassige Anwendungen zu erstellen.