-
Notifications
You must be signed in to change notification settings - Fork 27.8k
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
feat(next/swc): support experimental swc plugins #36790
Conversation
Stats from current PRDefault Build (Decrease detected ✓)General Overall increase
|
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
buildDuration | 16.2s | 16.2s | |
buildDurationCached | 6.5s | 6.4s | -35ms |
nodeModulesSize | 626 MB | 626 MB |
Page Load Tests Overall decrease ⚠️
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 4.025 | 4.108 | |
/ avg req/sec | 621.11 | 608.6 | |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.39 | 1.419 | |
/error-in-render avg req/sec | 1798.79 | 1762 |
Client Bundles (main, webpack)
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
925.HASH.js gzip | 179 B | 179 B | ✓ |
framework-HASH.js gzip | 42 kB | 42 kB | ✓ |
main-HASH.js gzip | 29.2 kB | 29.2 kB | ✓ |
webpack-HASH.js gzip | 1.54 kB | 1.54 kB | ✓ |
Overall change | 73 kB | 73 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | 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.71 kB | 2.71 kB | ✓ |
head-HASH.js gzip | 359 B | 359 B | ✓ |
hooks-HASH.js gzip | 920 B | 920 B | ✓ |
image-HASH.js gzip | 5.74 kB | 5.74 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 | 16 kB | 16 kB | ✓ |
Client Build Manifests
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
_buildManifest.js gzip | 459 B | 459 B | ✓ |
Overall change | 459 B | 459 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
index.html gzip | 533 B | 533 B | ✓ |
link.html gzip | 546 B | 546 B | ✓ |
withRouter.html gzip | 528 B | 528 B | ✓ |
Overall change | 1.61 kB | 1.61 kB | ✓ |
Default Build with SWC (Increase detected ⚠️ )
General Overall increase ⚠️
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
buildDuration | 18.3s | 18.4s | |
buildDurationCached | 6.4s | 6.4s | |
nodeModulesSize | 626 MB | 626 MB |
Page Load Tests Overall increase ✓
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
/ failed reqs | 0 | 0 | ✓ |
/ total time (seconds) | 4.076 | 4.036 | -0.04 |
/ avg req/sec | 613.3 | 619.42 | +6.12 |
/error-in-render failed reqs | 0 | 0 | ✓ |
/error-in-render total time (seconds) | 1.385 | 1.372 | -0.01 |
/error-in-render avg req/sec | 1805.37 | 1822.45 | +17.08 |
Client Bundles (main, webpack)
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
925.HASH.js gzip | 178 B | 178 B | ✓ |
framework-HASH.js gzip | 42.7 kB | 42.7 kB | ✓ |
main-HASH.js gzip | 29.7 kB | 29.7 kB | ✓ |
webpack-HASH.js gzip | 1.54 kB | 1.54 kB | ✓ |
Overall change | 74 kB | 74 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 31 kB | 31 kB | ✓ |
Overall change | 31 kB | 31 kB | ✓ |
Client Pages
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | 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.9 kB | 2.9 kB | ✓ |
head-HASH.js gzip | 357 B | 357 B | ✓ |
hooks-HASH.js gzip | 920 B | 920 B | ✓ |
image-HASH.js gzip | 5.84 kB | 5.84 kB | ✓ |
index-HASH.js gzip | 261 B | 261 B | ✓ |
link-HASH.js gzip | 2.78 kB | 2.78 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.4 kB | 16.4 kB | ✓ |
Client Build Manifests
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
_buildManifest.js gzip | 458 B | 458 B | ✓ |
Overall change | 458 B | 458 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | kwonoj/next.js feat-swc-experimental-plugin | Change | |
---|---|---|---|
index.html gzip | 533 B | 533 B | ✓ |
link.html gzip | 547 B | 547 B | ✓ |
withRouter.html gzip | 529 B | 529 B | ✓ |
Overall change | 1.61 kB | 1.61 kB | ✓ |
9032fd5
to
5655ae8
Compare
@Brooooooklyn may I able to ask some help to resolve CI failure? It passes native build CI job, but dependent tasks are failing to load binaries. |
1754bab
to
09d6c08
Compare
Failing test suitesCommit: e4b6438
Expand output● Async modules › serverless mode › can render async AMP pages
Read more about building and testing Next.js in contributing.md. |
09d6c08
to
d288e65
Compare
@@ -316,6 +316,42 @@ This transform uses [handlebars](https://docs.rs/handlebars) to template the rep | |||
2. `member`: Has type `string`. The name of the member import. | |||
3. `lowerCase`, `upperCase`, `camelCase`: Helper functions to convert a string to lower, upper or camel cases. | |||
|
|||
### SWC Trace profiling |
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.
Is this a separate feature? Thought I remembered a different PR for this one.
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.
Yes, it's a separate feature and forgot to update docs then included in this PR. If it's required, can split PR into another. (feature is already in, only docs are missing)
766cb21
to
a711c22
Compare
e4b6438
to
0e6e5ca
Compare
0e6e5ca
to
65522ba
Compare
Co-authored-by: Maia Teegarden <dev@padmaia.rocks>
This PR enables experimental plugin support to
next/swc
. SWC-compatible plugins (i.e /~https://github.com/swc-project/plugins) can be loaded transparently into next-swc with new experimental configuration options.Currently, next/swc enables multiple custom transform
@core/swc
doesn't support. It is based on using compile-time custom pass provided in swc's rust api. Users may not able to configure their own custom behavior or experiment dynamically unless core next.js include those features in the new release.This feature in contrast, allows to configure runtime / dynamic way to specify custom transform behavior without rebuilding whole
next/swc
binary. New experiments, or user internal custom transformation which is not suitable for the core next.js can be enabled using this.Configuring plugin is currently transparent to the core swc's config itself. It is likely possible
@swc/core
to have changes to the config interface as it's not clearly straightforward.First element to the tuple points paths to the plugin - it can be either npm package name (if package.json's main field resolves to plugin binary) or absolute path the to
.wasm
. Second element is an option for configuring plugin.Note wasm target (
next-swc/wasm
) does not support plugins yet: there is a tracking effort in upstream to support this. (swc-project/swc#3934)Existing custom pass vs. plugin
As mentioned,
next/swc
already have numbers of custom transform passes overlaps to the plugin. Internally, both shares nearly identical visitor implementations - for example, #36692 uses custom pass but plugins for the@swc/core
uses exact same visitor (/~https://github.com/kwonoj/swc-coverage-instrument/tree/main/packages/swc-coverage-instrument). The only difference is if it uses entrypoint for the plugin or not.This means,
next/swc
, and corenext.js
may not need to change way to enable custom transform.TL:DR plugins are more user-level, custom passes are for core next.js as-is.
Related to #34384.
Bug
fixes #number
contributing.md
Feature
fixes #number
contributing.md
Documentation / Examples
yarn lint