-
Notifications
You must be signed in to change notification settings - Fork 28.3k
[dynamicIO] cache tracking for import() #74152
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
base: canary
Are you sure you want to change the base?
Conversation
Stats from current PRDefault Build (Increase detected
|
vercel/next.js canary | vercel/next.js lubieowoce/dynamic-import-cache-tracking | Change | |
---|---|---|---|
buildDuration | 17.9s | 16.1s | N/A |
buildDurationCached | 15.2s | 12.8s | N/A |
nodeModulesSize | 417 MB | 417 MB | |
nextStartRea..uration (ms) | 470ms | 476ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | vercel/next.js lubieowoce/dynamic-import-cache-tracking | Change | |
---|---|---|---|
1187-HASH.js gzip | 52.6 kB | 52.6 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 | 232 B | 235 B | N/A |
main-HASH.js gzip | 34.1 kB | 34.1 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 lubieowoce/dynamic-import-cache-tracking | 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 lubieowoce/dynamic-import-cache-tracking | 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 lubieowoce/dynamic-import-cache-tracking | 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 lubieowoce/dynamic-import-cache-tracking | Change | |
---|---|---|---|
index.html gzip | 523 B | 524 B | N/A |
link.html gzip | 538 B | 538 B | ✓ |
withRouter.html gzip | 519 B | 521 B | N/A |
Overall change | 538 B | 538 B | ✓ |
Edge SSR bundle Size
vercel/next.js canary | vercel/next.js lubieowoce/dynamic-import-cache-tracking | Change | |
---|---|---|---|
edge-ssr.js gzip | 128 kB | 128 kB | N/A |
page.js gzip | 206 kB | 206 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size
vercel/next.js canary | vercel/next.js lubieowoce/dynamic-import-cache-tracking | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 671 B | 668 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 lubieowoce/dynamic-import-cache-tracking | 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 | 363 kB | 363 kB | N/A |
app-page-exp..prod.js gzip | 129 kB | 129 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 | 352 kB | 352 kB | N/A |
app-page.run..prod.js gzip | 125 kB | 125 kB | ✓ |
app-route-ex...dev.js gzip | 37.5 kB | 37.5 kB | ✓ |
app-route-ex..prod.js gzip | 25.5 kB | 25.5 kB | ✓ |
app-route-tu..prod.js gzip | 25.5 kB | 25.5 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 | vercel/next.js lubieowoce/dynamic-import-cache-tracking | Change | |
---|---|---|---|
0.pack gzip | 2.08 MB | 2.09 MB | |
index.pack gzip | 74 kB | 74 kB | N/A |
Overall change | 2.08 MB | 2.09 MB |
Diff details
Diff for middleware.js
Diff too large to display
Diff for edge-ssr.js
Diff too large to display
Diff for main-HASH.js
Diff too large to display
6041b43
to
38a55f7
Compare
Failing test suitesCommit: 1c164e1
Expand output● app-dir-hmr › filesystem changes › should update server components pages when env files is changed (node-module-var)
Read more about building and testing Next.js in contributing.md.
Expand output● segment cache (basic tests) › navigate to page with lazily-generated (not at build time) static param
Read more about building and testing Next.js in contributing.md. |
2bc73f4
to
96ab4b5
Compare
96ab4b5
to
6db6d69
Compare
3b9bb38
to
aa83dee
Compare
This stack of pull requests is managed by Graphite. Learn more about stacking. |
aa83dee
to
0fb433f
Compare
0fb433f
to
02aadc1
Compare
1cd26f8
to
b5c55e7
Compare
31b97c3
to
5b283a6
Compare
d410aa7
to
8c3b270
Compare
8c3b270
to
4476bbe
Compare
@@ -7,7 +7,7 @@ export type SchedulerFn<T = void> = (cb: ScheduledFn<T>) => void | |||
* | |||
* @param cb the function to schedule | |||
*/ | |||
export const scheduleOnNextTick = <T = void>(cb: ScheduledFn<T>): void => { | |||
export const scheduleOnNextTick = (cb: ScheduledFn<void>) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
just some drive-by cleanups, the T
param is unnecessary because it doesn't ever make sense to return a value here
4476bbe
to
cd04058
Compare
@@ -28,7 +28,7 @@ pids | |||
coverage | |||
|
|||
# test output | |||
test/**/out* | |||
test/**/out/* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the previous pattern accidentally matched test/e2e/app-dir/dynamic-io-dynamic-imports/app/outside-of-render
cd04058
to
1c164e1
Compare
This PR introduces some extra tracking which makes us treat
import(...)
like a call to a cached function. Thanks to this,await import(...)
will no longer cause dynamicity errors indynamicIO
.The motivation is the same as allowing
fs.readFileSync
-- if something is available on the server at prerender time, we don't consider it IO.Fixes #72589
Implementation notes
The tracking is implemented via an SWC transform (
track_dynamic_imports.ts
) that turnsimport(...)
intotrackDynamicImport(import(...))
.trackDynamicImport(promise)
tracks the promise globally, without usingcacheSignal
. The prospective render subscribes to pending modules usingtrackPendingModules(cacheSignal)
, which causes the prospective render to wait for allimport()
s to finish before proceeding to the final render. The mechanism is analogous to'use cache'
, but the "result" of animport()
is stored in the module cache instead; when we invoke theimport()
again in the actual prerender, it will resolve at microtask-speed, like we need it to.The transform is enabled for all modules that run server-side, both RSC and SSR, because the prerender runs both. This also includes route handlers, because we also use a
cacheSignal
when prerendering those.Notably, we also instrument
import()
innode_modules
to account for libraries that do lazy initialization.I've also had to adjust the prospective client render in PPR mode to wait for
cacheSignal.cacheReady()
- otherwise, it wouldn't wait forimport()
s to resolve before doing the final client render, which'd subsequently cause a dynamicity error.(we didn't need to wait for
cacheSignal
before, because all cached promises would've already been awaited in the server prerender)Finally, we no longer need
warmFlightResponse
, becausetrackPendingModules
already makes thecacheSignal
wait for all loading chunks to finish, so we don't need to do it ahead of time.