-
Notifications
You must be signed in to change notification settings - Fork 27.4k
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
Async generateMetadata hangs the app without any visible sign of loading #55524
Comments
We're also seeing this issue, which is a pretty big issue with for us. We have slow endpoints that generate our metadata and right now it feels like a tradeoff between bad SEO and using this feature. Is there a workaround to get metadata on the page without blocking or getting a loading ui/suspense boundary for page navigation? I don't know if it helps but it seems the rsc is called twice in a row. If we have generateMetadata on, the first request takes as long as the metadata does to return, which doesn't seem to be caught by any suspense/loading ui boundary. If we take out the generateMetadata, both requests are still fired, but the first one is nearly instant with the second one taking some time but that is correctly picked up by the suspense loading boundary. |
Same issue, couldn't generateMetadata be called compile time as well with a revalidation? |
What helps a little is using
Now it will block with getData on the first request (still bad), from then on always return cached data and revalidate in the background. To not let it be blocking on the first request, you'd need a way of pre-running the getData on build time. Currently everything inside |
This comment has been minimized.
This comment has been minimized.
This should be a very commonly used feature, and it is surprising that the official team has not provided any fixes. |
Looks like this issue is the same as #45418 |
Same issue here. |
Sad to see this has not gotten any traction from the Next team as the issue is months old already. This is very lousy UX and is making me seriously consider moving my app back to pages. |
I do hope this issue gets attention, as @ArianHamdi's comment is exactly what I hoped/expected the functionality to be. @Matt-roki , in the meantime, I was able to implement a work-around inspired by #45418 (comment) that has seemed to resolve our issues. |
Same issue. Metadata taking ~6 seconds. |
This comment has been minimized.
This comment has been minimized.
+, same problem |
This comment has been minimized.
This comment has been minimized.
Okay the best solution I have found for this is to remove the async part of generateMetadata. Now for me all of my seo comes from a seo and that wouldnt work without async. I now have a prebuild file which runs and generates a seo.json file that I can read my metadata from
Simplified code below.
This fixes most issues the only downside is when a seo change is made a build is needed. |
Hey, I wanted to give a few updates on this.
|
Thank you for the update @feedthejim . While those enhancements seem worthy, they also don't seem like quick wins. Did you consider a solution similar to what @ArianHamdi wrote above (at least in the short-term):
I think that would go a long way to alleviating this issue, as we would be paying the cost on first-load only, whereas now it's per-page. |
+1 for bypassing the blocker waiting for async generateMetadata to resolve during client side navigation. |
+1 here. Would have been nice to have an "optimistic" behavior. |
If it won't be blocking |
Thanks for this. Is there any update on streamable metadata? |
See: vercel/next.js#55524 Metadata is not currently streamable, so navigation is slowed down on post threads. Will add this back once Next.js adds support.
If it does become streamable will search engines accept this? |
The problem is very clear in the following code snippet using app router.
The first point is the problem, because must start running from the beginning and the full page with its metadata should render together. import { Suspense } from "react"
export async function generateMetadata() {
await new Promise(resolve => setTimeout(resolve, 2000))
return {
title: 'Test',
description: 'Test',
}
}
async function TestContent() {
await new Promise(resolve => setTimeout(resolve, 4000))
return <h1>Test</h1>
}
export default async function Test() {
return (
<Suspense fallback={<div>loading</div>}>
<TestContent />
</Suspense>
)
} Neither latest nor canary are working as expected. With this issue is impossible to create an elegant, efficient and SEO friendly page with app router. Please help. |
I'm working on a pretty big next.js app that's on pages router. Our pages would look somewhat like this:
Our biggest pain with pages router is that We were super excited when app router was announced with persisted layouts. We waited two years to give it some time for app router to be stable. We recently did an app router migration spike and we found that navigation from
But when we experimented with app router we only tested the layouts and pages, we did not test metadata as the docs did not mention anything related to
We're working on a very big app. Our team spent a few weeks migrating some of our pages from pages router to app router. With app router, our pages look somewhat like this:
Things were looking good until we added the @feedthejim none of the options you suggested would work for us. It's a self-hosted app. Our data is very fast and cached in a different layer and not in the render layer for freshness reasons. We can't use |
Exactly the same issue here, caught between page and app router. |
Link to the code that reproduces this issue or a replay of the bug
https://github.com/wiwo-dev/generatemetadata-loading-issue
https://codesandbox.io/p/github/wiwo-dev/generatemetadata-loading-issue/main
To Reproduce
Run the application using the command:
yarn run dev
.Navigate to the root path (
/
). Here, you'll find two lists of "users" retrieved from jsonplaceholder. The list at the top has the problem as it uses generateMetadata. The one at the bottom doesn't use generateMetadata.The top list contains links to
/user/[userId]
, and these links have agenerateMetadata
function that fetches data. Upon clicking these links, for the initial 3 seconds, there is no visible loading indication, making users believe that something might be wrong with the link.In contrast, if you click on any of the links in the bottom list, which leads to
/user-no-metadata/[userId]
that doesn't usegenerateMetadata
, you'll notice that a Loading state is triggered by Suspense, providing a clear loading indication.Current vs. Expected behavior
Current behaviour
When a user navigates to a page containing a
generateMetadata
function that fetches data from a slowly working API, there's a problem. The application appears to hang, providing no indication that it's actively loading. Notably, thefetch
operation withingenerateMetadata
doesn't trigger React's Suspense, and the browser also fails to display any loading indicators.To simulate a slow API response, a
setTimeout
is intentionally used within thegetUsers
function.I encountered this issue while working on a project with a tens of thousands number of subpages, and it's highly likely that a given subpage will be opened for the first time and only once, with new entries continually being added.
Expected behaviour
It should trigger the Suspense or show any kind of loading indicator in the browser so the user knows that something is happening under the hood and wait for the page to be displayed.
Verify canary release
Provide environment information
Operating System: Platform: darwin Arch: arm64 Version: Darwin Kernel Version 22.4.0: Mon Mar 6 21:00:41 PST 2023; root:xnu-8796.101.5~3/RELEASE_ARM64_T8103 Binaries: Node: 18.7.0 npm: 8.15.0 Yarn: 1.22.15 pnpm: 6.11.0 Relevant Packages: next: 13.4.20-canary.36 eslint-config-next: N/A react: 18.2.0 react-dom: 18.2.0 typescript: 5.1.3 Next.js Config: output: N/A
Which area(s) are affected? (Select all that apply)
Metadata (metadata, generateMetadata, next/head)
Additional context
Is there a way to display a loading state or any form of indication that something is loading while still utilising the
generateMetadata
function to fetch metadata information from a slow API?The text was updated successfully, but these errors were encountered: