Skip to content

Enable experimental.optimisticRouting by default#94011

Merged
acdlite merged 1 commit into
acdlite/enable-vary-params-defaultfrom
acdlite/enable-optimistic-routing-default
May 21, 2026
Merged

Enable experimental.optimisticRouting by default#94011
acdlite merged 1 commit into
acdlite/enable-vary-params-defaultfrom
acdlite/enable-optimistic-routing-default

Conversation

@acdlite
Copy link
Copy Markdown
Contributor

@acdlite acdlite commented May 21, 2026

Turns on experimental.optimisticRouting by default. Second of the Sparkle stack.

A few tests pin optimisticRouting: false because their assertions observe the pre-flip navigation timing — search-params, a11y route announcer, and hash scroll. To be updated separately.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

Tests Passed

Commit: 5fd4de6

@acdlite acdlite force-pushed the acdlite/enable-vary-params-default branch from 0f5ae79 to bb9eba8 Compare May 21, 2026 05:21
@acdlite acdlite force-pushed the acdlite/enable-optimistic-routing-default branch from 744e2a4 to 8322815 Compare May 21, 2026 05:21
@github-actions
Copy link
Copy Markdown
Contributor

Stats from current PR

🔴 2 regressions

Metric Canary PR Change Trend
Webpack Build Time 23.869s 24.852s 🔴 +983ms (+4%) ▂▁█▂▁
Webpack Build Time (cached) 24.009s 24.805s 🔴 +796ms (+3%) ▂▁▆▂▁
📊 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) 813ms 812ms █████
Cold (Ready in log) 792ms 792ms ███▇▇
Cold (First Request) 1.265s 1.269s ▆▄▆▄▃
Warm (Listen) 812ms 811ms █████
Warm (Ready in log) 792ms 796ms █▇█▇▇
Warm (First Request) 619ms 623ms ▇▇▆▆▃
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 813ms 811ms █▁███
Cold (Ready in log) 803ms 801ms ▆▁█▇▆
Cold (First Request) 3.386s 3.407s ▂▁▇▅▄
Warm (Listen) 812ms 812ms █▁███
Warm (Ready in log) 806ms 804ms ▆▁█▇▆
Warm (First Request) 3.415s 3.419s ▂▁▆▄▂

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 4.886s 4.861s ▅▃▇▄▅
Cached Build 4.824s 4.812s ▆▅▇▆▅
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 23.869s 24.852s 🔴 +983ms (+4%) ▂▁█▂▁
Cached Build 24.009s 24.805s 🔴 +796ms (+3%) ▂▁▆▂▁
node_modules Size 506 MB 506 MB ▁▁▁▁▁
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
0_fjg8_hi5unh.js gzip 154 B N/A -
04hm05ar7kldw.js gzip 5.73 kB N/A -
0bw8hgkrnyz52.js gzip 169 B N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0dvitrl5zg37g.js gzip 8.82 kB N/A -
0sf7ysou-72zd.js gzip 8.71 kB N/A -
0u1yrhy0v3ukc.js gzip 65.6 kB N/A -
0wctkh6poo3-9.js gzip 152 B N/A -
0z_6ypvxbuu_a.js gzip 159 B N/A -
14e-v33-v2gy6.js gzip 155 B N/A -
157abun3hwc_s.js gzip 10.3 kB N/A -
1djx0fm1yw1tl.js gzip 70.9 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1jj68jv9537mc.js gzip 13.8 kB N/A -
1jpaub6y8xlfr.js gzip 2.3 kB N/A -
1kzhctatld4-r.js gzip 157 B N/A -
1ot0mvscrc_uf.js gzip 233 B N/A -
1smvc2zk5-ca-.js gzip 156 B N/A -
2_m3xv2uq3sjc.js gzip 1.46 kB N/A -
203qqfwjufsmt.js gzip 157 B N/A -
24y34mwgrkqp4.js gzip 8.78 kB N/A -
29p1h87nr475x.js gzip 157 B N/A -
2aljlkge5h1k9.js gzip 50.4 kB N/A -
2c-fd4y1zozz8.js gzip 8.79 kB N/A -
2d7416h_xd36x.js gzip 8.71 kB N/A -
2g21ny1t2kw37.js gzip 7.61 kB N/A -
2lyuhit6rn8fy.js gzip 9.44 kB N/A -
2q0gr8wfr3jwl.js gzip 8.77 kB N/A -
2t9e75oz6r0zp.js gzip 8.76 kB N/A -
2uku_olcn15b7.js gzip 8.79 kB N/A -
30r8mm-46bdqy.js gzip 220 B 220 B
355tnzfgll-w6.js gzip 153 B N/A -
3c1jdxkzlb8oq.js gzip 12.9 kB N/A -
3inab2jybr4k9.js gzip 450 B N/A -
3j0r9ohz0z01-.js gzip 154 B N/A -
3jkm5tdjvaf_q.js gzip 13.1 kB N/A -
3mt67agm5wp40.js gzip 10.6 kB N/A -
3saabek4kohwi.js gzip 10 kB N/A -
3sean5tdvwzz_.js gzip 155 B N/A -
3zan-tufsponr.js gzip 160 B N/A -
4189xmby9yu1p.js gzip 13.6 kB N/A -
turbopack-0k..eo4m.js gzip 4.2 kB N/A -
turbopack-0k..-9gf.js gzip 4.2 kB N/A -
turbopack-0o..1q02.js gzip 4.18 kB N/A -
turbopack-0q..5c5o.js gzip 4.2 kB N/A -
turbopack-16..fb3b.js gzip 4.2 kB N/A -
turbopack-17..j1a-.js gzip 4.2 kB N/A -
turbopack-1k..aoyi.js gzip 4.2 kB N/A -
turbopack-1r..h6ay.js gzip 4.2 kB N/A -
turbopack-1v..7iy-.js gzip 4.2 kB N/A -
turbopack-2d..rwvq.js gzip 4.21 kB N/A -
turbopack-2m..2k_2.js gzip 4.2 kB N/A -
turbopack-2o.._suq.js gzip 4.2 kB N/A -
turbopack-35..-lvd.js gzip 4.2 kB N/A -
turbopack-44..q5pn.js gzip 4.2 kB N/A -
0_i7nqgx23st7.js gzip N/A 10 kB -
06puhytyxk31p.js gzip N/A 8.82 kB -
089vno2432w9r.js gzip N/A 156 B -
08c_dvyptzelq.js gzip N/A 70.9 kB -
08lvtz5-dsh42.js gzip N/A 159 B -
0j42f9zonj0wd.js gzip N/A 13 kB -
0m34gln_kt4fg.js gzip N/A 5.73 kB -
0ohud9nx64qt8.js gzip N/A 169 B -
0q30qien57zwr.js gzip N/A 50.5 kB -
0wl6_b-9jz9m5.js gzip N/A 158 B -
16xliqhzpxjn-.js gzip N/A 156 B -
1g3q1ww01thnl.js gzip N/A 2.3 kB -
1hraqxuiymq6v.js gzip N/A 8.79 kB -
1igoz2sf3ohwr.js gzip N/A 155 B -
1l9un1sl77287.js gzip N/A 1.46 kB -
1r-hvm_9cd1-s.js gzip N/A 154 B -
20eeo7kdvep58.js gzip N/A 158 B -
21-eavqb1k_36.js gzip N/A 13.9 kB -
2147zgtf14z-q.js gzip N/A 234 B -
23bz3xsg-5-1s.js gzip N/A 8.71 kB -
25c0bi8a1dgnf.js gzip N/A 157 B -
27441mytv7pbm.js gzip N/A 9.43 kB -
2cjkwjgm1zcfs.js gzip N/A 8.71 kB -
2l18j_4o3xo67.js gzip N/A 161 B -
2scd8zaoyb8md.js gzip N/A 8.79 kB -
2st_qs6p_9us0.js gzip N/A 13.1 kB -
2zo2exm1d8qj1.js gzip N/A 13.6 kB -
31pklf5heh254.js gzip N/A 157 B -
335gur5ak6isg.js gzip N/A 65.6 kB -
39hpy-whqz20v.js gzip N/A 157 B -
3e_zxnqd2tsw8.js gzip N/A 152 B -
3f710q6kll2xn.js gzip N/A 7.61 kB -
3hn75zuxly9az.js gzip N/A 10.3 kB -
3hqh7m128tvsn.js gzip N/A 8.77 kB -
3hqti_t-zy1x4.js gzip N/A 449 B -
3mnawenie1flm.js gzip N/A 8.76 kB -
3ubsozlu6zs38.js gzip N/A 10.6 kB -
43iwfqjnx1cy_.js gzip N/A 8.78 kB -
turbopack-07..417q.js gzip N/A 4.2 kB -
turbopack-0f..q75-.js gzip N/A 4.2 kB -
turbopack-0h..n43t.js gzip N/A 4.18 kB -
turbopack-0n..2c9i.js gzip N/A 4.2 kB -
turbopack-0n..411h.js gzip N/A 4.2 kB -
turbopack-0z..wozk.js gzip N/A 4.2 kB -
turbopack-1e..8c__.js gzip N/A 4.2 kB -
turbopack-25..xfks.js gzip N/A 4.2 kB -
turbopack-2d..5-vn.js gzip N/A 4.2 kB -
turbopack-2m..jw_n.js gzip N/A 4.2 kB -
turbopack-2p..wi3l.js gzip N/A 4.21 kB -
turbopack-2z..6_-r.js gzip N/A 4.2 kB -
turbopack-3d..i8ob.js gzip N/A 4.2 kB -
turbopack-3v..9nlh.js gzip N/A 4.2 kB -
Total 469 kB 469 kB ⚠️ +229 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 716 B 719 B
Total 716 B 719 B ⚠️ +3 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 434 B 435 B
Total 434 B 435 B ⚠️ +1 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2258-HASH.js gzip 61.4 kB N/A -
2266-HASH.js gzip 4.69 kB N/A -
3317.HASH.js gzip 169 B N/A -
4866-HASH.js gzip 5.64 kB N/A -
9e302639-HASH.js gzip 62.8 kB N/A -
framework-HASH.js gzip 59.5 kB 59.5 kB
main-app-HASH.js gzip 255 B 255 B
main-HASH.js gzip 39.9 kB 39.9 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
175fd0fd-HASH.js gzip N/A 62.8 kB -
2596-HASH.js gzip N/A 5.63 kB -
34-HASH.js gzip N/A 61.4 kB -
5691.HASH.js gzip N/A 169 B -
9156-HASH.js gzip N/A 4.68 kB -
Total 236 kB 236 kB ⚠️ +34 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 193 B 193 B
_error-HASH.js gzip 181 B 182 B
css-HASH.js gzip 334 B 332 B
dynamic-HASH.js gzip 1.79 kB 1.81 kB
edge-ssr-HASH.js gzip 255 B 255 B
head-HASH.js gzip 351 B 348 B
hooks-HASH.js gzip 385 B 384 B
image-HASH.js gzip 580 B 580 B
index-HASH.js gzip 257 B 259 B
link-HASH.js gzip 2.51 kB 2.52 kB
routerDirect..HASH.js gzip 318 B 319 B
script-HASH.js gzip 387 B 386 B
withRouter-HASH.js gzip 316 B 316 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.97 kB 7.99 kB ⚠️ +19 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 276 kB 271 kB 🟢 4.54 kB (-2%)
Total 402 kB 397 kB ✅ -4.76 kB
Middleware
Canary PR Change
middleware-b..fest.js gzip 620 B 615 B
middleware-r..fest.js gzip 155 B 155 B
middleware.js gzip 44.7 kB 44.9 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 46.3 kB 46.5 kB ⚠️ +209 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 719 B 717 B
Total 719 B 717 B ✅ -2 B
Build Cache
Canary PR Change
0.pack gzip 4.49 MB 4.49 MB
index.pack gzip 114 kB 114 kB
index.pack.old gzip 115 kB 116 kB
Total 4.72 MB 4.72 MB ✅ -1.61 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 350 kB 350 kB
app-page-exp..prod.js gzip 195 kB 195 kB
app-page-tur...dev.js gzip 350 kB 350 kB
app-page-tur..prod.js gzip 194 kB 194 kB
app-page-tur...dev.js gzip 346 kB 346 kB
app-page-tur..prod.js gzip 192 kB 192 kB
app-page.run...dev.js gzip 347 kB 347 kB
app-page.run..prod.js gzip 193 kB 193 kB
app-route-ex...dev.js gzip 77.5 kB 77.5 kB
app-route-ex..prod.js gzip 52.9 kB 52.9 kB
app-route-tu...dev.js gzip 77.6 kB 77.6 kB
app-route-tu..prod.js gzip 52.9 kB 52.9 kB
app-route-tu...dev.js gzip 77.2 kB 77.2 kB
app-route-tu..prod.js gzip 52.7 kB 52.7 kB
app-route.ru...dev.js gzip 77.1 kB 77.1 kB
app-route.ru..prod.js gzip 52.7 kB 52.7 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 44.3 kB 44.3 kB
pages-api-tu..prod.js gzip 33.8 kB 33.8 kB
pages-api.ru...dev.js gzip 44.3 kB 44.3 kB
pages-api.ru..prod.js gzip 33.7 kB 33.7 kB
pages-turbo....dev.js gzip 53.7 kB 53.7 kB
pages-turbo...prod.js gzip 39.4 kB 39.4 kB
pages.runtim...dev.js gzip 53.6 kB 53.6 kB
pages.runtim..prod.js gzip 39.4 kB 39.4 kB
server.runti..prod.js gzip 63.1 kB 63.1 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 69.7 kB 69.7 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
use-cache-pr...dev.js gzip 68 kB 68 kB
Total 3.37 MB 3.37 MB ⚠️ +9 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
https://vercel-packages.vercel.app/next/commits/83228155d6c92efae796a177779c8a5bdbdeb688/next

Commit: 8322815

@acdlite acdlite force-pushed the acdlite/enable-optimistic-routing-default branch from 8322815 to 302233b Compare May 21, 2026 16:18
Copy link
Copy Markdown
Contributor

@vercel vercel Bot left a comment

Choose a reason for hiding this comment

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

Additional Suggestion:

The prefetch-runtime test's next.config.ts is missing optimisticRouting: false, causing the "includes root params, but not dynamic content" test to fail because the new default optimisticRouting: true makes the client optimistically reuse cached prefetch entries instead of fetching new ones for different root param values.

Fix on Vercel

@acdlite acdlite marked this pull request as ready for review May 21, 2026 16:38
@acdlite acdlite requested review from lubieowoce and unstubbable May 21, 2026 16:38
Adds an explicit `optimisticRouting: true` entry to
`defaultConfig.experimental` (previously absent, so the flag was
implicitly falsy). Part of the Sparkle rollout. Projects that need
the old behavior can still opt out by explicitly setting
`experimental.optimisticRouting: false`.

Dead branches at the `optimisticRouting` call sites are left in
place and will be cleaned up after all four Sparkle flags have
been inverted.
@acdlite acdlite force-pushed the acdlite/enable-vary-params-default branch from bb9eba8 to 301fdf6 Compare May 21, 2026 20:14
@acdlite acdlite force-pushed the acdlite/enable-optimistic-routing-default branch from 302233b to 5fd4de6 Compare May 21, 2026 20:14
@acdlite acdlite merged commit 160a7bf into canary May 21, 2026
211 of 222 checks passed
@acdlite acdlite deleted the acdlite/enable-optimistic-routing-default branch May 21, 2026 21:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants