Framework
Version

Vergleich | React Query vs SWR vs Apollo vs RTK Query vs React Router

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

  • βœ… Erstklassig, integriert und sofort einsatzbereit ohne zusΓ€tzliche Konfiguration oder Code
  • 🟑 UnterstΓΌtzt, aber als inoffizielle 3rd-Party- oder Community-Bibliothek/Beitrag
  • πŸ”Ά UnterstΓΌtzt und dokumentiert, erfordert aber zusΓ€tzlichen Benutzercode zur Implementierung
  • πŸ›‘ Nicht offiziell unterstΓΌtzt oder dokumentiert.
React QuerySWR (Website)Apollo Client (Website)RTK-Query (Website)React Router (Website)
Github Repo / Sterne
PlattformanforderungenReactReactReact, GraphQLReduxReact
Ihr Vergleich(keine)(keine)Vergleich(keine)
UnterstΓΌtzte AbfragesyntaxPromise, REST, GraphQLPromise, REST, GraphQLGraphQL, Beliebig (Reaktive Variablen)Promise, REST, GraphQLPromise, REST, GraphQL
UnterstΓΌtzte FrameworksReactReactReact + AndereBeliebigReact
Caching-StrategieHierarchischer SchlΓΌssel -> WertEindeutiger SchlΓΌssel -> WertNormalisiertes SchemaEindeutiger SchlΓΌssel -> WertVerschachtelte Route -> Wert
Cache-SchlΓΌssel-StrategieJSONJSONGraphQL-AbfrageJSONRoutenpfad
Cache-Γ„nderungserkennungTiefer 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Γ€nderungserkennungTiefer Vergleich + Strukturelle TeilungTiefer Vergleich (via stable-hash)Tiefer Vergleich (instabile Serialisierung)SchlΓΌsselreferenzielle Gleichheit (===)Loader-AusfΓΌhrung
Datenspeicherung (Memoization)Volle strukturelle TeilungIdentitΓ€t (===)Normalisierte IdentitΓ€tIdentitΓ€t (===)IdentitΓ€t (===)
Bundle-Grâße +
API-DefinitionsortKomponente, Externe KonfigurationKomponenteGraphQL-SchemaExterne KonfigurationRoutenbaumkonfiguration
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πŸ›‘πŸ›‘βœ…πŸ›‘πŸ›‘

Hinweise

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.