-
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
Image component lazy loading #17916
Image component lazy loading #17916
Conversation
Failing test suitesCommit: 24ec9ee test/integration/app-document/test/index.test.js
Expand output● Document and App › Rendering via HTTP › _document › It adds nonces to all scripts and preload links
● Document and App › Rendering via HTTP › _document › It adds crossOrigin to all scripts and preload links
test/integration/build-output/test/index.test.js
Expand output● Build Output › Basic Application Output › should not deviate from snapshot
test/integration/size-limit/test/index.test.js
Expand output● Production response size › should not increase the overall response size of default build
● Production response size › should not increase the overall response size of modern build
|
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.
for the following block
if("IntersectionObserver"in window)
should there be an else
where we just go and modify all .data-src to src so if the browser does not support IntersectionObserver the user would still see the images.
Stats from current PRDefault Server Mode (Increase detected
|
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
buildDuration | 12s | 12.7s | |
nodeModulesSize | 64.3 MB | 64.4 MB |
Page Load Tests Overall increase ✓
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 2.419 | 2.327 | -0.09 |
/ avg req/sec | 1033.54 | 1074.14 | +40.6 |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.457 | 1.46 | 0 |
/error-in-render avg req/sec | 1715.8 | 1712.17 |
Client Bundles (main, webpack, commons)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..7765.js gzip | 11.1 kB | 11.1 kB | ✓ |
framework.HASH.js gzip | 39 kB | 39 kB | ✓ |
main-43e96dd..7c44.js gzip | 7.3 kB | 7.3 kB | ✓ |
webpack-e067..f178.js gzip | 751 B | 751 B | ✓ |
Overall change | 58.1 kB | 58.1 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..dule.js gzip | 6.94 kB | 6.94 kB | ✓ |
framework.HA..dule.js gzip | 39 kB | 39 kB | ✓ |
main-ee66c17..dule.js gzip | 6.29 kB | 6.29 kB | ✓ |
webpack-07c5..dule.js gzip | 751 B | 751 B | ✓ |
Overall change | 53 kB | 53 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
polyfills-4b..e242.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-9a0b9e1..b37e.js gzip | 1.28 kB | 1.28 kB | ✓ |
_error-ed1b0..8fbd.js gzip | 3.44 kB | 3.44 kB | ✓ |
hooks-89731c..c609.js gzip | 887 B | 887 B | ✓ |
index-17468f..5d83.js gzip | 227 B | 227 B | ✓ |
link-89ad9e7..25bb.js gzip | 1.34 kB | 1.34 kB | ✓ |
routerDirect..924c.js gzip | 284 B | 284 B | ✓ |
withRouter-7..c13d.js gzip | 284 B | 284 B | ✓ |
Overall change | 7.74 kB | 7.74 kB | ✓ |
Client Pages Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-75d3a82..dule.js gzip | 625 B | 625 B | ✓ |
_error-4469a..dule.js gzip | 2.29 kB | 2.29 kB | ✓ |
hooks-cbf13f..dule.js gzip | 387 B | 387 B | ✓ |
index-b9a643..dule.js gzip | 226 B | 226 B | ✓ |
link-aeb707b..dule.js gzip | 1.29 kB | 1.29 kB | ✓ |
routerDirect..dule.js gzip | 284 B | 284 B | ✓ |
withRouter-f..dule.js gzip | 282 B | 282 B | ✓ |
Overall change | 5.39 kB | 5.39 kB | ✓ |
Client Build Manifests
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_buildManifest.js gzip | 322 B | 322 B | ✓ |
_buildManife..dule.js gzip | 329 B | 329 B | ✓ |
Overall change | 651 B | 651 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
index.html gzip | 1 kB | 1 kB | ✓ |
link.html gzip | 1.01 kB | 1.01 kB | ✓ |
withRouter.html gzip | 995 B | 995 B | ✓ |
Overall change | 3.01 kB | 3.01 kB | ✓ |
Serverless Mode
General Overall increase ⚠️
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
buildDuration | 14.1s | 13.7s | -324ms |
nodeModulesSize | 64.3 MB | 64.4 MB |
Client Bundles (main, webpack, commons)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..7765.js gzip | 11.1 kB | 11.1 kB | ✓ |
framework.HASH.js gzip | 39 kB | 39 kB | ✓ |
main-43e96dd..7c44.js gzip | 7.3 kB | 7.3 kB | ✓ |
webpack-e067..f178.js gzip | 751 B | 751 B | ✓ |
Overall change | 58.1 kB | 58.1 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..dule.js gzip | 6.94 kB | 6.94 kB | ✓ |
framework.HA..dule.js gzip | 39 kB | 39 kB | ✓ |
main-ee66c17..dule.js gzip | 6.29 kB | 6.29 kB | ✓ |
webpack-07c5..dule.js gzip | 751 B | 751 B | ✓ |
Overall change | 53 kB | 53 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
polyfills-4b..e242.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-9a0b9e1..b37e.js gzip | 1.28 kB | 1.28 kB | ✓ |
_error-ed1b0..8fbd.js gzip | 3.44 kB | 3.44 kB | ✓ |
hooks-89731c..c609.js gzip | 887 B | 887 B | ✓ |
index-17468f..5d83.js gzip | 227 B | 227 B | ✓ |
link-89ad9e7..25bb.js gzip | 1.34 kB | 1.34 kB | ✓ |
routerDirect..924c.js gzip | 284 B | 284 B | ✓ |
withRouter-7..c13d.js gzip | 284 B | 284 B | ✓ |
Overall change | 7.74 kB | 7.74 kB | ✓ |
Client Pages Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-75d3a82..dule.js gzip | 625 B | 625 B | ✓ |
_error-4469a..dule.js gzip | 2.29 kB | 2.29 kB | ✓ |
hooks-cbf13f..dule.js gzip | 387 B | 387 B | ✓ |
index-b9a643..dule.js gzip | 226 B | 226 B | ✓ |
link-aeb707b..dule.js gzip | 1.29 kB | 1.29 kB | ✓ |
routerDirect..dule.js gzip | 284 B | 284 B | ✓ |
withRouter-f..dule.js gzip | 282 B | 282 B | ✓ |
Overall change | 5.39 kB | 5.39 kB | ✓ |
Client Build Manifests
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_buildManifest.js gzip | 322 B | 322 B | ✓ |
_buildManife..dule.js gzip | 329 B | 329 B | ✓ |
Overall change | 651 B | 651 B | ✓ |
Serverless bundles
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_error.js | 1.06 MB | 1.06 MB | ✓ |
404.html | 4.34 kB | 4.34 kB | ✓ |
hooks.html | 3.92 kB | 3.92 kB | ✓ |
index.js | 1.06 MB | 1.06 MB | ✓ |
link.js | 1.1 MB | 1.1 MB | ✓ |
routerDirect.js | 1.1 MB | 1.1 MB | ✓ |
withRouter.js | 1.1 MB | 1.1 MB | ✓ |
Overall change | 5.42 MB | 5.42 MB | ✓ |
Yes, that can be added in a follow-up PR though 👍 |
…-component # Conflicts: # packages/next/client/image.tsx
Stats from current PRDefault Server Mode (Increase detected
|
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
buildDuration | 13.4s | 13.3s | -109ms |
nodeModulesSize | 64.4 MB | 64.4 MB |
Page Load Tests Overall increase ✓
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 2.51 | 2.509 | 0 |
/ avg req/sec | 996.12 | 996.24 | +0.12 |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.559 | 1.551 | -0.01 |
/error-in-render avg req/sec | 1603.74 | 1611.39 | +7.65 |
Client Bundles (main, webpack, commons)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..7765.js gzip | 11.1 kB | 11.1 kB | ✓ |
framework.HASH.js gzip | 39 kB | 39 kB | ✓ |
main-5aa1543..4e79.js gzip | 7.34 kB | 7.34 kB | ✓ |
webpack-e067..f178.js gzip | 751 B | 751 B | ✓ |
Overall change | 58.1 kB | 58.1 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..dule.js gzip | 6.94 kB | 6.94 kB | ✓ |
framework.HA..dule.js gzip | 39 kB | 39 kB | ✓ |
main-7d849dd..dule.js gzip | 6.32 kB | 6.32 kB | ✓ |
webpack-07c5..dule.js gzip | 751 B | 751 B | ✓ |
Overall change | 53 kB | 53 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
polyfills-4b..e242.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-9a0b9e1..b37e.js gzip | 1.28 kB | 1.28 kB | ✓ |
_error-ed1b0..8fbd.js gzip | 3.44 kB | 3.44 kB | ✓ |
hooks-89731c..c609.js gzip | 887 B | 887 B | ✓ |
index-17468f..5d83.js gzip | 227 B | 227 B | ✓ |
link-89ad9e7..25bb.js gzip | 1.34 kB | 1.34 kB | ✓ |
routerDirect..924c.js gzip | 284 B | 284 B | ✓ |
withRouter-7..c13d.js gzip | 284 B | 284 B | ✓ |
Overall change | 7.74 kB | 7.74 kB | ✓ |
Client Pages Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-75d3a82..dule.js gzip | 625 B | 625 B | ✓ |
_error-4469a..dule.js gzip | 2.29 kB | 2.29 kB | ✓ |
hooks-cbf13f..dule.js gzip | 387 B | 387 B | ✓ |
index-b9a643..dule.js gzip | 226 B | 226 B | ✓ |
link-aeb707b..dule.js gzip | 1.29 kB | 1.29 kB | ✓ |
routerDirect..dule.js gzip | 284 B | 284 B | ✓ |
withRouter-f..dule.js gzip | 282 B | 282 B | ✓ |
Overall change | 5.39 kB | 5.39 kB | ✓ |
Client Build Manifests
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_buildManifest.js gzip | 322 B | 322 B | ✓ |
_buildManife..dule.js gzip | 329 B | 329 B | ✓ |
Overall change | 651 B | 651 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
index.html gzip | 1 kB | 1 kB | ✓ |
link.html gzip | 1.01 kB | 1.01 kB | ✓ |
withRouter.html gzip | 996 B | 996 B | ✓ |
Overall change | 3.01 kB | 3.01 kB | ✓ |
Serverless Mode
General Overall increase ⚠️
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
buildDuration | 15.2s | 15.2s | |
nodeModulesSize | 64.4 MB | 64.4 MB |
Client Bundles (main, webpack, commons)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..7765.js gzip | 11.1 kB | 11.1 kB | ✓ |
framework.HASH.js gzip | 39 kB | 39 kB | ✓ |
main-5aa1543..4e79.js gzip | 7.34 kB | 7.34 kB | ✓ |
webpack-e067..f178.js gzip | 751 B | 751 B | ✓ |
Overall change | 58.1 kB | 58.1 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
677f882d2ed8..dule.js gzip | 6.94 kB | 6.94 kB | ✓ |
framework.HA..dule.js gzip | 39 kB | 39 kB | ✓ |
main-7d849dd..dule.js gzip | 6.32 kB | 6.32 kB | ✓ |
webpack-07c5..dule.js gzip | 751 B | 751 B | ✓ |
Overall change | 53 kB | 53 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
polyfills-4b..e242.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-9a0b9e1..b37e.js gzip | 1.28 kB | 1.28 kB | ✓ |
_error-ed1b0..8fbd.js gzip | 3.44 kB | 3.44 kB | ✓ |
hooks-89731c..c609.js gzip | 887 B | 887 B | ✓ |
index-17468f..5d83.js gzip | 227 B | 227 B | ✓ |
link-89ad9e7..25bb.js gzip | 1.34 kB | 1.34 kB | ✓ |
routerDirect..924c.js gzip | 284 B | 284 B | ✓ |
withRouter-7..c13d.js gzip | 284 B | 284 B | ✓ |
Overall change | 7.74 kB | 7.74 kB | ✓ |
Client Pages Modern
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_app-75d3a82..dule.js gzip | 625 B | 625 B | ✓ |
_error-4469a..dule.js gzip | 2.29 kB | 2.29 kB | ✓ |
hooks-cbf13f..dule.js gzip | 387 B | 387 B | ✓ |
index-b9a643..dule.js gzip | 226 B | 226 B | ✓ |
link-aeb707b..dule.js gzip | 1.29 kB | 1.29 kB | ✓ |
routerDirect..dule.js gzip | 284 B | 284 B | ✓ |
withRouter-f..dule.js gzip | 282 B | 282 B | ✓ |
Overall change | 5.39 kB | 5.39 kB | ✓ |
Client Build Manifests
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_buildManifest.js gzip | 322 B | 322 B | ✓ |
_buildManife..dule.js gzip | 329 B | 329 B | ✓ |
Overall change | 651 B | 651 B | ✓ |
Serverless bundles
vercel/next.js canary | azukaru/next.js image-component | Change | |
---|---|---|---|
_error.js | 1.06 MB | 1.06 MB | ✓ |
404.html | 4.34 kB | 4.34 kB | ✓ |
hooks.html | 3.92 kB | 3.92 kB | ✓ |
index.js | 1.06 MB | 1.06 MB | ✓ |
link.js | 1.1 MB | 1.1 MB | ✓ |
routerDirect.js | 1.1 MB | 1.1 MB | ✓ |
withRouter.js | 1.1 MB | 1.1 MB | ✓ |
Overall change | 5.42 MB | 5.42 MB | ✓ |
AMP doesn't support |
Follow-up #17916 Correcting type errors and organizing redundant descriptions.
This PR adds intersection observer-based lazy loading to the image component. Any image with the 'lazy' attribute will use this functionality.
Before merging: Some clarification is needed on how this will interact with AMP mode, since it renders the lazy images without a src, then updates them using JavaScript. I'd like to get some more insight on that so I can update this PR if needed ASAP.