Slide 1

Slide 1 text

Next.js App Router x @apollo/client

Slide 2

Slide 2 text

Self introduction Yoshiki Kurihara (@kuriyosh) Work experience Yuimedi (software engineer) AWS (cloud support engineer) Skills TypeScript Node.js AWS

Slide 3

Slide 3 text

Agenda What is Next.js App Router What is @apollo/client Cache optimization in app router Server side Client side

Slide 4

Slide 4 text

What is Next.js App Router React Server Component call API closer to data source reduce JS sent to client Stream SSR get page earlier without waiting entire page etc...

Slide 5

Slide 5 text

What is @apollo/client GraphQL client library Client side cache

Slide 6

Slide 6 text

Rendering phase in App Router React Server component Client component (server side) Client component (client side)

Slide 7

Slide 7 text

Query phase

Slide 8

Slide 8 text

Challenge optimize cache Server side want to share a cache with multiple server components one apollo client cannot be used globally Client side needs to share cache in two runtimes (server/client)

Slide 9

Slide 9 text

Note Currently experimental support Can not share RSC & client component cache

Slide 10

Slide 10 text

@apollo/experimental-nextjs-app-support For server components Create a client instance between server components For client components Hydrate query result executed in server side to browser cache

Slide 11

Slide 11 text

Server side

Slide 12

Slide 12 text

Server side Create a client instance between server components

Slide 13

Slide 13 text

const { getClient } = registerApolloClient(() => { return new NextSSRApolloClient({ cache: new NextSSRInMemoryCache(), link: new HttpLink({ uri: ENDPOINT, }), }); }); const QueryFromServer = async ({ index }) => { const { data } = await getClient().query({ query: userQuery }); ... }; const Page = () => { return (

Slide 14

Slide 14 text

How to provide RSC cache sharing Use React.cache for providing client (registerApolloClient) React.cache enables caching callback function for each request Ref: https://zenn.dev/cybozu_frontend/articles/react- cache-and-nextjs

Slide 15

Slide 15 text

Client side

Slide 16

Slide 16 text

Client side Hydrate query result executed in server side to browser cache

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

"use client"; const SuspenseQueryUser = ({ children }) => { const result = useSuspenseQuery(userQuery); ... }; const QueryUser = ({ children }) => { const result = useQuery(userQuery); ... }; const Page = () => { // call query user only once return ( ); };

Slide 19

Slide 19 text

How to provide cache hydration Use ServerInsertedHTMLContext (useServerInsertedHTML ) Insert HTML to client arbitrary HTML into the stream

Slide 20

Slide 20 text

Recap @apollo/experimental-nextjs-app-support provide optimized cache in app router Create a client instance between server components → Use React.cache Hydrate query result executed in server side to browser cache → Use ServerInsertedHTMLContext (useServerInsertedHTML )

Slide 21

Slide 21 text

No content