GraphQL.cz/Fórum/Můžu použít Apollo Client s SSR a jak to funguje s cache?

Můžu použít Apollo Client s SSR a jak to funguje s cache?

Zajímalo by mě, jestli je možné používat Apollo Client pro server-side rendering (SSR) a jak to vlastně celé funguje, hlavně co se týče cachování dat. Četl jsem, že Apollo Client má skvělou podporu pro GraphQL a chtěl bych ho implementovat do mé aplikace, která potřebuje SSR. Jenže mám pocit, že se v tom trošku ztrácím. Jakým způsobem tedy Apollo zpracovává data na serveru? A co cache? Můžu použít nějakou strategii pro předběžné načítání dat na serveru a pak je efektivně využít na klientovi, nebo musím mít cache nastavenou jinak? A co se stane, když se data změní na serveru po prvním renderování? Jakým způsobem Apollo Client zvládá synchronizaci mezi client-side a server-side? Je potřeba nějak speciálně konfigurovat Apollo Client pro SSR, nebo to funguje stejně jako při běžném používání na frontendu? Rád bych slyšel nějaké praktické příklady, jak to máte vy vyřešené. Díky za každou radu!

146 slov
1.5 minut čtení
25. 10. 2024
Simona Brožová

Jasně, Apollo Client se dá použít pro SSR a celkem to funguje dobře. Když to uděláš, tak na serveru vykreslíš stránku a načteš data přes Apollo Client, což je fakt super, protože ti to umožní mít všechno ready ještě před tím, než se to dostane do prohlížeče. Co se týče cache, tak Apollo má v sobě mechanismy na cachování, takže jakmile jednou data načteš na serveru, uloží se ti do cache a pak je můžeš znovu použít na klientovi bez dalšího dotazu k serveru. V podstatě si nastavíš Apollo Client na serveru, uděláš dotazy, pak ty data přeneseš na frontend a tam už to máš ve své cache.

Pokud se data změní po prvním renderování, tak Apollo Client se snaží synchronizovat s aktuálním stavem dat. Můžeš nastavit onu cache policy, aby zkontroloval jestli máš aktuální data nebo ne, ale většinou se doporučuje používat "cache-first" strategii. Co se týká konfigurace pro SSR, tak jo, je potřeba udělat nějaké drobné úpravy v tom jak inicializuješ Apollo Client třeba při serverovém renderování. Prostě když ho nastavíš na serveru, tak bys měl pak ty data přenést do inicializačního stavu klienta.

V praxi většinou vytvoříš ApolloProvider na serveru s novým klientem a pak to předáš do React komponenty. Pak na klientovi uděláš stejný setup a můžeš čerpat z cache. Takže v podstatě ano, funguje to dost podobně jako v běžné aplikaci bez SSR.

226 slov
2.3 minut čtení
17. 1. 2025
Simona Světlíková

Klidně můžeš použít Apollo Client s SSR, je to docela jednoduchý. V podstatě to funguje tak, že na serveru načteš potřebná data pomocí Apollo Client a pak je předáš do komponenty, což se pak na klientovi znovu načte. Co se týče cachování, tak Apollo má vestavěnou cache, která se používá i při SSR. Můžeš si nastavit strategii pro předběžné načítání dat, takže když se data načtou na serveru, klient už je má v cache a nemusí je znovu stahovat. Když se ale data změní po prvním renderování, musíš to ručně synchronizovat. Většinou to řešíš tím, že znovu provedeš dotaz na klientovi. Konfigurace Apollo Client pro SSR není moc odlišná než pro běžné použití na frontendu, hlavně nezapomeň na ApolloProvider a vytvoření instance klienta. Zkus kouknout na příklady s Next.js nebo Nuxt.js, mají v tomhle dobré návody.

136 slov
1.4 minut čtení
13. 1. 2025
Emil Šváb

Jo, Apollo Client se dá v pohodě použít i s SSR. Funguje to tak, že na serveru si vytvoříš instanci Apollo Clienta, která se připojí k tvýmu GraphQL API a načte potřebná data před tím, než se stránka renderuje. Tím pádem, když se stránka pošle klientovi, už máš všechna data hotová a nemusíš čekat na jejich načtení. Je to fakt rychlejší pro uživatele.

Co se týče cache, Apollo Client má svoji cache, kterou můžeš využít jak na serveru, tak na klientovi. Na serveru si načteš data do cache při renderování a pak je můžeš poslat do komponentů. Na frontendu už Apollo automaticky použije tu samou cache, takže pokud se data nezmění, nemusíš je znovu načítat. Když se ale data na serveru změní po prvním renderování, tak to budeš muset nějak sledovat a buď refreshnout cache nebo udělat refetch.

Z hlediska konfigurace není potřeba nic extra speciálního pro SSR. Prostě vytvoříš Apollo Client jako obvykle, ale musíš zajistit, aby byl správně inicializován na serveru a pak ho poslat jako prop do komponentů. Je dobrý mít na paměti nějaký strategii pro načítání dat, třeba pomocí getServerSideProps nebo getInitialProps, abys to zvládnul elegantně. Takže jo, jde to a když to uděláš správně, tvoje aplikace bude rychlejší a efektivnější.

203 slov
2 minut čtení
4. 1. 2025
Aleš Řezník
GraphQL.cz/Články/GraphQL na frontendu
Pokročilé techniky správy cache s Apollo ClientObjevte různé strategie správy cache v Apollo Client, které pomáhají zlepšit výkon aplikací a snižují počet HTTP požadavků.
1000 slov
10 minut čtení
22. 7. 2024
Richard Kolář
Přečíst článek
Podobné otázky