-
Notifications
You must be signed in to change notification settings - Fork 27k
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
Fix: HMR in multi-zone handling 🌱 #59471
Conversation
776392e
to
97d368f
Compare
Kindly review this PR cc @ztanner 🙏 |
Any updates on this, its blocking deployments for me. |
Stats from current PRDefault BuildGeneral Overall increase
|
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
buildDuration | 12.9s | 13s | N/A |
buildDurationCached | 7.1s | 6.3s | N/A |
nodeModulesSize | 199 MB | 199 MB | |
nextStartRea..uration (ms) | 425ms | 430ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
193.HASH.js gzip | 181 B | 182 B | N/A |
3f784ff6-HASH.js gzip | 53.3 kB | 53.3 kB | N/A |
433-HASH.js gzip | 28.6 kB | 28.6 kB | N/A |
framework-HASH.js gzip | 45.2 kB | 45.2 kB | ✓ |
main-app-HASH.js gzip | 239 B | 242 B | N/A |
main-HASH.js gzip | 31.7 kB | 31.8 kB | N/A |
webpack-HASH.js gzip | 1.7 kB | 1.7 kB | N/A |
Overall change | 45.2 kB | 45.2 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
_app-HASH.js gzip | 194 B | 195 B | N/A |
_error-HASH.js gzip | 183 B | 181 B | N/A |
amp-HASH.js gzip | 504 B | 502 B | N/A |
css-HASH.js gzip | 321 B | 321 B | ✓ |
dynamic-HASH.js gzip | 2.5 kB | 2.5 kB | N/A |
edge-ssr-HASH.js gzip | 255 B | 253 B | N/A |
head-HASH.js gzip | 350 B | 349 B | N/A |
hooks-HASH.js gzip | 369 B | 369 B | ✓ |
image-HASH.js gzip | 4.28 kB | 4.28 kB | N/A |
index-HASH.js gzip | 255 B | 256 B | N/A |
link-HASH.js gzip | 2.61 kB | 2.61 kB | ✓ |
routerDirect..HASH.js gzip | 312 B | 311 B | N/A |
script-HASH.js gzip | 385 B | 383 B | N/A |
withRouter-HASH.js gzip | 307 B | 308 B | N/A |
1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
Overall change | 3.4 kB | 3.4 kB | ✓ |
Client Build Manifests
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
_buildManifest.js gzip | 483 B | 484 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
index.html gzip | 527 B | 527 B | ✓ |
link.html gzip | 541 B | 539 B | N/A |
withRouter.html gzip | 523 B | 522 B | N/A |
Overall change | 527 B | 527 B | ✓ |
Edge SSR bundle Size
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
edge-ssr.js gzip | 93.8 kB | 93.8 kB | N/A |
page.js gzip | 148 kB | 148 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 621 B | 624 B | N/A |
middleware-r..fest.js gzip | 151 B | 151 B | ✓ |
middleware.js gzip | 37.4 kB | 37.4 kB | N/A |
edge-runtime..pack.js gzip | 1.92 kB | 1.92 kB | ✓ |
Overall change | 2.07 kB | 2.07 kB | ✓ |
Next Runtimes
vercel/next.js canary | agustints/next.js fix-hmr-dev-environment | Change | |
---|---|---|---|
app-page-exp...dev.js gzip | 169 kB | 169 kB | ✓ |
app-page-exp..prod.js gzip | 95.1 kB | 95.1 kB | ✓ |
app-page-tur..prod.js gzip | 95.8 kB | 95.8 kB | ✓ |
app-page-tur..prod.js gzip | 90.4 kB | 90.4 kB | ✓ |
app-page.run...dev.js gzip | 142 kB | 142 kB | ✓ |
app-page.run..prod.js gzip | 89.7 kB | 89.7 kB | ✓ |
app-route-ex...dev.js gzip | 24.1 kB | 24.1 kB | ✓ |
app-route-ex..prod.js gzip | 16.7 kB | 16.7 kB | ✓ |
app-route-tu..prod.js gzip | 16.7 kB | 16.7 kB | ✓ |
app-route-tu..prod.js gzip | 16.3 kB | 16.3 kB | ✓ |
app-route.ru...dev.js gzip | 23.5 kB | 23.5 kB | ✓ |
app-route.ru..prod.js gzip | 16.3 kB | 16.3 kB | ✓ |
pages-api-tu..prod.js gzip | 9.38 kB | 9.38 kB | ✓ |
pages-api.ru...dev.js gzip | 9.65 kB | 9.65 kB | ✓ |
pages-api.ru..prod.js gzip | 9.37 kB | 9.37 kB | ✓ |
pages-turbo...prod.js gzip | 21.9 kB | 21.9 kB | ✓ |
pages.runtim...dev.js gzip | 22.5 kB | 22.5 kB | ✓ |
pages.runtim..prod.js gzip | 21.9 kB | 21.9 kB | ✓ |
server.runti..prod.js gzip | 49.5 kB | 49.5 kB | ✓ |
Overall change | 939 kB | 939 kB | ✓ |
Failing test suitesCommit: 7cf487f
Expand output● app dir - navigation › query string › useParams identity between renders › should be stable in pages
Read more about building and testing Next.js in contributing.md. |
Hi @agustints, thanks for the PR! Looks like there are some failing tests, do you have time to look into them? |
80b8edd
to
e81e60f
Compare
c82a921
to
dd94a54
Compare
Hi @ztanner thank you so much for taking a look here, I appreciate that 🤝 I hope we can merge this PR since it will allow many projects to be updated from Next.js v13.4.3 to the latest version 🚀 |
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.
Thanks @agustints! It still looks like one of the same tests from before is still failing. I've also left some comments around confusion I had with the logic that was introduced.
d15e3e3
to
af95dea
Compare
Hi @ztanner thanks for your comments, I appreciate that, I updated router-server.ts logic and now seems that tests are working again 🚀 |
af95dea
to
c8685c4
Compare
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.
Thank you!
What?
When running a multi-zone app in dev, guest app pages would infinitely reload if you change the basePath of the host app to the default one (omit basePath settings in next.config.js) (empty string
""
as per Next.js docs).Why?
The HMR upgrade request would fail and get caught into a retry loop. In the multi-zone case, they fail because the upgrade request would be sent again for a request that had already been upgraded. This resulted in a "server.handleUpgrade() was called more than once with the same socket" error, causing the upgrade request to fail.
Every time a retry occurred, the page would trigger a full refresh since certain HMR errors cause the browser to reload.
How?
This ensures the upgrade handler only responds to requests that match the configured basePath (considering when there is no basePath). Default basePath for Next.js applications it's an empty string
""
.Ref: https://nextjs.org/docs/app/api-reference/next-config-js/basePath
Other fixes & updates related to the bug:
Closes NEXT-1797
Fixes #59161
Fixes #56615
Fixes #54454