-
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
Add RenderResult
#27319
Add RenderResult
#27319
Conversation
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
a67554d
to
225aa7e
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
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.
I think we should rename the property html
to something like result
to avoid confusion.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Failing test suitesCommit: 7520123 test/integration/auto-export-serverless/test/index.test.js
Expand output● Auto Export Serverless › Refreshes query on mount
test/integration/404-page-custom-error/test/index.test.js
Expand output● Default 404 Page with custom _error › serverless mode › should build successfully
● Default 404 Page with custom _error › serverless mode › should respond to 404 correctly
● Default 404 Page with custom _error › serverless mode › should render error correctly
● Default 404 Page with custom _error › serverless mode › should render index page normal
● Default 404 Page with custom _error › serverless mode › should have output 404.html
test/integration/api-catch-all/test/index.test.js
Expand output● API routes › Serverless support › should return data when catch-all
● API routes › Serverless support › should return redirect when catch-all with index and trailing slash
● API routes › Serverless support › should return data when catch-all with index and trailing slash
● API routes › Serverless support › should return data when catch-all with index and no trailing slash
test/integration/export-dynamic-pages-serverless/test/index.test.js
Expand output● Export Dyanmic Pages › should of exported with correct asPath
● Export Dyanmic Pages › should hydrate with correct asPath
● Test suite failed to run
test/integration/image-optimization/test/index.test.js
Expand output● Image optimization for serverless apps › On a static page › should not preload tiny images
● Image optimization for serverless apps › On a static page › should not add a preload if one already exists
● Image optimization for serverless apps › On a static page › should not preload hidden images
● Image optimization for serverless apps › On a static page › should not preload SVG images
● Image optimization for serverless apps › On a static page › should preload exactly two eligible images
● Image optimization for serverless apps › On an SSR page › should not preload tiny images
● Image optimization for serverless apps › On an SSR page › should not add a preload if one already exists
● Image optimization for serverless apps › On an SSR page › should not preload hidden images
● Image optimization for serverless apps › On an SSR page › should not preload SVG images
● Image optimization for serverless apps › On an SSR page › should preload exactly two eligible images
● Image optimization for serverless apps › On a static page with querystring › should preload exactly eligible image
|
This comment has been minimized.
This comment has been minimized.
Stats from current PRDefault Build (Decrease detected ✓)General Overall increase
|
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
buildDuration | 13.7s | 14.2s | |
buildDurationCached | 3.1s | 3s | -32ms |
nodeModulesSize | 50.4 MB | 50.4 MB |
Page Load Tests Overall decrease ⚠️
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 2.447 | 2.489 | |
/ avg req/sec | 1021.59 | 1004.35 | |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.511 | 1.604 | |
/error-in-render avg req/sec | 1654.01 | 1558.69 |
Client Bundles (main, webpack, commons)
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
359.HASH.js gzip | 2.96 kB | 2.96 kB | ✓ |
745.HASH.js gzip | 180 B | 180 B | ✓ |
framework-HASH.js gzip | 42.2 kB | 42.2 kB | ✓ |
main-HASH.js gzip | 21 kB | 21 kB | ✓ |
webpack-HASH.js gzip | 1.53 kB | 1.53 kB | ✓ |
Overall change | 67.9 kB | 67.9 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31.1 kB | 31.1 kB | ✓ |
Overall change | 31.1 kB | 31.1 kB | ✓ |
Client Pages
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
_app-HASH.js gzip | 803 B | 803 B | ✓ |
_error-HASH.js gzip | 3.06 kB | 3.06 kB | ✓ |
amp-HASH.js gzip | 554 B | 554 B | ✓ |
css-HASH.js gzip | 329 B | 329 B | ✓ |
dynamic-HASH.js gzip | 2.52 kB | 2.52 kB | ✓ |
head-HASH.js gzip | 2.28 kB | 2.28 kB | ✓ |
hooks-HASH.js gzip | 903 B | 903 B | ✓ |
image-HASH.js gzip | 5.63 kB | 5.63 kB | ✓ |
index-HASH.js gzip | 261 B | 261 B | ✓ |
link-HASH.js gzip | 1.66 kB | 1.66 kB | ✓ |
routerDirect..HASH.js gzip | 319 B | 319 B | ✓ |
script-HASH.js gzip | 387 B | 387 B | ✓ |
withRouter-HASH.js gzip | 320 B | 320 B | ✓ |
bb14e60e810b..30f.css gzip | 125 B | 125 B | ✓ |
Overall change | 19.1 kB | 19.1 kB | ✓ |
Client Build Manifests
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
_buildManifest.js gzip | 489 B | 489 B | ✓ |
Overall change | 489 B | 489 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
index.html gzip | 531 B | 531 B | ✓ |
link.html gzip | 544 B | 544 B | ✓ |
withRouter.html gzip | 525 B | 525 B | ✓ |
Overall change | 1.6 kB | 1.6 kB | ✓ |
Webpack 4 Mode (Increase detected ⚠️ )
General Overall increase ⚠️
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
buildDuration | 10.9s | 10.9s | |
buildDurationCached | 4.2s | 4.2s | |
nodeModulesSize | 50.4 MB | 50.4 MB |
Page Load Tests Overall increase ✓
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 2.447 | 2.466 | |
/ avg req/sec | 1021.64 | 1013.83 | |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.56 | 1.539 | -0.02 |
/error-in-render avg req/sec | 1602.19 | 1624.18 | +21.99 |
Client Bundles (main, webpack, commons)
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
17.HASH.js gzip | 2.98 kB | 2.98 kB | ✓ |
18.HASH.js gzip | 185 B | 185 B | ✓ |
677f882d2ed8..HASH.js gzip | 13.8 kB | 13.8 kB | ✓ |
framework.HASH.js gzip | 41.9 kB | 41.9 kB | ✓ |
main-HASH.js gzip | 8.4 kB | 8.4 kB | ✓ |
webpack-HASH.js gzip | 1.22 kB | 1.22 kB | ✓ |
Overall change | 68.5 kB | 68.5 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31.3 kB | 31.3 kB | ✓ |
Overall change | 31.3 kB | 31.3 kB | ✓ |
Client Pages
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
_app-HASH.js gzip | 791 B | 791 B | ✓ |
_error-HASH.js gzip | 3.76 kB | 3.76 kB | ✓ |
amp-HASH.js gzip | 552 B | 552 B | ✓ |
css-HASH.js gzip | 333 B | 333 B | ✓ |
dynamic-HASH.js gzip | 2.71 kB | 2.71 kB | ✓ |
head-HASH.js gzip | 2.97 kB | 2.97 kB | ✓ |
hooks-HASH.js gzip | 911 B | 911 B | ✓ |
index-HASH.js gzip | 231 B | 231 B | ✓ |
link-HASH.js gzip | 1.64 kB | 1.64 kB | ✓ |
routerDirect..HASH.js gzip | 298 B | 298 B | ✓ |
script-HASH.js gzip | 3.02 kB | 3.02 kB | ✓ |
withRouter-HASH.js gzip | 294 B | 294 B | ✓ |
e025d2764813..52f.css gzip | 125 B | 125 B | ✓ |
Overall change | 17.6 kB | 17.6 kB | ✓ |
Client Build Manifests
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
_buildManifest.js gzip | 500 B | 500 B | ✓ |
Overall change | 500 B | 500 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | azukaru/next.js x-add-render-result-stream | Change | |
---|---|---|---|
index.html gzip | 577 B | 577 B | ✓ |
link.html gzip | 588 B | 588 B | ✓ |
withRouter.html gzip | 569 B | 569 B | ✓ |
Overall change | 1.73 kB | 1.73 kB | ✓ |
Adds `RenderResult`, replacing the `string` that `renderToHTML` used to return, with an `Observable`-like API that callers can use to subscribe and get a callback when chunks are available to flush, etc. This is the last architectural change needed for streaming. There are, however, other things currently standing in the way of streaming. For example, it is common to mutate `res` in `getServerSideProps` to do routing work, or write headers, before fetching page data. This pattern effectively nullifies any advantages of streaming. I may do a follow-up PR that adds an experimental alternative for applications not using React 18, but the main purpose for this support is for Suspense and Server Components. For that reason, there's no actual streaming here yet: instead we just flush a single chunk. A follow-up PR will add support for streaming suspense boundaries in React 18.
Adds
RenderResult
, replacing thestring
thatrenderToHTML
used to return, with anObservable
-like API that callers can use to subscribe and get a callback when chunks are available to flush, etc.This is the last architectural change needed for streaming. There are, however, other things currently standing in the way of streaming. For example, it is common to mutate
res
ingetServerSideProps
to do routing work, or write headers, before fetching page data. This pattern effectively nullifies any advantages of streaming. I may do a follow-up PR that adds an experimental alternative for applications not using React 18, but the main purpose for this support is for Suspense and Server Components.For that reason, there's no actual streaming here yet: instead we just flush a single chunk. A follow-up PR will add support for streaming suspense boundaries in React 18.