Visitar URL original
Implement next/font BeforeResolvePlugins as ImportMappingReplacement by mischnic · Pull Request #95808 · vercel/next.js · GitHub
Skip to content

Implement next/font BeforeResolvePlugins as ImportMappingReplacement - #95808

Merged
mischnic merged 3 commits into
canaryfrom
mischnic/font-import-map-replacer
Aug 5, 2026
Merged

mischnic merged 3 commits into
canaryfrom
mischnic/font-import-map-replacer

Conversation

@mischnic

@mischnic mischnic commented Jul 15, 2026 •

Copy link
Copy Markdown
Member

ImportMappingReplacement are more efficient: import maps are backed by a single radix tree, as opposed to having to run every single ResolvePlugin's matchers in sequence.

This basically undoes #65870 by @wbinnssmith, but I don't entirely understand why this was done:

This is used to replace ImportMapping replacers for @next/font/local in an upcoming Next.js PR

@github-actions

github-actions Bot commented Jul 15, 2026 •

Copy link
Copy Markdown
Contributor

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) 813ms 762ms ✓ ▁██▁█
Cold (Ready in log) 779ms 767ms ✓ ▂▃▄▂▇
Cold (First Request) 1.271s 1.293s ✓ ▁▂▃▂▇
Warm (Listen) 812ms 811ms ✓ ▁▁▁▄▅
Warm (Ready in log) 773ms 773ms ✓ ▂▃▃▃▆
Warm (First Request) 1.255s 1.249s ✓ ▄▂▄▂▆
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 1.065s 1.064s ✓ ▂▁█▂▁
Cold (Ready in log) 1.036s 1.036s ✓ ▁▁█▁▁
Cold (First Request) 4.684s 4.689s ✓ ▁▁█▂▁
Warm (Listen) 1.064s 1.064s ✓ ▂▂█▂▁
Warm (Ready in log) 1.034s 1.033s ✓ ▂▁█▂▁
Warm (First Request) 4.666s 4.621s ✓ ▁▁█▂▁

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 5.975s 5.812s ✓ ▁▃▃▁█
Cached Build 3.074s 2.939s ✓ ▁▂▃▁▇
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 36.507s 36.555s ✓ ▁▁█▂▁
Cached Build 36.553s 36.321s ✓ ▁▁█▂▁
node_modules Size 552 MB 552 MB ✓ ▁▁▁▁█
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
0-cehbjeya_py.js gzip 156 B N/A -
02rmq--hyx94r.js gzip 3.54 kB N/A -
05nzfr3uqbk3q.js gzip 155 B N/A -
0a-p0meqxynjz.js gzip 10.3 kB N/A -
0avtke4yefj4-.js gzip 13.1 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB ✓
0nqpqym0y3lk1.js gzip 7.44 kB N/A -
0omxczehx9wdb.js gzip 155 B N/A -
0pt5of3ch6d2u.js gzip 13.6 kB N/A -
0rwgno4pp0rj-.js gzip 157 B N/A -
0xnsdo-6y9r3k.js gzip 5.72 kB N/A -
0xpquf09sbwf0.js gzip 156 B N/A -
0yi7is8u4covm.js gzip 8.77 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B ✓
1gyxf6rqmgi08.js gzip 169 B N/A -
1prv-wg6jgtt2.js gzip 8.77 kB N/A -
1t47vod02e_4a.js gzip 8.75 kB N/A -
1tf1phijqlx9j.js gzip 220 B 220 B ✓
1tw002sq5bo4l.js gzip 10 kB N/A -
1wlerik1n7zbr.js gzip 8.7 kB N/A -
2adqvoge6lpfh.js gzip 158 B N/A -
2p258r6i_g46u.js gzip 160 B N/A -
2pevdqjpbf3xk.js gzip 9.45 kB N/A -
2qd2anu9eizlz.js gzip 8.75 kB N/A -
2sv39ae5_8vfj.js gzip 8.81 kB N/A -
2uajjc2s_55-p.js gzip 46.3 kB N/A -
2utx6n7w65xqa.js gzip 8.7 kB N/A -
2y2wax87jrb46.js gzip 160 B N/A -
3-ukivglqkfeq.js gzip 8.78 kB N/A -
325xisqrylugu.js gzip 450 B N/A -
32vuihmm7kjff.js gzip 153 B N/A -
3b77tvj07uc7l.js gzip 71.4 kB N/A -
3jc9ghvds1spf.js gzip 2.29 kB N/A -
3juwkvkgvywfe.js gzip 10.6 kB N/A -
3kbove7q58uqh.js gzip 13.2 kB N/A -
3q56whibrwhcn.js gzip 155 B N/A -
3qn7vntp30gaj.js gzip 1.47 kB N/A -
3tcg-xdj3btz6.js gzip 65.6 kB N/A -
3um71t-s-d_9s.js gzip 155 B N/A -
3wflrlfuu0vvm.js gzip 155 B N/A -
turbopack-19..-j9a.js gzip 3.86 kB N/A -
turbopack-1j..fsjr.js gzip 3.84 kB N/A -
turbopack-1k..xq38.js gzip 3.84 kB N/A -
turbopack-1m..t8yc.js gzip 3.85 kB N/A -
turbopack-1p..iqev.js gzip 3.84 kB N/A -
turbopack-1u..95l4.js gzip 3.84 kB N/A -
turbopack-2d..uiz0.js gzip 3.84 kB N/A -
turbopack-2j..k0h2.js gzip 3.84 kB N/A -
turbopack-2n..m8pn.js gzip 3.84 kB N/A -
turbopack-2x..8ayc.js gzip 3.85 kB N/A -
turbopack-37..a6ci.js gzip 3.85 kB N/A -
turbopack-39..m8zy.js gzip 3.84 kB N/A -
turbopack-3c..ew6-.js gzip 3.84 kB N/A -
turbopack-3g..6h8k.js gzip 3.83 kB N/A -
030a1njeh5b77.js gzip N/A 10 kB -
06o7kggwe5neo.js gzip N/A 156 B -
0dvzuazs1j0mf.js gzip N/A 161 B -
0ex9bq9g6zp-0.js gzip N/A 169 B -
0ot0qt5np20h7.js gzip N/A 8.78 kB -
0pdu7sye-gejv.js gzip N/A 157 B -
0qxjvy0dguqxu.js gzip N/A 158 B -
0v-8n7x26pyzs.js gzip N/A 152 B -
0wtvkl__zq6ui.js gzip N/A 155 B -
12m9rr7_7cexd.js gzip N/A 8.7 kB -
186r3y_rfvr0b.js gzip N/A 8.78 kB -
19v97848yrjp7.js gzip N/A 8.81 kB -
1nd_0rwgz2ozk.js gzip N/A 9.45 kB -
1oi9pltr_e10m.js gzip N/A 10.6 kB -
1pl7he22-q2-f.js gzip N/A 156 B -
1rd9tzqgzsz2w.js gzip N/A 8.77 kB -
1rq1g_cwv642d.js gzip N/A 10.3 kB -
1un3derkfzkyp.js gzip N/A 156 B -
1uojw_uabeg93.js gzip N/A 450 B -
1w-7lusgyl81y.js gzip N/A 8.7 kB -
2-_pb26jxhvzw.js gzip N/A 46.3 kB -
21h56wdn9zddo.js gzip N/A 8.75 kB -
2fxxq9ji2sac4.js gzip N/A 65.6 kB -
2jp1fuvxwoiaz.js gzip N/A 7.45 kB -
2m57nz3ehmxuc.js gzip N/A 157 B -
2ovff1533zvno.js gzip N/A 13.2 kB -
2s4z8jy0z7v93.js gzip N/A 1.46 kB -
2s5d6umxgi4qw.js gzip N/A 157 B -
2y6gb5bs4mnam.js gzip N/A 8.75 kB -
341h71ln1jpl3.js gzip N/A 2.29 kB -
34ttpt_n7605h.js gzip N/A 5.72 kB -
36ckfq9o-ys-a.js gzip N/A 13.1 kB -
3iodf_44jjw8s.js gzip N/A 3.54 kB -
3k2c4xo700tmi.js gzip N/A 162 B -
3ojc1mgc0yaxk.js gzip N/A 155 B -
3vdh6_u50pu5t.js gzip N/A 13.6 kB -
44sa39v7lpfin.js gzip N/A 71.4 kB -
turbopack-0-..gim4.js gzip N/A 3.85 kB -
turbopack-0l..3t_v.js gzip N/A 3.84 kB -
turbopack-18..iq2h.js gzip N/A 3.84 kB -
turbopack-19..e5vl.js gzip N/A 3.85 kB -
turbopack-2_..o3_v.js gzip N/A 3.84 kB -
turbopack-2d..8ji9.js gzip N/A 3.84 kB -
turbopack-2e..6vkv.js gzip N/A 3.85 kB -
turbopack-2j..7v9o.js gzip N/A 3.85 kB -
turbopack-2j..93ej.js gzip N/A 3.86 kB -
turbopack-2q..g022.js gzip N/A 3.85 kB -
turbopack-31..52b6.js gzip N/A 3.84 kB -
turbopack-3i..pj7i.js gzip N/A 3.84 kB -
turbopack-3j..70ob.js gzip N/A 3.82 kB -
turbopack-3n..g14a.js gzip N/A 3.84 kB -
Total 450 kB 450 kB ⚠️ +48 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 774 B 775 B ✓
Total 774 B 775 B ⚠️ +1 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 435 B 431 B ✓
Total 435 B 431 B ✅ -4 B
Build Cache
Canary PR Change
00000001.sst gzip 14.3 MB 13.4 MB 🟢 845 kB (-6%)
00000002.sst gzip 15 MB 15.1 MB 🔴 +120 kB (+1%)
00000003.sst gzip 14.6 MB 14.8 MB 🔴 +165 kB (+1%)
00000004.sst gzip 11.4 MB 11.9 MB 🔴 +512 kB (+5%)
00000005.sst gzip 10.3 MB 10.3 MB 🟢 12.7 kB (0%)
00000006.sst gzip 2.83 MB 2.83 MB ✓
00000007.sst gzip 59 B 59 B ✓
00000008.meta gzip 89 B 89 B ✓
00000009.meta gzip 299 kB 298 kB ✓
00000010.meta gzip 298 kB 299 kB ✓
00000011.meta gzip 298 kB 298 kB ✓
00000012.sst gzip 51.2 kB 51.8 kB 🔴 +573 B (+1%)
00000013.sst gzip 1.87 MB 1.92 MB 🔴 +54.5 kB (+3%)
00000014.sst gzip 59 B 59 B ✓
00000015.meta gzip 116 B 116 B ✓
00000016.meta gzip 324 kB 324 kB ✓
00000017.meta gzip 403 kB 404 kB ✓
00000018.sst gzip 52 kB 52.6 kB 🔴 +630 B (+1%)
00000019.sst gzip 1.4 MB 1.39 MB 🟢 9.37 kB (-1%)
00000020.sst gzip 59 B 59 B ✓
00000021.meta gzip 116 B 116 B ✓
00000022.meta gzip 324 kB 324 kB ✓
00000023.meta gzip 370 kB 370 kB ✓
00000024.sst gzip 52 kB 52.7 kB 🔴 +743 B (+1%)
00000025.sst gzip 1.4 MB 1.39 MB 🟢 9.25 kB (-1%)
00000026.sst gzip 59 B 59 B ✓
00000027.meta gzip 116 B 116 B ✓
00000028.meta gzip 324 kB 324 kB ✓
00000029.meta gzip 370 kB 370 kB ✓
00000030.sst gzip 51.3 kB 51.9 kB 🔴 +554 B (+1%)
00000031.sst gzip 1.4 MB 1.39 MB 🟢 9.14 kB (-1%)
00000032.sst gzip 59 B 59 B ✓
00000033.meta gzip 116 B 116 B ✓
00000034.meta gzip 324 kB 324 kB ✓
00000035.meta gzip 370 kB 370 kB ✓
00000036.sst gzip 51.9 kB 52.5 kB 🔴 +665 B (+1%)
00000037.sst gzip 1.4 MB 1.39 MB 🟢 9.2 kB (-1%)
00000038.sst gzip 59 B 59 B ✓
00000039.meta gzip 116 B 116 B ✓
00000040.meta gzip 324 kB 324 kB ✓
00000041.meta gzip 370 kB 370 kB ✓
CURRENT gzip 24 B 24 B ✓
LOG gzip 681 B 662 B 🟢 19 B (-3%)
Total 80.5 MB 80.5 MB ✅ -38.9 kB

