-
Notifications
You must be signed in to change notification settings - Fork 29.3k
Add experimental SWC minify and SWC loader options #27664
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
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:
swcLoadergetStaticProps,getStaticPaths, andgetServerSidePropsnext/dynamicto function correctly between server/browserclassNametoclasson AMP tags<style jsx>. Until this is ported you can't use<style jsx>.swcLoaderexport const configin pages is a static object that can be extracted, this is not a blocker for usage ofswcLoaderswcMinifySize comparison between no minification <-> SWC minify <-> Terser
No minification
SWC Minify
Terser (current Next.js default)