-
Notifications
You must be signed in to change notification settings - Fork 27.2k
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 support for browserslist and legacyBrowsers experimental option #36584
Conversation
Implements vercel#33227 - Applies browserslist to JS transforms - You don't have to use browserslist, there's also `legacyBrowsers: false` which will be the new default in Next.js 13. See vercel#33227 for which browsers and why. ``` module.exports = { experimental: { legacyBrowsers: false } } ```
This comment was marked as outdated.
This comment was marked as outdated.
Stats from current PRDefault Build (Increase detected
|
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
buildDuration | 15.7s | 15.7s | -63ms |
buildDurationCached | 6.5s | 6.6s | |
nodeModulesSize | 478 MB | 478 MB |
Page Load Tests Overall increase ✓
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 3.773 | 3.748 | -0.02 |
/ avg req/sec | 662.63 | 667 | +4.37 |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.201 | 1.179 | -0.02 |
/error-in-render avg req/sec | 2081.7 | 2120.92 | +39.22 |
Client Bundles (main, webpack)
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
925.HASH.js gzip | 179 B | 179 B | ✓ |
framework-HASH.js gzip | 42 kB | 42 kB | ✓ |
main-HASH.js gzip | 28.7 kB | 28.7 kB | ✓ |
webpack-HASH.js gzip | 1.44 kB | 1.44 kB | ✓ |
Overall change | 72.4 kB | 72.4 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
_app-HASH.js gzip | 1.36 kB | 1.36 kB | ✓ |
_error-HASH.js gzip | 193 B | 193 B | ✓ |
amp-HASH.js gzip | 308 B | 308 B | ✓ |
css-HASH.js gzip | 327 B | 327 B | ✓ |
dynamic-HASH.js gzip | 2.7 kB | 2.7 kB | ✓ |
head-HASH.js gzip | 359 B | 359 B | ✓ |
hooks-HASH.js gzip | 920 B | 920 B | ✓ |
image-HASH.js gzip | 5.71 kB | 5.71 kB | ✓ |
index-HASH.js gzip | 263 B | 263 B | ✓ |
link-HASH.js gzip | 2.65 kB | 2.65 kB | ✓ |
routerDirect..HASH.js gzip | 320 B | 320 B | ✓ |
script-HASH.js gzip | 391 B | 391 B | ✓ |
withRouter-HASH.js gzip | 318 B | 318 B | ✓ |
85e02e95b279..7e3.css gzip | 107 B | 107 B | ✓ |
Overall change | 15.9 kB | 15.9 kB | ✓ |
Client Build Manifests
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
_buildManifest.js gzip | 458 B | 458 B | ✓ |
Overall change | 458 B | 458 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
index.html gzip | 532 B | 532 B | ✓ |
link.html gzip | 544 B | 544 B | ✓ |
withRouter.html gzip | 527 B | 527 B | ✓ |
Overall change | 1.6 kB | 1.6 kB | ✓ |
Default Build with SWC (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
buildDuration | 18.1s | 18.4s | |
buildDurationCached | 6.5s | 6.5s | |
nodeModulesSize | 478 MB | 478 MB |
Page Load Tests Overall decrease ⚠️
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 3.755 | 3.748 | -0.01 |
/ avg req/sec | 665.77 | 667.06 | +1.29 |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.184 | 1.196 | |
/error-in-render avg req/sec | 2111.35 | 2090.6 |
Client Bundles (main, webpack)
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
925.HASH.js gzip | 178 B | 178 B | ✓ |
framework-HASH.js gzip | 42.7 kB | 42.7 kB | ✓ |
main-HASH.js gzip | 29.2 kB | 29.2 kB | ✓ |
webpack-HASH.js gzip | 1.45 kB | 1.45 kB | ✓ |
Overall change | 73.5 kB | 73.5 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
_app-HASH.js gzip | 1.35 kB | 1.35 kB | ✓ |
_error-HASH.js gzip | 179 B | 179 B | ✓ |
amp-HASH.js gzip | 311 B | 311 B | ✓ |
css-HASH.js gzip | 324 B | 324 B | ✓ |
dynamic-HASH.js gzip | 2.89 kB | 2.89 kB | ✓ |
head-HASH.js gzip | 357 B | 357 B | ✓ |
hooks-HASH.js gzip | 920 B | 920 B | ✓ |
image-HASH.js gzip | 5.8 kB | 5.8 kB | ✓ |
index-HASH.js gzip | 261 B | 261 B | ✓ |
link-HASH.js gzip | 2.77 kB | 2.77 kB | ✓ |
routerDirect..HASH.js gzip | 322 B | 322 B | ✓ |
script-HASH.js gzip | 392 B | 392 B | ✓ |
withRouter-HASH.js gzip | 317 B | 317 B | ✓ |
85e02e95b279..7e3.css gzip | 107 B | 107 B | ✓ |
Overall change | 16.3 kB | 16.3 kB | ✓ |
Client Build Manifests
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
_buildManifest.js gzip | 457 B | 457 B | ✓ |
Overall change | 457 B | 457 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | timneutkens/next.js add/legacybrowsers-rfc | Change | |
---|---|---|---|
index.html gzip | 532 B | 532 B | ✓ |
link.html gzip | 547 B | 547 B | ✓ |
withRouter.html gzip | 529 B | 529 B | ✓ |
Overall change | 1.61 kB | 1.61 kB | ✓ |
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.
Isn't it confusing that while swc / babel does transform the modern syntax without including the corresponding polyfill?
E.g. If I set my browserslists
to Chrome > 64
and use Promise.allSettled
in my code. I would be expecting the corresponding polyfill should be included because Promise.allSettled
is only supported since Chrome 76.
Next.js has 2 sets of polyfills that are loaded which are based on module/nomodule support. In case of |
IMHO it is a really bad idea. With the ECMAScript rolling out a new spec every year, the size of the And what happened to those who set |
@SukkaW the polyfill bundle is not the subject of the RFC #33227, the RFC only covers changing the defaults for transforming JS/CSS and not the polyfilling behavior, hence why it's not covered in this PR. Feel free to open a new RFC to talk about changing the defaults for polyfilling with the points mentioned. E.g. a RFC to change polyfilling based on the browserslist configuration could be considered a way to go after these changes land. There's a bunch of historical context / reasons why we went with the module/nomodule polyfill bundles approach over having Babel inject core-js polyfills. For example that it actually reduced bundle size for all applications when it was introduced so dismissing it as "a really bad idea" is not really constructive. Here's the data on size impact for all apps by default: #10212. |
The reason behind the final bundle size reduction is because it is not how For instance, core-js provided a workaround for a critical bug about And another example, core-js provides a workaround for a critical bug about And another example, core-js provides a workaround for a wrong implementation of I will post a full RFC later. Per your request, a full RFC about polyfill behavior has been posted here: #36601 |
Co-authored-by: JJ Kasper <jj@jjsweb.site>
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.
Should we add docs to explain how to configure this?
Implements the first part of #33227
experimental.browsersListForSwc
is enabled.legacyBrowsers: false
which will be the new default in Next.js 13. See RFC: Change default JS/CSS output to target modern browsers #33227 for which browsers and why.legacyBrowsers
requiresbrowsersListForSwc: true
to function until it is the default.I only implemented the JS part of the RFC, the CSS part should be handled in a follow-up PR.
Bug
fixes #number
contributing.md
Feature
fixes #number
contributing.md
Documentation / Examples
yarn lint