📦 Webpack

Client

Main Bundles
Canary PR Change
3322-HASH.js gzip 65 kB N/A -
4191.HASH.js gzip 169 B N/A -
7920-HASH.js gzip 4.68 kB N/A -
9784-HASH.js gzip 5.63 kB N/A -
b1ad9f4c-HASH.js gzip 63.2 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB ✓
main-app-HASH.js gzip 254 B 254 B ✓
main-HASH.js gzip 40 kB 40 kB ✓
webpack-HASH.js gzip 1.68 kB 1.68 kB ✓
3577.HASH.js gzip N/A 168 B -
578-HASH.js gzip N/A 65.7 kB -
8590-HASH.js gzip N/A 5.61 kB -
9750-HASH.js gzip N/A 4.69 kB -
a8984546-HASH.js gzip N/A 63.2 kB -
Total 240 kB 241 kB ⚠️ +694 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 193 B ✓
_error-HASH.js gzip 181 B 182 B ✓
css-HASH.js gzip 334 B 331 B ✓
dynamic-HASH.js gzip 1.81 kB 1.81 kB ✓
edge-ssr-HASH.js gzip 255 B 253 B ✓
head-HASH.js gzip 349 B 351 B ✓
hooks-HASH.js gzip 382 B 384 B ✓
image-HASH.js gzip 581 B 582 B ✓
index-HASH.js gzip 260 B 259 B ✓
link-HASH.js gzip 2.48 kB 2.48 kB ✓
routerDirect..HASH.js gzip 317 B 318 B ✓
script-HASH.js gzip 384 B 386 B ✓
withRouter-HASH.js gzip 316 B 315 B ✓
1afbb74e6ecf..834.css gzip 106 B 106 B ✓
Total 7.95 kB 7.95 kB ⚠️ +1 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 129 kB 128 kB ✓
page.js gzip 293 kB 294 kB ✓
Total 421 kB 422 kB ⚠️ +313 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 616 B 617 B ✓
middleware-r..fest.js gzip 156 B 156 B ✓
middleware.js gzip 45.6 kB 45.2 kB ✓
edge-runtime..pack.js gzip 842 B 842 B ✓
Total 47.2 kB 46.8 kB ✅ -357 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 718 B 718 B ✓
Total 718 B 718 B ✓
Build Cache
Canary PR Change
0.pack gzip 4.85 MB 4.85 MB 🟢 6.04 kB (0%)
index.pack gzip 123 kB 122 kB ✓
index.pack.old gzip 124 kB 123 kB ✓
Total 5.1 MB 5.09 MB ✅ -6.51 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 373 kB 373 kB ✓
app-page-exp..prod.js gzip 206 kB 206 kB ✓
app-page-tur...dev.js gzip 373 kB 373 kB ✓
app-page-tur..prod.js gzip 206 kB 206 kB ✓
app-page-tur...dev.js gzip 369 kB 369 kB ✓
app-page-tur..prod.js gzip 204 kB 204 kB ✓
app-page.run...dev.js gzip 369 kB 369 kB ✓
app-page.run..prod.js gzip 204 kB 204 kB ✓
app-route-ex...dev.js gzip 83 kB 83 kB ✓
app-route-ex..prod.js gzip 56.1 kB 56.1 kB ✓
app-route-tu...dev.js gzip 83.1 kB 83.1 kB ✓
app-route-tu..prod.js gzip 56.2 kB 56.2 kB ✓
app-route-tu...dev.js gzip 82.6 kB 82.6 kB ✓
app-route-tu..prod.js gzip 55.9 kB 55.9 kB ✓
app-route.ru...dev.js gzip 82.6 kB 82.6 kB ✓
app-route.ru..prod.js gzip 55.9 kB 55.9 kB ✓
dev-validati...dev.js gzip 133 kB 133 kB ✓
dev-validati...dev.js gzip 133 kB 133 kB ✓
dev-validati...dev.js gzip 131 kB 131 kB ✓
dev-validati...dev.js gzip 131 kB 131 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 46 kB 46 kB ✓
pages-api-tu..prod.js gzip 34.3 kB 34.3 kB ✓
pages-api.ru...dev.js gzip 45.9 kB 45.9 kB ✓
pages-api.ru..prod.js gzip 34.3 kB 34.3 kB ✓
pages-turbo....dev.js gzip 54.7 kB 54.7 kB ✓
pages-turbo...prod.js gzip 39.8 kB 39.8 kB ✓
pages.runtim...dev.js gzip 54.7 kB 54.7 kB ✓
pages.runtim..prod.js gzip 39.8 kB 39.8 kB ✓
server.runti..prod.js gzip 66.9 kB 66.9 kB ✓
use-cache-pr...dev.js gzip 72.1 kB 72.1 kB ✓
use-cache-pr...dev.js gzip 72.1 kB 72.1 kB ✓
use-cache-pr...dev.js gzip 70.4 kB 70.4 kB ✓
use-cache-pr...dev.js gzip 70.4 kB 70.4 kB ✓
Total 4.09 MB 4.09 MB ✓
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/8deefa72d94578d0f51f0536e06f211e6dd5f5e0/next

