Pobieranie danych w React i Next.js porównane na jednej aplikacji

Pobieranie danych w React: serwer, TanStack Query, SWR | We.Inc

Wybierz sposób pobierania danych w React w krótkim quizie, a potem porównaj server components, TanStack Query i SWR pod kątem cache, mutacji i ustawień domyślnych na jednej przykładowej aplikacji.

Pobieraj dane na serwerze, kiedy tylko możesz: w App Router Next.js asynchroniczny server component czeka na dane, zanim zostanie wysłany jakikolwiek HTML, bez kodu spinnera ładowania. Dla danych, które zmieniają się, gdy strona jest otwarta, użyj cache po stronie klienta, takiego jak TanStack Query lub SWR, który obsługuje cache, ponawianie i mutacje. Zwykły fetch w useEffect nadaje się do jednorazowych żądań.

Które podejście pasuje

Każdy przykład na tej stronie ładuje i edytuje tę samą małą listę notatek, więc różnice wynikają z podejścia, a nie z dema. Odpowiedz na trzy pytania poniżej, aby dostać rekomendację na start i pasujący do niej fragment kodu.

Najczęściej zadawane pytania

Czy żądania fetch są cache'owane w App Router Next.js?

Według aktualnej dokumentacji Next.js żądania fetch domyślnie nie są cache'owane i blokują renderowanie, dopóki się nie zakończą. Identyczne żądania w jednym renderze są memoizowane, a cache włączasz dyrektywą use cache albo strumieniujesz świeże dane wewnątrz Suspense.

Jakie są ważne ustawienia domyślne TanStack Query?

Dane stają się nieaktualne od razu (staleTime 0), więc są pobierane ponownie przy montowaniu, powrocie fokusu do okna i ponownym połączeniu. Nieużywane zapytania zostają w pamięci przez 5 minut (gcTime), a nieudane są ponawiane 3 razy z wykładniczym opóźnieniem. Zwiększ staleTime, jeśli takie ponowne pobieranie to więcej, niż potrzebujesz.

TanStack Query czy SWR?

Oba cache'ują według klucza i odświeżają dane po powrocie fokusu i ponownym połączeniu. TanStack Query ma więcej wbudowanych funkcji do mutacji, unieważniania i devtools, a SWR ma mniejsze API zbudowane wokół useSWR(key, fetcher). Wybierz jedną bibliotekę na aplikację, bo używanie obu duplikuje cache.

Czy przy server components nadal potrzebuję biblioteki klienckiej?

Do ładowania stron często nie. Potrzebujesz jej, gdy dane muszą się odświeżać bez nawigacji, gdy użytkownicy edytują i oczekują natychmiastowej reakcji, albo przy nieskończonych listach. Wiele aplikacji ładuje dane na serwerze, a cache po stronie klienta stosuje tylko na interaktywnych ekranach.

Jak na serwerze sprawdzić, kto jest zalogowany przez Supabase?

Poradnik Supabase o renderowaniu po stronie serwera mówi, by nigdy nie ufać getSession() w kodzie serwerowym. Wywołaj supabase.auth.getClaims(), które weryfikuje podpis tokenu, a potem odpytuj tabele: row level security nadal obowiązuje przy każdym zapytaniu.

Najpierw serwer, potem cache po stronie klienta tam, gdzie trzeba

Strumieniowanie zamiast czekania

Dlaczego zwykły wzorzec z useEffect nie wystarcza

Ustawienia domyślne, które zaskakują

Zachowanie bez konfiguracji

Unikanie kaskad na serwerze

Uruchom oba żądania, a potem czekaj na nie razem

Wywołanie obu funkcji przed await sprawia, że żadna nie czeka na drugą.

Strumieniuj wolną część przez Suspense

Nagłówek jest wysyłany od razu, a lista notatek dopływa, gdy przyjdą jej dane.

Supabase w server component

Ten przykład używa helpera createClient z poradnika Supabase o Next.js po stronie serwera (lib/supabase/server.ts, zbudowany na @supabase/ssr). getClaims() weryfikuje token zalogowanego użytkownika, zanim zapytanie zostanie wykonane.

Notatki zalogowanego użytkownika ładowane na serwerze

Row level security na tabeli notes decyduje, które wiersze zostaną zwrócone.

Wybierz podejście

Czy używasz server components (na przykład App Router w Next.js)?

Czy dane muszą się odświeżać, gdy strona pozostaje otwarta?

Czy użytkownicy edytują te dane na ekranie?

Tak

Nie

Fragment kodu na start

Kopiuj fragment

Załaduj dane w asynchronicznym server component. Cache po stronie klienta dodaj później tylko dla części, które staną się interaktywne.

Użyj TanStack Query: useQuery do odczytu, useMutation do zapisu i invalidateQueries do odświeżenia po zmianie.

Użyj SWR: useSWR utrzymuje widok aktualny po powrocie fokusu i ponownym połączeniu przy bardzo małej ilości kodu.

Tutaj wystarczy pojedynczy fetch w useEffect. Posprzątaj za pomocą flagi ignore, aby spóźniona odpowiedź nie nadpisała nowszego stanu.

Rekomendacja: {v}

Server component

TanStack Query

SWR

useEffect i fetch

Zacznij za darmo · Bez karty kredytowej

Powiązane: Poradniki

Produkt

Dla kogo

Funkcje

Zasoby

Firma

Mapa strony