[turbopack] Remove turbo_tasks::function from ModuleReference getters#91229
Merged
lukesandberg merged 7 commits intocanaryfrom Mar 13, 2026
Merged
[turbopack] Remove turbo_tasks::function from ModuleReference getters#91229lukesandberg merged 7 commits intocanaryfrom
turbo_tasks::function from ModuleReference getters#91229lukesandberg merged 7 commits intocanaryfrom
Conversation
Contributor
Author
This stack of pull requests is managed by Graphite. Learn more about stacking. |
turbo_tasks::function from some low value functions
Collaborator
Failing test suitesCommit: 69d6b96 | About building and testing Next.js |
Collaborator
Stats from current PR✅ No significant changes detected📊 All Metrics📖 Metrics GlossaryDev Server Metrics:
Build Metrics:
Change Thresholds:
⚡ Dev Server
📦 Dev Server (Webpack) (Legacy)📦 Dev Server (Webpack)
⚡ Production Builds
📦 Production Builds (Webpack) (Legacy)📦 Production Builds (Webpack)
📦 Bundle SizesBundle Sizes⚡ TurbopackClient Main Bundles: **408 kB** → **408 kB**
|
| Canary | PR | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 760 B | 757 B | ✓ |
| Total | 760 B | 757 B | ✅ -3 B |
Build Details
Build Manifests
| Canary | PR | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 450 B | 449 B | ✓ |
| Total | 450 B | 449 B | ✅ -1 B |
📦 Webpack
Client
Main Bundles
| Canary | PR | Change | |
|---|---|---|---|
| 5528-HASH.js gzip | 5.54 kB | N/A | - |
| 6280-HASH.js gzip | 59.9 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.7 kB | N/A | - |
| framework-HASH.js gzip | 59.7 kB | 59.7 kB | ✓ |
| main-app-HASH.js gzip | 255 B | 254 B | ✓ |
| main-HASH.js gzip | 39.2 kB | 39.2 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.7 kB | - |
| 9544-HASH.js gzip | N/A | 60.6 kB | - |
| Total | 234 kB | 235 kB |
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.51 kB | 2.51 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.98 kB | 7.98 kB | ✅ -1 B |
Server
Edge SSR
| Canary | PR | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 125 kB | 125 kB | ✓ |
| page.js gzip | 267 kB | 267 kB | ✓ |
| Total | 392 kB | 392 kB | ✅ -264 B |
Middleware
| Canary | PR | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 616 B | 613 B | ✓ |
| middleware-r..fest.js gzip | 156 B | 155 B | ✓ |
| middleware.js gzip | 43.9 kB | 44.1 kB | ✓ |
| edge-runtime..pack.js gzip | 842 B | 842 B | ✓ |
| Total | 45.5 kB | 45.7 kB |
Build Details
Build Manifests
| Canary | PR | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 715 B | 718 B | ✓ |
| Total | 715 B | 718 B |
Build Cache
| Canary | PR | Change | |
|---|---|---|---|
| 0.pack gzip | 4.23 MB | 4.23 MB | ✓ |
| index.pack gzip | 107 kB | 108 kB | ✓ |
| index.pack.old gzip | 108 kB | 109 kB | ✓ |
| Total | 4.45 MB | 4.45 MB |
🔄 Shared (bundler-independent)
Runtimes
| Canary | PR | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 332 kB | 332 kB | ✓ |
| app-page-exp..prod.js gzip | 180 kB | 180 kB | ✓ |
| app-page-tur...dev.js gzip | 332 kB | 332 kB | ✓ |
| app-page-tur..prod.js gzip | 180 kB | 180 kB | ✓ |
| app-page-tur...dev.js gzip | 328 kB | 328 kB | ✓ |
| app-page-tur..prod.js gzip | 178 kB | 178 kB | ✓ |
| app-page.run...dev.js gzip | 329 kB | 329 kB | ✓ |
| app-page.run..prod.js gzip | 178 kB | 178 kB | ✓ |
| app-route-ex...dev.js gzip | 76 kB | 76 kB | ✓ |
| app-route-ex..prod.js gzip | 51.7 kB | 51.7 kB | ✓ |
| app-route-tu...dev.js gzip | 76 kB | 76 kB | ✓ |
| app-route-tu..prod.js gzip | 51.7 kB | 51.7 kB | ✓ |
| app-route-tu...dev.js gzip | 75.6 kB | 75.6 kB | ✓ |
| app-route-tu..prod.js gzip | 51.5 kB | 51.5 kB | ✓ |
| app-route.ru...dev.js gzip | 75.5 kB | 75.5 kB | ✓ |
| app-route.ru..prod.js gzip | 51.4 kB | 51.4 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.3 kB | 43.3 kB | ✓ |
| pages-api-tu..prod.js gzip | 33 kB | 33 kB | ✓ |
| pages-api.ru...dev.js gzip | 43.3 kB | 43.3 kB | ✓ |
| pages-api.ru..prod.js gzip | 33 kB | 33 kB | ✓ |
| pages-turbo....dev.js gzip | 52.7 kB | 52.7 kB | ✓ |
| pages-turbo...prod.js gzip | 38.6 kB | 38.6 kB | ✓ |
| pages.runtim...dev.js gzip | 52.7 kB | 52.7 kB | ✓ |
| pages.runtim..prod.js gzip | 38.6 kB | 38.6 kB | ✓ |
| server.runti..prod.js gzip | 62.4 kB | 62.4 kB | ✓ |
| Total | 2.95 MB | 2.95 MB | ✅ -1 B |
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/546b3223ab5c9ddb1054abb5a9d9f85dd06bda51/next
Merging this PR will improve performance by 6.66%
Performance Changes
Comparing Footnotes
|
e893f6f to
cab957e
Compare
turbo_tasks::function from some low value functionsturbo_tasks::function from ModuleReference getters
sokra
approved these changes
Mar 13, 2026
cb65c6b to
546b322
Compare
546b322 to
c734e6e
Compare
This was referenced Mar 13, 2026
Contributor
Author
Merge activity
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

What?
Refactors the
ModuleReferencetrait to makechunking_type()andbinding_usage()methods return direct values instead ofVc<T>wrapped values, removing the need for async task functions.Also removes the
get_referenced_assettask fromEsmAssetReference, inlining its logic into the callers.Why?
This change simplifies the API by eliminating unnecessary async overhead for methods that typically return simple, computed values. The previous implementation required
#[turbo_tasks::function]annotations andVc<T>wrappers even when the methods didn't need to perform async operations or benefit from caching.Impact
29 task types were removed, eliminating 2.6M total task invocations (1.1M hits + 1.5M misses):
chunking_type— 21 task types removed across allModuleReferenceimplementors (~952k invocations)binding_usage— 6 task types removed (~527k invocations)BindingUsage::all— helper task removed (~36k invocations)EsmAssetReference::get_referenced_asset— removed and inlined (~1.08M invocations: 628k hits + 451k misses)The removed
get_referenced_assethits reappear as +628k hits onEsmAssetReference::resolve_referenceandReferencedAsset::from_resolve_result(with zero increase in misses), confirming the work is now served from cache through the existing callers.No tasks had increased misses — the removal is clean with no cache invalidation spillover.
I also ran some builds to measure latency
so a solid win of almost 2 seconds
MaxRSS also went from 16,474,324,992 bytes to 16,359,309,312 bytes (from one measurement) so a savings of ~100M of max heap size.
How?
chunking_type()method signature fromVc<ChunkingTypeOption>toOption<ChunkingType>binding_usage()method signature fromVc<BindingUsage>toBindingUsageChunkingTypeOptiontype alias as it's no longer needed#[turbo_tasks::function]annotations from these methodsinto_trait_ref().await?pattern when accessing these methods fromVc<dyn ModuleReference>EsmAssetReference::get_referenced_asset, inlining its logic into callersturbopack-chunking-typeannotation values in import analysis