Commit: 8deefa7

Copy link
Copy Markdown
Member Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions

github-actions Bot commented Jul 15, 2026 •

Copy link
Copy Markdown
Contributor

Tests Passed

Commit: 8deefa7

@mischnic mischnic changed the title migrate font resolve plugins Implement next font ResolvePlugins as Jul 15, 2026
@mischnic mischnic changed the title Implement next font ResolvePlugins as Implement next font ResolvePlugins as ImportMappingReplacement Jul 15, 2026
@mischnic mischnic changed the title Implement next font ResolvePlugins as ImportMappingReplacement Implement next/font ResolvePlugins as ImportMappingReplacement Jul 15, 2026
@mischnic mischnic changed the title Implement next/font ResolvePlugins as ImportMappingReplacement Implement next/font BeforeResolvePlugins as ImportMappingReplacement Jul 15, 2026
@mischnic
mischnic marked this pull request as ready for review July 15, 2026 09:45
@mischnic
mischnic requested a review from a team July 15, 2026 10:54
Self::cell(options)
}

#[turbo_tasks::function]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: doesn't need to be a turbo task function?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

that was already a turbotask function, and it does do quite a bit of projecting, I think

@mischnic
mischnic merged commit 783d845 into canary Aug 5, 2026
230 of 232 checks passed
@mischnic
mischnic deleted the mischnic/font-import-map-replacer branch August 5, 2026 14:18
m-kawafuji pushed a commit to m-kawafuji/next.js that referenced this pull request Aug 8, 2026
…ercel#95808)

ImportMappingReplacement are more efficient: import maps are backed by a
single radix tree, as opposed to having to run every single
ResolvePlugin's matchers in sequence.

This basically undoes vercel#65870 by
@wbinnssmith, but I don't entirely understand why this was done:
> This is used to replace ImportMapping replacers for @next/font/local
in an upcoming Next.js PR
@github-actions github-actions Bot added the locked label Sep 6, 2026
@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Sep 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants