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

[Segment Cache] Evict client cache on revalidate #74874

Merged
merged 1 commit into from
Jan 16, 2025

Conversation

acdlite
Copy link
Contributor

@acdlite acdlite commented Jan 14, 2025

This implements evicting the client cache when a Server Action calls revalidatePath or revalidateTag.

Similar to the old prefetching implementation, it works by clearing the entire client cache, as opposed to only the affected path or tags. There are more changes needed on the server before we can support granular cache eviction. This just gets us to parity with the status quo.

@ijjk
Copy link
Member

ijjk commented Jan 14, 2025

Tests Passed

// but it should not affect the timing of when requests reach the
// server; we pass the request to the server the immediately.
result: new Promise(async (resolve) => {
const originalResponse = await page.request.fetch(request)
Copy link
Contributor Author

Choose a reason for hiding this comment

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

The change in this file is to move when the intercepted request gets forwarded to the server — immediately, instead of at the end of the act scope. That way the test can observe/handle the request within the act scope, like I do here:

await act(
async () => {
// Reveal the link
await linkVisibilityToggle.click()
// Because the corresponding entry was evicted from the cache, this
// should trigger a new prefetch.
await TestLog.waitFor(['REQUEST: random-greeting'])
// Fulfill the prefetch request.
await pendingRequests.get('random-greeting').resolve('yo!')
},
{
includes: 'yo!',
}
)

It does not affect the timing of when the response reaches the client — that still always happens at the end.

@acdlite acdlite force-pushed the segment-cache-evict-on-revalidate branch from 9e58505 to c92a060 Compare January 14, 2025 19:21
@ijjk
Copy link
Member

ijjk commented Jan 14, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate Change
buildDuration 18s 15.5s N/A
buildDurationCached 14.7s 12.3s N/A
nodeModulesSize 418 MB 418 MB ⚠️ +31 kB
nextStartRea..uration (ms) 398ms 401ms N/A
Client Bundles (main, webpack)
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate Change
5306-HASH.js gzip 53.9 kB 54 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 239 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 acdlite/next.js segment-cache-evict-on-revalidate 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 acdlite/next.js segment-cache-evict-on-revalidate 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 acdlite/next.js segment-cache-evict-on-revalidate Change
_buildManifest.js gzip 749 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate Change
index.html gzip 524 B 523 B N/A
link.html gzip 539 B 538 B N/A
withRouter.html gzip 520 B 520 B
Overall change 520 B 520 B
Edge SSR bundle Size
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate Change
edge-ssr.js gzip 129 kB 129 kB N/A
page.js gzip 208 kB 208 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate Change
middleware-b..fest.js gzip 670 B 666 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.3 kB 31.3 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate 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 374 kB 374 kB N/A
app-page-exp..prod.js gzip 130 kB 130 kB
app-page-tur..prod.js gzip 143 kB 143 kB
app-page-tur..prod.js gzip 139 kB 139 kB
app-page.run...dev.js gzip 362 kB 362 kB N/A
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
Overall change 1.73 MB 1.73 MB
build cache Overall increase ⚠️
vercel/next.js canary acdlite/next.js segment-cache-evict-on-revalidate Change
0.pack gzip 2.09 MB 2.09 MB ⚠️ +397 B
index.pack gzip 75.5 kB 74.9 kB N/A
Overall change 2.09 MB 2.09 MB ⚠️ +397 B
Diff details
Diff for 5306-HASH.js

Diff too large to display

Diff for main-HASH.js

Diff too large to display

Diff for app-page-exp..ntime.dev.js

Diff too large to display

Diff for app-page.runtime.dev.js

Diff too large to display

Commit: e2146e8

@acdlite acdlite force-pushed the segment-cache-evict-on-revalidate branch from c92a060 to 921dbf0 Compare January 14, 2025 19:23
This implements evicting the client cache when a Server Action calls
revalidatePath or revalidateTag.

Similar to the old prefetching implementation, it works by clearing the
entire client cache, as opposed to only the affected path or tags. There
are more changes needed on the server before we can support granular
cache eviction. This just gets us to parity with the status quo.
@acdlite acdlite force-pushed the segment-cache-evict-on-revalidate branch from 921dbf0 to e2146e8 Compare January 15, 2025 17:15
@acdlite acdlite merged commit 9320532 into vercel:canary Jan 16, 2025
109 checks passed
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jan 31, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants