Skip to content

Turbopack: Allow turbopack-node backend to be swapped at runtime using an experimental config option#90671

Merged
bgw merged 7 commits intocanaryfrom
bgw/turbopack-node-backend-at-runtime
Feb 28, 2026
Merged

Turbopack: Allow turbopack-node backend to be swapped at runtime using an experimental config option#90671
bgw merged 7 commits intocanaryfrom
bgw/turbopack-node-backend-at-runtime

Conversation

@bgw
Copy link
Member

@bgw bgw commented Feb 27, 2026

Follow-up to #86266
This was mostly LLM-generated, but it's just moving things around and threading through a config option.

We'd like to be able to turn this on/off with an experimental config option:
- Fixes issues where RA thinks a bunch of code is dead.
- Lets us isolate potential issues to the worker thread implementation.
- Provides an escape hatch for users in case there are issues.
- Better fits the cargo "additive feature" model.

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. tests Turbopack Related to Turbopack with Next.js. type: next labels Feb 27, 2026
Copy link
Member Author

bgw commented Feb 27, 2026

@bgw bgw requested a review from a team February 27, 2026 23:21
@bgw bgw marked this pull request as ready for review February 27, 2026 23:22
@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 27, 2026

Failing test suites

Commit: 7836721 | About building and testing Next.js

webpackBuildWorker: z.boolean().optional(),
webpackMemoryOptimizations: z.boolean().optional(),
turbopackMemoryLimit: z.number().optional(),
turbopackNodeBackend: z.enum(['workerThreads', 'childProcesses']).optional(),
Copy link
Contributor

Choose a reason for hiding this comment

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

maybe turbopackEscmascriptBackend? turbopackPluginRuntimeStrategy?

if the next process is running in bun then we would use bun worker threads.

Copy link
Contributor

@xusd320 xusd320 Feb 28, 2026

Choose a reason for hiding this comment

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

I think that maybe we need to change the crate name to something else like turbopack_loader? thenTurbopackLoaderBackend will be better.

Copy link
Contributor

Choose a reason for hiding this comment

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

yeah fair, hello scope creep 😏

Copy link
Member Author

Choose a reason for hiding this comment

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

Too late, I'm doing turbopackPluginRuntimeStrategy 😆

Comment on lines +30 to +38
pub use backend::{CreatePoolFuture, CreatePoolOptions, NodeBackend};
#[cfg(feature = "process_pool")]
pub fn child_process_backend() -> Vc<Box<dyn NodeBackend>> {
Vc::upcast(process_pool::ChildProcessesBackend.cell())
}
#[cfg(feature = "worker_pool")]
pub fn worker_threads_backend() -> Vc<Box<dyn NodeBackend>> {
Vc::upcast(worker_pool::WorkerThreadsBackend.cell())
}
Copy link
Contributor

Choose a reason for hiding this comment

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

this would be the perfect place to prewarm. of course we would need a chunking context too but perhaps we could build it?

future work

@codspeed-hq
Copy link

codspeed-hq bot commented Feb 27, 2026

Merging this PR will improve performance by 3.26%

⚡ 1 improved benchmark
✅ 16 untouched benchmarks
⏩ 3 skipped benchmarks1

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Simulation packages-bundle.js[full] 1.2 s 1.2 s +3.26%

Comparing bgw/turbopack-node-backend-at-runtime (7836721) with canary (2071a81)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@nextjs-bot
Copy link
Collaborator

nextjs-bot commented Feb 28, 2026

Stats from current PR

✅ No significant changes detected

📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 456ms ▁▁█▁▁
Cold (Ready in log) 456ms 455ms ▁▂█▂▁
Cold (First Request) 970ms 973ms ▄▃█▂▃
Warm (Listen) 456ms 456ms ▁▁█▂▁
Warm (Ready in log) 454ms 454ms ▁▁█▂▁
Warm (First Request) 375ms 374ms ▂▁▇▂▁
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 610ms 610ms ▁█▁▄▁
Cold (Ready in log) 573ms 576ms ▁▆▂▃▂
Cold (First Request) 2.628s 2.671s ▁▅▁▂▁
Warm (Listen) 611ms 610ms ▁█▁▁▁
Warm (Ready in log) 573ms 574ms ▁▆▂▃▂
Warm (First Request) 2.663s 2.710s ▁▅▂▂▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.409s 4.332s ▁▁▇▄▁
Cached Build 4.394s 4.390s ▁▁▇▄▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 18.742s 19.001s ▁▆▁▁▁
Cached Build 18.941s 19.095s ▁▆▁▁▁
node_modules Size 475 MB 475 MB ▁▁▁▁▁
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles: **401 kB** → **401 kB** ✅ -23 B

80 files with content-based hashes (individual files not comparable between builds)

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 764 B 762 B
Total 764 B 762 B ✅ -2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 449 B 450 B
Total 449 B 450 B ⚠️ +1 B

📦 Webpack

Client

Main Bundles
Canary PR Change
5528-HASH.js gzip 5.54 kB N/A -
6280-HASH.js gzip 58.4 kB N/A -
6335.HASH.js gzip 169 B N/A -
912-HASH.js gzip 4.59 kB N/A -
e8aec2e4-HASH.js gzip 62.6 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 255 B 253 B
main-HASH.js gzip 39.1 kB 39.1 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
262-HASH.js gzip N/A 4.59 kB -
2889.HASH.js gzip N/A 169 B -
5602-HASH.js gzip N/A 5.55 kB -
6948ada0-HASH.js gzip N/A 62.6 kB -
9544-HASH.js gzip N/A 59.1 kB -
Total 232 kB 233 kB ⚠️ +701 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 194 B 194 B
_error-HASH.js gzip 183 B 180 B 🟢 3 B (-2%)
css-HASH.js gzip 331 B 330 B
dynamic-HASH.js gzip 1.81 kB 1.81 kB
edge-ssr-HASH.js gzip 256 B 256 B
head-HASH.js gzip 351 B 352 B
hooks-HASH.js gzip 384 B 383 B
image-HASH.js gzip 580 B 581 B
index-HASH.js gzip 260 B 260 B
link-HASH.js gzip 2.5 kB 2.5 kB
routerDirect..HASH.js gzip 320 B 319 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 315 B 315 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.97 kB ✅ -2 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 125 kB 125 kB
page.js gzip 254 kB 255 kB
Total 379 kB 379 kB ⚠️ +307 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 617 B 616 B
middleware-r..fest.js gzip 156 B 155 B
middleware.js gzip 43.8 kB 43.7 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.4 kB 45.3 kB ✅ -112 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 715 B 718 B
Total 715 B 718 B ⚠️ +3 B
Build Cache
Canary PR Change
0.pack gzip 4.02 MB 4.03 MB 🔴 +8.63 kB (+0%)
index.pack gzip 104 kB 102 kB 🟢 1.66 kB (-2%)
index.pack.old gzip 102 kB 102 kB
Total 4.23 MB 4.24 MB ⚠️ +6.62 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 320 kB 320 kB
app-page-exp..prod.js gzip 170 kB 170 kB
app-page-tur...dev.js gzip 320 kB 320 kB
app-page-tur..prod.js gzip 170 kB 170 kB
app-page-tur...dev.js gzip 316 kB 316 kB
app-page-tur..prod.js gzip 168 kB 168 kB
app-page.run...dev.js gzip 317 kB 317 kB
app-page.run..prod.js gzip 168 kB 168 kB
app-route-ex...dev.js gzip 70.8 kB 70.8 kB
app-route-ex..prod.js gzip 49.2 kB 49.2 kB
app-route-tu...dev.js gzip 70.9 kB 70.9 kB
app-route-tu..prod.js gzip 49.3 kB 49.3 kB
app-route-tu...dev.js gzip 70.4 kB 70.4 kB
app-route-tu..prod.js gzip 49 kB 49 kB
app-route.ru...dev.js gzip 70.4 kB 70.4 kB
app-route.ru..prod.js gzip 49 kB 49 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.2 kB 43.2 kB
pages-api-tu..prod.js gzip 32.9 kB 32.9 kB
pages-api.ru...dev.js gzip 43.2 kB 43.2 kB
pages-api.ru..prod.js gzip 32.9 kB 32.9 kB
pages-turbo....dev.js gzip 52.6 kB 52.6 kB
pages-turbo...prod.js gzip 38.5 kB 38.5 kB
pages.runtim...dev.js gzip 52.6 kB 52.6 kB
pages.runtim..prod.js gzip 38.5 kB 38.5 kB
server.runti..prod.js gzip 61.9 kB 61.9 kB
Total 2.82 MB 2.82 MB ⚠️ +14 B
📝 Changed Files (1 file)

Files with changes:

  • server.runtime.prod.js
View diffs
server.runtime.prod.js

Diff too large to display

📎 Tarball URL
next@https://vercel-packages.vercel.app/next/prs/90671/next

@bgw bgw merged commit c5b2cf1 into canary Feb 28, 2026
417 of 421 checks passed
Copy link
Member Author

bgw commented Feb 28, 2026

Merge activity

  • Feb 28, 6:48 AM UTC: @bgw merged this pull request with Graphite.

@bgw bgw deleted the bgw/turbopack-node-backend-at-runtime branch February 28, 2026 06:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

created-by: Turbopack team PRs by the Turbopack team. tests Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants