Skip to content
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

Add partial support for "use cache" in metadata route handlers #74835

Merged
merged 8 commits into from
Jan 14, 2025

Conversation

unstubbable
Copy link
Contributor

@unstubbable unstubbable commented Jan 13, 2025

Adds support for using "use cache" in the special metadata route handlers like sitemap.ts, opengraph-image.tsx, icon.tsx, and other metadata files.

reverts #71225
fixes #74146
closes NAR-51

As a follow-up we need to ensure that opengraph image responses do not bail out of static generation when dynamicIO is enabled.

@ijjk ijjk added created-by: Next.js team PRs by the Next.js team. tests Turbopack Related to Turbopack with Next.js. type: next labels Jan 13, 2025
@ijjk
Copy link
Member

ijjk commented Jan 13, 2025

Tests Passed

@ijjk
Copy link
Member

ijjk commented Jan 13, 2025

Stats from current PR

Default Build
General
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
buildDuration 30s 30.5s ⚠️ +528ms
buildDurationCached 27.7s 24.3s N/A
nodeModulesSize 417 MB 417 MB N/A
nextStartRea..uration (ms) 964ms 863ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
5306-HASH.js gzip 53.3 kB 53.3 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.44 kB 5.44 kB N/A
bccd1874-HASH.js gzip 52.9 kB 52.9 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 240 B 242 B N/A
main-HASH.js gzip 34.2 kB 34.2 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.57 kB 4.57 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.34 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
_buildManifest.js gzip 749 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
index.html gzip 524 B 524 B
link.html gzip 539 B 538 B N/A
withRouter.html gzip 520 B 520 B
Overall change 1.04 kB 1.04 kB
Edge SSR bundle Size
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
edge-ssr.js gzip 129 kB 129 kB N/A
page.js gzip 207 kB 207 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
middleware-b..fest.js gzip 672 B 670 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.2 kB 31.2 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
274-experime...dev.js gzip 322 B 322 B
274.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 369 kB 369 kB
app-page-exp..prod.js gzip 130 kB 130 kB
app-page-tur..prod.js gzip 142 kB 142 kB
app-page-tur..prod.js gzip 138 kB 138 kB
app-page.run...dev.js gzip 357 kB 357 kB
app-page.run..prod.js gzip 126 kB 126 kB
app-route-ex...dev.js gzip 37.6 kB 37.6 kB
app-route-ex..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 39.2 kB 39.2 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.6 kB 11.6 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.7 kB 21.7 kB
pages.runtim...dev.js gzip 27.5 kB 27.5 kB
pages.runtim..prod.js gzip 21.7 kB 21.7 kB
server.runti..prod.js gzip 916 kB 916 kB N/A
Overall change 1.54 MB 1.54 MB
build cache
vercel/next.js canary vercel/next.js hl/use-cache-metadata-route-handlers Change
0.pack gzip 2.09 MB 2.09 MB N/A
index.pack gzip 75.2 kB 74.8 kB N/A
Overall change 0 B 0 B
Diff details
Diff for main-HASH.js

Diff too large to display

Diff for server.runtime.prod.js

Diff too large to display

Commit: e848a90

@unstubbable unstubbable force-pushed the hl/use-cache-metadata-route-handlers branch from 48b39dc to e9e182d Compare January 13, 2025 21:53
@unstubbable unstubbable marked this pull request as ready for review January 13, 2025 21:54
@@ -1309,6 +1309,12 @@ export default async function getBaseWebpackConfig(
},
],
},
resourceQuery: {
not: [
new RegExp(WEBPACK_RESOURCE_QUERIES.metadata),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These 2 sounds fine to keep as RSC like layers, curious why we need to change them here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They will still be in the RSC layer (via issuer layer), but we don't want to apply the next-flight-loader to them, as that would generate additional and conflicting entries, which are already covered by the next-metadata-route-loader entries.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without this exclusion, we would generate duplicate export statements like these:

export { $$RSC_SERVER_CACHE_0 as "8056ace5d0b6cd298fba2780df50a7ec233c33eeef" } from "<snip>/app/opengraph-image.tsx?__next_metadata__"
export { $$RSC_SERVER_CACHE_0 as "8056ace5d0b6cd298fba2780df50a7ec233c33eeef" } from "<snip>/app/opengraph-image.tsx?__next_metadata_image_meta__"

I've pushed a (hopefully) clarifying comment.

connection.dependency as unknown as webpack.NormalModule
).request

if (entryRequest.endsWith(WEBPACK_RESOURCE_QUERIES.metadataRoute)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not blocking: would be nice to have a helper to extract entryRequest and handle all cases, using let scares me that we might need to take care of these cases everywhere when we create them.

@unstubbable unstubbable merged commit 6cc85de into canary Jan 14, 2025
129 checks passed
@unstubbable unstubbable deleted the hl/use-cache-metadata-route-handlers branch January 14, 2025 09:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
created-by: Next.js team PRs by the Next.js team. tests Turbopack Related to Turbopack with Next.js. type: next
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[DynamicIO] [Sitemap] Unable to create a cached/static sitemap.ts with use cache
3 participants