-
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 experimental SWC minify and SWC loader options #27664
Add experimental SWC minify and SWC loader options #27664
Conversation
This is an experimental option to quickly test the new SWC minifier which is still being worked on.
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.
Failing test suitesCommit: af2fdda test/acceptance/ReactRefreshLogBox.dev.test.js
Expand output● server-side only compilation errors
|
Refactored the loader to match up with the `next/babel` defaults. Also added tracing to measure performance.
This comment has been minimized.
This comment has been minimized.
swc_atoms = "0.2.6" | ||
swc_common = { version = "0.11.1", features = ["tty-emitter", "sourcemap"] } | ||
swc_node_base = "0.2.0" | ||
swc_ecmascript = { version = "0.48.0", features = ["codegen", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } | ||
swc_ecmascript = { version = "0.50.0", features = ["codegen", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } |
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 swc_ecmascript
should reexport swc_ecma_preset_env
.
I'll do it soon.
Stats from current PRDefault Build (Decrease detected ✓)General Overall increase
|
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
buildDuration | 14.9s | 15.5s | |
buildDurationCached | 3.7s | 3.5s | -157ms |
nodeModulesSize | 50.2 MB | 50.2 MB |
Page Load Tests Overall decrease ⚠️
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 2.654 | 2.611 | -0.04 |
/ avg req/sec | 941.95 | 957.46 | +15.51 |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.454 | 1.479 | |
/error-in-render avg req/sec | 1719.58 | 1690.47 |
Client Bundles (main, webpack, commons)
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
745.HASH.js gzip | 179 B | 179 B | ✓ |
framework-HASH.js gzip | 42.2 kB | 42.2 kB | ✓ |
main-HASH.js gzip | 23.1 kB | 23.1 kB | ✓ |
webpack-HASH.js gzip | 1.5 kB | 1.5 kB | ✓ |
Overall change | 67 kB | 67 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | 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 | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
_app-HASH.js gzip | 980 B | 980 B | ✓ |
_error-HASH.js gzip | 194 B | 194 B | ✓ |
amp-HASH.js gzip | 312 B | 312 B | ✓ |
css-HASH.js gzip | 329 B | 329 B | ✓ |
dynamic-HASH.js gzip | 2.52 kB | 2.52 kB | ✓ |
head-HASH.js gzip | 350 B | 350 B | ✓ |
hooks-HASH.js gzip | 904 B | 904 B | ✓ |
image-HASH.js gzip | 4.12 kB | 4.12 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 | 12.8 kB | 12.8 kB | ✓ |
Client Build Manifests
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
_buildManifest.js gzip | 490 B | 490 B | ✓ |
Overall change | 490 B | 490 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
index.html gzip | 531 B | 531 B | ✓ |
link.html gzip | 542 B | 542 B | ✓ |
withRouter.html gzip | 523 B | 523 B | ✓ |
Overall change | 1.6 kB | 1.6 kB | ✓ |
Webpack 4 Mode (Decrease detected ✓)
General Overall increase ⚠️
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
buildDuration | 12.1s | 12.3s | |
buildDurationCached | 4.8s | 4.7s | -85ms |
nodeModulesSize | 50.2 MB | 50.2 MB |
Page Load Tests Overall decrease ⚠️
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 2.642 | 2.645 | 0 |
/ avg req/sec | 946.33 | 945.28 | |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.468 | 1.504 | |
/error-in-render avg req/sec | 1703.1 | 1661.79 |
Client Bundles (main, webpack, commons)
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
17.HASH.js gzip | 185 B | 185 B | ✓ |
677f882d2ed8..HASH.js gzip | 14 kB | 14 kB | ✓ |
framework.HASH.js gzip | 41.9 kB | 41.9 kB | ✓ |
main-HASH.js gzip | 10.6 kB | 10.6 kB | ✓ |
webpack-HASH.js gzip | 1.19 kB | 1.19 kB | ✓ |
Overall change | 67.8 kB | 67.8 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | 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 | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
_app-HASH.js gzip | 965 B | 965 B | ✓ |
_error-HASH.js gzip | 3.71 kB | 3.71 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 | 2.94 kB | 2.94 kB | ✓ |
withRouter-HASH.js gzip | 294 B | 294 B | ✓ |
e025d2764813..52f.css gzip | 125 B | 125 B | ✓ |
Overall change | 17.7 kB | 17.7 kB | ✓ |
Client Build Manifests
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
_buildManifest.js gzip | 498 B | 498 B | ✓ |
Overall change | 498 B | 498 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | timneutkens/next.js add/experimental-swc-minify | Change | |
---|---|---|---|
index.html gzip | 576 B | 576 B | ✓ |
link.html gzip | 589 B | 589 B | ✓ |
withRouter.html gzip | 570 B | 570 B | ✓ |
Overall change | 1.74 kB | 1.74 kB | ✓ |
Awesome work on perf! I noticed the caveat of using SWC Loader leading to custom Babel configuration not being supported. I wonder if that will change. Thanks!
|
Adds 2 experimental options:
Both features are still work in progress. In particular there are currently a few caveats to know about:
swcLoader
getStaticProps
,getStaticPaths
, andgetServerSideProps
next/dynamic
to function correctly between server/browserclassName
toclass
on AMP tags<style jsx>
. Until this is ported you can't use<style jsx>
.swcLoader
export const config
in pages is a static object that can be extracted, this is not a blocker for usage ofswcLoader
swcMinify
Size comparison between no minification <-> SWC minify <-> Terser
No minification
SWC Minify
Terser (current Next.js default)