Skip to content
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-core): build time client|server-only assertion #61732

Merged
merged 3 commits into from
Feb 8, 2024

Conversation

kwonoj
Copy link
Contributor

@kwonoj kwonoj commented Feb 6, 2024

What

This PR injects a build-time error for the turbopack if client|server-only is imported in incorrect context. The basic idea is using resolve plugin, so in resolve time if matching context (which alises erroneous import), raise a build time error.

Unfortunately this won't fix all of the tests in invalid-imports, due to

  1. resolveplugin does not have way to trace import from transformed, so not able to detect styled-jsx from using <styled.. tags
  2. webpack (in our implementation) and turbopack's resolveplugin have different order of transform / module trace chain, so enabling resolve plugin in some context raises build error instead of runtime error in rsc-build-error.

Closes PACK-2397

@ijjk ijjk added Turbopack Related to Turbopack with Next.js. created-by: Turbopack team PRs by the turbopack team type: next labels Feb 6, 2024
@kwonoj kwonoj changed the title feat(next-core): build time client|server-only assertion [DONOTMERGE] [WIP] feat(next-core): build time client|server-only assertion Feb 6, 2024
@ijjk
Copy link
Member

ijjk commented Feb 6, 2024

Tests Passed

@ijjk
Copy link
Member

ijjk commented Feb 6, 2024

Stats from current PR

Default Build
General
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
buildDuration 10.8s 10.8s N/A
buildDurationCached 6s 5.8s N/A
nodeModulesSize 318 MB 318 MB
nextStartRea..uration (ms) 428ms 427ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
3f784ff6-HASH.js gzip 53.4 kB 53.4 kB
423.HASH.js gzip 185 B 181 B N/A
68-HASH.js gzip 29.7 kB 29.7 kB N/A
framework-HASH.js gzip 45.2 kB 45.2 kB
main-app-HASH.js gzip 238 B 239 B N/A
main-HASH.js gzip 31.8 kB 31.8 kB N/A
webpack-HASH.js gzip 1.7 kB 1.7 kB
Overall change 100 kB 100 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
_app-HASH.js gzip 194 B 195 B N/A
_error-HASH.js gzip 182 B 181 B N/A
amp-HASH.js gzip 502 B 501 B N/A
css-HASH.js gzip 320 B 322 B N/A
dynamic-HASH.js gzip 2.5 kB 2.5 kB N/A
edge-ssr-HASH.js gzip 255 B 256 B N/A
head-HASH.js gzip 350 B 349 B N/A
hooks-HASH.js gzip 368 B 369 B N/A
image-HASH.js gzip 4.22 kB 4.21 kB N/A
index-HASH.js gzip 257 B 256 B N/A
link-HASH.js gzip 2.61 kB 2.61 kB N/A
routerDirect..HASH.js gzip 310 B 311 B N/A
script-HASH.js gzip 384 B 383 B N/A
withRouter-HASH.js gzip 306 B 308 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 106 B 106 B
Client Build Manifests
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
_buildManifest.js gzip 484 B 484 B
Overall change 484 B 484 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
index.html gzip 527 B 527 B
link.html gzip 540 B 537 B N/A
withRouter.html gzip 523 B 522 B N/A
Overall change 527 B 527 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
edge-ssr.js gzip 94 kB 94 kB N/A
page.js gzip 149 kB 149 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
middleware-b..fest.js gzip 621 B 623 B N/A
middleware-r..fest.js gzip 151 B 149 B N/A
middleware.js gzip 47.4 kB 47.4 kB N/A
edge-runtime..pack.js gzip 1.94 kB 1.94 kB
Overall change 1.94 kB 1.94 kB
Next Runtimes
vercel/next.js canary vercel/next.js resolve-plugin-invalid-imports Change
app-page-exp...dev.js gzip 166 kB 166 kB
app-page-exp..prod.js gzip 95.1 kB 95.1 kB
app-page-tur..prod.js gzip 96.9 kB 96.9 kB
app-page-tur..prod.js gzip 91.5 kB 91.5 kB
app-page.run...dev.js gzip 135 kB 135 kB
app-page.run..prod.js gzip 90 kB 90 kB
app-route-ex...dev.js gzip 22 kB 22 kB
app-route-ex..prod.js gzip 14.8 kB 14.8 kB
app-route-tu..prod.js gzip 14.8 kB 14.8 kB
app-route-tu..prod.js gzip 14.6 kB 14.6 kB
app-route.ru...dev.js gzip 21.7 kB 21.7 kB
app-route.ru..prod.js gzip 14.6 kB 14.6 kB
pages-api-tu..prod.js gzip 9.43 kB 9.43 kB
pages-api.ru...dev.js gzip 9.7 kB 9.7 kB
pages-api.ru..prod.js gzip 9.43 kB 9.43 kB
pages-turbo...prod.js gzip 22 kB 22 kB
pages.runtim...dev.js gzip 22.7 kB 22.7 kB
pages.runtim..prod.js gzip 22 kB 22 kB
server.runti..prod.js gzip 49.7 kB 49.7 kB
Overall change 922 kB 922 kB
Diff details
Diff for page.js

Diff too large to display

Commit: 930aed6

@kwonoj kwonoj force-pushed the resolve-plugin-invalid-imports branch from 0c60a96 to 2c8b93e Compare February 6, 2024 20:41
@kwonoj kwonoj force-pushed the resolve-plugin-invalid-imports branch 2 times, most recently from c6be212 to 9df9516 Compare February 6, 2024 23:07
@kwonoj kwonoj force-pushed the resolve-plugin-invalid-imports branch from 9df9516 to 930aed6 Compare February 6, 2024 23:42
@kwonoj kwonoj changed the title [DONOTMERGE] [WIP] feat(next-core): build time client|server-only assertion eat(next-core): build time client|server-only assertion Feb 6, 2024
@kwonoj kwonoj changed the title eat(next-core): build time client|server-only assertion feat(next-core): build time client|server-only assertion Feb 6, 2024
plugins.push(Vc::upcast(invalid_client_only_resolve_plugin));
}
ServerContextType::AppSSR { .. } => {
//[TODO] Build error in this context makes rsc-build-error.ts fail which expects runtime error code
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes one of invalid-imports test not able to pass

messages.push("\n".to_string());

//[TODO]: how do we get the import trace?
messages.push(format!(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. we don't get import trace to display
  2. also this place doesn't know styled-jsx import from the <styled.. tag

@kwonoj kwonoj marked this pull request as ready for review February 6, 2024 23:44
@timneutkens timneutkens merged commit 775e898 into canary Feb 8, 2024
70 checks passed
@timneutkens timneutkens deleted the resolve-plugin-invalid-imports branch February 8, 2024 08:04
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 22, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
created-by: Turbopack team PRs by the turbopack team locked Turbopack Related to Turbopack with Next.js. type: next
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants