-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Feature/hydrate promises #7481
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Feature/hydrate promises #7481
Changes from all commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
cbe18b1
feat: allow to dehydrate and restore promises
TkDodo ea7ac38
fix: retries with initialPromise, but without queryFn
TkDodo f0baa46
fix: retries for infinite queries
TkDodo 7ff56d9
refactor: streamline the way we get the queryFn between Query and Inf…
TkDodo f4989a3
fix: only dehydrate query.promise for pending queries
TkDodo 8f55e36
feat: allow setting hydration and dehydration defaultOptions on the Q…
TkDodo 328a32b
test: global defaultOptions for hydrate / dehydrate
TkDodo 889a471
tests: hydration of promises
TkDodo ebd8278
feat: next15 integration test
TkDodo ebf52b3
docs: app directory prefetching example
TkDodo 23d4c5a
docs: global hydrate and dehydrate options
TkDodo 851e4bc
feat: use streaming
TkDodo b387373
docs: prefetching
TkDodo ee60e81
test: useQuery with initialPromise
TkDodo 03676dd
fix: do not leak server errors to the client
TkDodo f6beb5d
docs: typo
TkDodo 2a2f7f4
fix: ignore next in sherif
TkDodo ef57ad5
test: await promise before clearing client to avoid error
TkDodo 95fe274
feat: always respect the `promise` passed to hydrate, even if we alre…
TkDodo b8af2d8
Update docs/framework/react/guides/advanced-ssr.md
TkDodo 7401080
Update docs/framework/react/guides/advanced-ssr.md
TkDodo dcf68f9
chore: remove leftover 'use client'
TkDodo d078179
oops
TkDodo 6d3389a
docs: better text
TkDodo 34bd169
chore: better error messages
TkDodo 6547423
update note
TkDodo 70f7f71
chore: fix lock file
TkDodo File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| /** @type {import('eslint').Linter.Config} */ | ||
| module.exports = { | ||
| extends: ['plugin:react/jsx-runtime', 'plugin:react-hooks/recommended'], | ||
| settings: { | ||
| react: { | ||
| version: 'detect', | ||
| }, | ||
| }, | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. | ||
|
|
||
| # dependencies | ||
| /node_modules | ||
| /.pnp | ||
| .pnp.js | ||
|
|
||
| # testing | ||
| /coverage | ||
|
|
||
| # next.js | ||
| /.next/ | ||
| /out/ | ||
|
|
||
| # production | ||
| /build | ||
|
|
||
| # misc | ||
| .DS_Store | ||
| *.pem | ||
|
|
||
| # debug | ||
| npm-debug.log* | ||
| yarn-debug.log* | ||
| yarn-error.log* | ||
|
|
||
| # local env files | ||
| .env*.local | ||
|
|
||
| # vercel | ||
| .vercel | ||
|
|
||
| # typescript | ||
| *.tsbuildinfo | ||
| next-env.d.ts |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). | ||
|
|
||
| ## Getting Started | ||
|
|
||
| First, run the development server: | ||
|
|
||
| ```bash | ||
| npm run dev | ||
| # or | ||
| yarn dev | ||
| # or | ||
| pnpm dev | ||
| ``` | ||
|
|
||
| Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. | ||
|
|
||
| You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. | ||
|
|
||
| This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. | ||
|
|
||
| ## Learn More | ||
|
|
||
| To learn more about Next.js, take a look at the following resources: | ||
|
|
||
| - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. | ||
| - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. | ||
|
|
||
| You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! | ||
|
|
||
| ## Deploy on Vercel | ||
|
|
||
| The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. | ||
|
|
||
| Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. |
Binary file not shown.
33 changes: 33 additions & 0 deletions
33
examples/react/nextjs-app-prefetching/app/get-query-client.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| import { QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query' | ||
|
|
||
| function makeQueryClient() { | ||
| return new QueryClient({ | ||
| defaultOptions: { | ||
| queries: { | ||
| staleTime: 60 * 1000, | ||
| }, | ||
| dehydrate: { | ||
|
Ephem marked this conversation as resolved.
|
||
| // include pending queries in dehydration | ||
| shouldDehydrateQuery: (query) => | ||
| defaultShouldDehydrateQuery(query) || | ||
| query.state.status === 'pending', | ||
| }, | ||
| }, | ||
| }) | ||
| } | ||
|
|
||
| let browserQueryClient: QueryClient | undefined = undefined | ||
|
|
||
| export function getQueryClient() { | ||
| if (typeof window === 'undefined') { | ||
| // Server: always make a new query client | ||
| return makeQueryClient() | ||
| } else { | ||
| // Browser: make a new query client if we don't already have one | ||
| // This is very important, so we don't re-make a new client if React | ||
| // suspends during the initial render. This may not be needed if we | ||
| // have a suspense boundary BELOW the creation of the query client | ||
| if (!browserQueryClient) browserQueryClient = makeQueryClient() | ||
| return browserQueryClient | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| import Providers from './providers' | ||
| import type React from 'react' | ||
| import type { Metadata } from 'next' | ||
|
|
||
| export const metadata: Metadata = { | ||
| title: 'Create Next App', | ||
| description: 'Generated by create next app', | ||
| } | ||
|
|
||
| export default function RootLayout({ | ||
| children, | ||
| }: { | ||
| children: React.ReactNode | ||
| }) { | ||
| return ( | ||
| <html lang="en"> | ||
| <body> | ||
| <Providers>{children}</Providers> | ||
| </body> | ||
| </html> | ||
| ) | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| import React from 'react' | ||
| import { HydrationBoundary, dehydrate } from '@tanstack/react-query' | ||
| import { pokemonOptions } from '@/app/pokemon' | ||
| import { getQueryClient } from '@/app/get-query-client' | ||
| import { PokemonInfo } from './pokemon-info' | ||
|
|
||
| export default function Home() { | ||
| const queryClient = getQueryClient() | ||
|
|
||
| void queryClient.prefetchQuery(pokemonOptions) | ||
|
|
||
| return ( | ||
| <main> | ||
| <h1>Pokemon Info</h1> | ||
| <HydrationBoundary state={dehydrate(queryClient)}> | ||
| <PokemonInfo /> | ||
| </HydrationBoundary> | ||
| </main> | ||
| ) | ||
| } |
18 changes: 18 additions & 0 deletions
18
examples/react/nextjs-app-prefetching/app/pokemon-info.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| 'use client' | ||
|
|
||
| import React from 'react' | ||
| import { useSuspenseQuery } from '@tanstack/react-query' | ||
| import { pokemonOptions } from '@/app/pokemon' | ||
|
|
||
| export function PokemonInfo() { | ||
| const { data } = useSuspenseQuery(pokemonOptions) | ||
|
|
||
| return ( | ||
| <div> | ||
| <figure> | ||
| <img src={data.sprites.front_shiny} height={200} alt={data.name} /> | ||
| <h2>I'm {data.name}</h2> | ||
| </figure> | ||
| </div> | ||
| ) | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| import { queryOptions } from '@tanstack/react-query' | ||
|
|
||
| export const pokemonOptions = queryOptions({ | ||
| queryKey: ['pokemon'], | ||
| queryFn: async () => { | ||
| const response = await fetch('https://pokeapi.co/api/v2/pokemon/25') | ||
|
|
||
| return response.json() | ||
| }, | ||
| }) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| 'use client' | ||
| import { QueryClientProvider } from '@tanstack/react-query' | ||
| import { ReactQueryDevtools } from '@tanstack/react-query-devtools' | ||
| import { getQueryClient } from '@/app/get-query-client' | ||
| import type * as React from 'react' | ||
|
|
||
| export default function Providers({ children }: { children: React.ReactNode }) { | ||
| const queryClient = getQueryClient() | ||
|
|
||
| return ( | ||
| <QueryClientProvider client={queryClient}> | ||
| {children} | ||
| <ReactQueryDevtools /> | ||
| </QueryClientProvider> | ||
| ) | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| /** @type {import('next').NextConfig} */ | ||
| const nextConfig = { | ||
| eslint: { | ||
| ignoreDuringBuilds: true, | ||
| }, | ||
| } | ||
|
|
||
| module.exports = nextConfig |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.