Diese Vergleichstabelle versucht, so genau und unparteiisch wie mΓΆglich zu sein. Wenn Sie eine dieser Bibliotheken verwenden und der Meinung sind, dass die Informationen verbessert werden kΓΆnnten, kΓΆnnen Sie gerne Γnderungen (mit Hinweisen oder Beweisen fΓΌr Behauptungen) ΓΌber den Link "Diese Seite auf Github bearbeiten" am unteren Ende dieser Seite vorschlagen.
Merkmal-/FΓ€higkeitsschlΓΌssel
| React Query | SWR (Website) | Apollo Client (Website) | RTK-Query (Website) | React Router (Website) | |
|---|---|---|---|---|---|
| Github Repo / Sterne | |||||
| Plattformanforderungen | React | React | React, GraphQL | Redux | React |
| Ihr Vergleich | (keine) | (keine) | Vergleich | (keine) | |
| UnterstΓΌtzte Abfragesyntax | Promise, REST, GraphQL | Promise, REST, GraphQL | GraphQL, Beliebig (Reaktive Variablen) | Promise, REST, GraphQL | Promise, REST, GraphQL |
| UnterstΓΌtzte Frameworks | React | React | React + Andere | Beliebig | React |
| Caching-Strategie | Hierarchischer SchlΓΌssel -> Wert | Eindeutiger SchlΓΌssel -> Wert | Normalisiertes Schema | Eindeutiger SchlΓΌssel -> Wert | Verschachtelte Route -> Wert |
| Cache-SchlΓΌssel-Strategie | JSON | JSON | GraphQL-Abfrage | JSON | Routenpfad |
| Cache-Γnderungserkennung | Tiefer Vergleich von SchlΓΌsseln (stabile Serialisierung) | Tiefer Vergleich von SchlΓΌsseln (stabile Serialisierung) | Tiefer Vergleich von SchlΓΌsseln (instabile Serialisierung) | SchlΓΌsselreferenzielle Gleichheit (===) | RoutenΓ€nderung |
| DatenΓ€nderungserkennung | Tiefer Vergleich + Strukturelle Teilung | Tiefer Vergleich (via stable-hash) | Tiefer Vergleich (instabile Serialisierung) | SchlΓΌsselreferenzielle Gleichheit (===) | Loader-AusfΓΌhrung |
| Datenspeicherung (Memoization) | Volle strukturelle Teilung | IdentitΓ€t (===) | Normalisierte IdentitΓ€t | IdentitΓ€t (===) | IdentitΓ€t (===) |
| Bundle-GrΓΆΓe | |||||
| API-Definitionsort | Komponente, Externe Konfiguration | Komponente | GraphQL-Schema | Externe Konfiguration | Routenbaumkonfiguration |
| Queries | β | β | β | β | β |
| Cache-Persistenz | β | β | β | β | π Nur aktive Routen 8 |
| Devtools | β | β | β | β | π |
| Polling/Intervalle | β | β | β | β | π |
| Parallele Queries | β | β | β | β | β |
| AbhΓ€ngige Queries | β | β | β | β | β |
| Paginierte Queries | β | β | β | β | β |
| Unendliche Queries | β | β | β | β | π |
| Bidirektionale unendliche Abfragen | β | πΆ | πΆ | β | π |
| Unendliches Abfrage-Neuladen | β | β | π | β | π |
| VerzΓΆgerte Abfragedaten1 | β | β | β | β | β |
| Selektoren | β | π | β | β | N/A |
| Initiale Daten | β | β | β | β | β |
| Scroll-Wiederherstellung | β | β | β | β | β |
| Cache-Manipulation | β | β | β | β | π |
| Veraltete Abfrageablehnung | β | β | β | β | β |
| Render-Batching & Optimierung2 | β | β | π | β | β |
| Automatische Garbage Collection | β | π | π | β | N/A |
| Mutations-Hooks | β | β | β | β | β |
| Offline-MutationsunterstΓΌtzung | β | π | π‘ | π | π |
| Prefetching-APIs | β | β | β | β | β |
| Query-Abbruch | β | π | π | π | β |
| Teilweises Abgleich von Abfragen3 | β | πΆ | β | β | N/A |
| Stale While Revalidate | β | β | β | β | π |
| Konfiguration der veralteten Zeit (Stale Time) | β | π7 | π | β | π |
| Abfrage-/Mutationskonfiguration vor der Verwendung4 | β | π | β | β | β |
| Neuabfrage bei Fensterfokus | β | β | π | β | π |
| Netzwerkstatus-Neuladen | β | β | β | β | π |
| Allgemeine Cache-Dehydrierung/Rehydrierung | β | π | β | β | β |
| Offline-Caching | β | π | β | πΆ | π |
| React Suspense | β | β | β | π | β |
| Abstrahiertes/agnostisches KernstΓΌck | β | π | β | β | π |
| Automatisches Neuladen nach Mutation5 | πΆ | πΆ | β | β | β |
| Normalisiertes Caching6 | π | π | β | π | π |
1 VerzΓΆgerte Abfragedaten - React Query bietet eine MΓΆglichkeit, weiterhin die vorhandenen Daten einer Abfrage anzuzeigen, wΓ€hrend die nΓ€chste Abfrage geladen wird (Γ€hnlich der gleichen Benutzererfahrung, die Suspense bald nativ bieten wird). Dies ist Γ€uΓerst wichtig beim Schreiben von Paginierungs- oder unendlichen Lade-UIs, bei denen Sie keinen harten Ladezustand anzeigen mΓΆchten, wenn eine neue Abfrage angefordert wird. Andere Bibliotheken verfΓΌgen nicht ΓΌber diese Funktion und zeigen einen harten Ladezustand fΓΌr die neue Abfrage an (sofern diese nicht vorab geladen wurde), wΓ€hrend die neue Abfrage geladen wird.
2 Render-Optimierung - React Query verfΓΌgt ΓΌber eine hervorragende Rendering-Leistung. StandardmΓ€Γig verfolgt es automatisch, welche Felder abgerufen werden, und rendert neu, nur wenn sich eines davon Γ€ndert. Wenn Sie diese Optimierung abwΓ€hlen mΓΆchten, setzen Sie notifyOnChangeProps auf 'all', um Ihre Komponenten neu zu rendern, wenn die Abfrage aktualisiert wird. Zum Beispiel, weil sie neue Daten hat oder um anzuzeigen, dass sie gerade abfragt. React Query fasst auch Updates zusammen, um sicherzustellen, dass Ihre Anwendung nur einmal neu rendert, wenn mehrere Komponenten dieselbe Abfrage verwenden. Wenn Sie nur an den Eigenschaften data oder error interessiert sind, kΓΆnnen Sie die Anzahl der Renderings noch weiter reduzieren, indem Sie notifyOnChangeProps auf ['data', 'error'] setzen.
3 Teilweises Abgleichen von Abfragen - Da React Query eine deterministische Serialisierung von AbfrageschlΓΌsseln verwendet, kΓΆnnen Sie variable Gruppen von Abfragen manipulieren, ohne jeden einzelnen AbfrageschlΓΌssel kennen zu mΓΌssen, den Sie abgleichen mΓΆchten. z.B. kΓΆnnen Sie jede Abfrage neu laden, die in ihrem SchlΓΌssel mit todos beginnt, unabhΓ€ngig von Variablen, oder Sie kΓΆnnen bestimmte Abfragen mit (oder ohne) Variablen oder verschachtelten Eigenschaften ansprechen und sogar eine Filterfunktion verwenden, um nur Abfragen abzugleichen, die Ihre spezifischen Bedingungen erfΓΌllen.
4 Abfragekonfiguration vor der Verwendung - Dies ist einfach ein schicker Name dafΓΌr, dass man konfigurieren kann, wie Abfragen und Mutationen funktionieren, bevor sie verwendet werden. Zum Beispiel kann eine Abfrage im Voraus vollstΓ€ndig mit Standardwerten konfiguriert werden, und wenn es an der Zeit ist, sie zu verwenden, ist nur useQuery({ queryKey }) erforderlich, anstatt bei jeder Verwendung den Fetcher und/oder die Optionen ΓΌbergeben zu mΓΌssen. SWR hat eine Teilform dieser Funktion, indem es erlaubt, einen Standard-Fetcher vorab zu konfigurieren, aber nur als globalen Fetcher, nicht auf Abfragebasis und definitiv nicht fΓΌr Mutationen.
5 Automatisches Neuladen nach Mutation - Damit ein wirklich automatisches Neuladen nach einer Mutation erfolgen kann, ist ein Schema erforderlich (wie das, das GraphQL bietet) zusammen mit Heuristiken, die der Bibliothek helfen, einzelne EntitΓ€ten und EntitΓ€tstypen in diesem Schema zu identifizieren.
6 Normalisiertes Caching - React Query, SWR und RTK-Query unterstΓΌtzen derzeit kein automatisches normalisiertes Caching, das die Speicherung von EntitΓ€ten in einer flachen Architektur beschreibt, um eine gewisse Duplizierung von Daten auf hoher Ebene zu vermeiden.
7 SWR's UnverΓ€nderlicher Modus - SWR wird mit einem "unverΓ€nderlichen" Modus geliefert, der es Ihnen ermΓΆglicht, eine Abfrage nur einmal fΓΌr die Lebensdauer des Caches abzurufen, aber er hat immer noch nicht das Konzept von Stale-Time oder bedingter automatischer Neuanzeige.
8 React Router Cache-Persistenz - React Router speichert Daten nicht ΓΌber die aktuell passenden Routen hinaus im Cache. Wenn eine Route verlassen wird, gehen ihre Daten verloren.