Commit Graph

35 Commits

Author SHA1 Message Date
Will Binns-Smith 6fbba169cd bundle-analyzer: add table view to single-build analyzer (#93523)
Extends the view toggle (introduced in the previous PR for compare mode)
to single-build mode as well. The table view lists all sources for the
selected route with sizes and env badges. Internally it reuses
`DiffTable` in `mode="single"` by diffing the build against itself,
which produces an all-`identical` summary — this keeps a single
source-listing implementation regardless of mode.

<!-- NEXT_JS_LLM_PR -->

Co-authored-by: vercel-fleet-prod[bot] <318278635+vercel-fleet-prod[bot]@users.noreply.github.com>
Co-authored-by: Will Binns-Smith <755844+wbinnssmith@users.noreply.github.com>
2026-09-10 12:47:56 -07:00
Will Binns-Smith 0bdea6782d bundle-analyzer: add table view to compare mode (#93522)
Adds a table view to compare mode, switchable from the treemap via a
toggle in the top bar. The `DiffTable` lists every source file with its
A/B sizes, delta, and env badges, and supports text search. Removed
sources (which can't appear in the treemap since they don't exist in the
current build) are only visible here.

The view toggle defaults to Table when entering compare mode and resets
to Treemap when leaving it.

<!-- NEXT_JS_LLM_PR -->

Co-authored-by: vercel-fleet-prod[bot] <318278635+vercel-fleet-prod[bot]@users.noreply.github.com>
Co-authored-by: Will Binns-Smith <755844+wbinnssmith@users.noreply.github.com>
2026-09-10 12:47:56 -07:00
Will Binns-Smith 2f3f74b13f bundle-analyzer: add compare view with treemap diff (#93521)
Adds a compare mode to the bundle analyzer. When the user picks a
historical snapshot from the new baseline picker in the top bar, the UI
switches into compare mode: routes are diff'd by name and size, and the
per-route view shows a `DiffTreemap` that colors each source tile by its
change status (added/removed/grew/shrank/unchanged).

The compare sidebar shows the import chain for the selected tile on
either the baseline ("A") or current ("B") side. Route totals are
fetched in parallel so the route picker can sort by largest impact and
classify routes as `changed`/`identical` rather than just name-presence.

<!-- NEXT_JS_LLM_PR -->

---------

Co-authored-by: vercel-fleet-prod[bot] <318278635+vercel-fleet-prod[bot]@users.noreply.github.com>
Co-authored-by: Will Binns-Smith <755844+wbinnssmith@users.noreply.github.com>
2026-09-10 12:47:55 -07:00
Will Binns-Smith 57a8476086 bundle-analyzer: record historical snapshots on each analyze run (#93520)
After each `next experimental-analyze` run, snapshot the output data
into a rolling `history/` directory so later builds can use it as a
comparison baseline.

Each snapshot gets a `metadata.json` with git branch/sha/dirty status,
Next.js version, and route count. A `history/history.json` index
(newest-first, capped at 20 entries) lets the UI list available
baselines without re-reading every snapshot directory. Old snapshots
beyond the cap are pruned automatically.

The client-side `SnapshotMetadata` type mirror lives in
`apps/bundle-analyzer/lib/snapshot.ts` so the compare UI can reference
it without a build-time dependency on the Next.js package.

<!-- NEXT_JS_LLM_PR -->

---------

Co-authored-by: vercel-fleet-prod[bot] <318278635+vercel-fleet-prod[bot]@users.noreply.github.com>
Co-authored-by: Will Binns-Smith <755844+wbinnssmith@users.noreply.github.com>
2026-09-09 14:11:28 -07:00
Niklas Mischkulnig 0e6f52e99b Turbopack: fix bundle-analyzer for NFT change (#93363)
We have no testing infrastructure, unfortunately

<img width="2254" height="1260" alt="Bildschirmfoto 2026-05-28 um 20 29
58"
src="https://github.com/user-attachments/assets/a9f1b646-994d-4417-98d7-160ce5249032"
/>
2026-06-02 18:24:38 +02:00
Luke Sandberg a9cd6d7e45 Revert "Adopt pnpm catalogs for devDependencies" (#93226)
Reverts vercel/next.js#93071

This breaks our use of lerna, lerna uses npm-package-arg to parse
package.json files and cannot resolve `catalog` references
2026-04-24 16:18:08 -07:00
Luke Sandberg c52634747c Adopt pnpm catalogs for devDependencies (#93071)
### What?

Adopt pnpm [catalogs](https://pnpm.io/catalogs) for shared hoisted devDependencies: `typescript`, `jest`, `eslint`, and `prettier`. Each is pinned once in `pnpm-workspace.yaml` and referenced as `"<name>": "catalog:"` by every consumer.

Also adds the missing `dom.iterable` lib to `@next/routing`'s tsconfig, required by `URLSearchParams.entries()` in TypeScript 6.

### Why?

Several packages invoke these binaries in their build, test, or lint scripts but do not declare them in their own `devDependencies` — they rely on the hoisted root install.

This breaks Turborepo's cache invalidation: without a declared dep, a package has no lockfile edge to the tool, so bumping its version (e.g. #91257's TypeScript 5 → 6 upgrade) does not invalidate that package's task hash. `@next/routing`'s `types` task has been a remote-cache hit on canary since the TS 6 bump, even though it now fails locally on a cold cache — CI is replaying a stale pre-bump success.

The same latent hazard exists for `jest` (`@next/codemod`), `eslint` (`@next/bundle-analyzer-ui`), and `prettier` (`create-next-app`).

### How?

- `pnpm-workspace.yaml` defines `catalog:` entries for each tool.
- Consumer packages declare `"<name>": "catalog:"`. pnpm still hoists one copy, but each consumer now has a real lockfile edge to the resolved version.
- Root `package.json` migrates each pin to `"catalog:"` so the workspace file is the single source of truth.

Turborepo needs no changes — its existing per-package hashing picks up lockfile edge changes automatically. Future catalog bumps will invalidate every consumer's cache.

`@types/node` is a deliberate omission from this round: several packages intentionally pin different majors (`^22`, `^20`, `20.14.2`), so migrating it needs per-package intent review rather than bulk conversion.

<!-- NEXT_JS_LLM_PR -->
2026-04-21 11:53:42 -07:00
Luke Sandberg d4b051d92a Update next versions of internal apps (#92666)
Update next versions of internal apps

The `Deploy docs to Vercel` job is also broken at head

Fixes: VULN-7922
Fixes: VULN-7923
2026-04-14 09:07:00 -07:00
Sebastian "Sebbie" Silbermann d141874063 Bump TypeScript to 6.0 (#91257) 2026-04-14 12:22:38 +02:00
Tim Neutkens 6d82715d45 Fix swc wasm test on canary (#92738)
## What?

Fixes the failure of "test next-swc wasm" on the canary branch. The env
var it sets incorrectly propagated into the build process for the bundle
analyzer.

Example:
https://github.com/vercel/next.js/actions/runs/24352454644/job/71117953939

This makes sure that the env var is set to empty so that it is ignored
for that step specifically.

Ideally we'd figure out a more granular way to set this env var where it
is needed instead, but this unblocks the CI.
2026-04-14 10:57:14 +02:00
Will Binns-Smith 5809756f55 bundle-analyzer: merge _app route modules into current route visualization (#90841)
This:

- Fetches `data/_app/analyze.data` alongside the current route's data
- Merges `_app` modules into the current route's `AnalyzeData` before
visualization using a `mergeAnalyzeData()`, which merges the two
datasets, reindexing the additional ones and recreating the binary data
format expected by the treemap.

## Test plan

- [x] Add a large dependency (e.g. `moment`) in `pages/_app.tsx`
- [x] Run `next experimental-analyze`
- [x] Open the bundle analyzer and select a pages page
- [x] Verify moment appears in the treemap
- [x] Verify App Router projects (no `_app`) work without errors
2026-03-12 14:52:36 -07:00
Sebastian "Sebbie" Silbermann c36d342725 [ci] Crash if next-swc could not be loaded when NEXT_TEST_NATIVE_DIR is specified (#90387) 2026-02-25 21:55:45 +01:00
Will Binns-Smith 71f9a8c65c bundle analyzer: remove uncompressed toggle, stabilize top bar ui (#87325)
This:

- Removes the uncompressed/compressed toggle in favor of just using
compressed sizes when sizing treemap nodes
- Fixes the width of the client/server and file type triggers so that
they don't reflow horizontally when their content changes

Fixes PACK-6295
Fixes PACK-6298
2025-12-19 10:44:14 -08:00
Will Binns-Smith 754db28e52 bundle analyzer: remove geist font in favor of system ui fonts (#87292) 2025-12-17 19:16:12 -08:00
Luke Sandberg 1e1fd1ec02 Cross link to the demo from the bundle analyzer (#87290)
Drop some references so there is a plausible path to updating these in the future
2025-12-17 18:12:40 -08:00
Will Binns-Smith 684fb73071 bundle analyzer: prevent flashes and stuck empty canvases on resize (#87289) 2025-12-17 18:12:21 -08:00
Will Binns-Smith 39c6cbb208 bundle-analyzer: use <Select> and multiselect for top bar (#87254)
The top bar is getting quite wide with all of its button toggle groups.
This:

- Converts the Compressed/Uncompressed and Client/Server toggles to
shadcn `<Select>`s
- Adds a custom `<MultiSelect>` implementation since this is missing in
shadcn. This composes shadcn’s popovers and a series of checkboxes,
along with accessibility attributes and keyboard shortcuts.
- Uses this `<MultiSelect>` for the type filter
- Removes the divider between these since there aren’t any groups left
to divide

<img width="1547" height="719" alt="image"
src="https://github.com/user-attachments/assets/4041f6b7-2a47-4e17-b020-448ac0103740"
/>
2025-12-16 23:09:32 -08:00
Will Binns-Smith ec85895d74 bundle-analyzer: Show compressed sizes (#87093) 2025-12-16 05:49:54 +00:00
Sebastian "Sebbie" Silbermann 8479550bc5 Update installed Next.js (#87081) 2025-12-11 22:39:30 +01:00
Will Binns-Smith 5099903e88 bundle-analyzer: add kbd shortcut labels and fix focus bugs (#87001)
- Adds decorated kbd-style shortcut labels to cue the user into using them
- Listens only for the appropriate OS or Ctrl key on Mac/Others
- Esc now clears and focuses the search field and the treemap focus
- Does not trigger in the case where the user has another element focused

![image.png](https://app.graphite.com/user-attachments/assets/6a85d1e7-a711-432d-86b0-f65c0b89de74.png)
2025-12-09 23:36:19 -08:00
Will Binns-Smith 585126e2b3 bundle-analyzer: Add sizes to treemap, status bar (#86966)
![CleanShot 2025-12-08 at 19.58.55@2x.png](https://app.graphite.com/user-attachments/assets/43f13844-abe2-4a1b-bbc4-764554ca6634.png)
2025-12-09 15:02:54 -08:00
Will Binns-Smith 2ac04b03e9 bundle-analyzer: redesign info hierarchy in sidebar (#86963)
This better reflects the information hierarchy in the design and declutters the sidebar.

This PR also adds recursive size calculation when directories are selected.

Closes PACK-5828
Closes PACK-6030

![image.png](https://app.graphite.com/user-attachments/assets/83297d13-1689-4fc2-a254-4c0d1f21aaba.png)

![image.png](https://app.graphite.com/user-attachments/assets/fb3c76bc-61ae-4f50-a64c-fad0ff3ec9a8.png)

![image.png](https://app.graphite.com/user-attachments/assets/6d85c828-4917-4546-b8e9-742035635d73.png)
2025-12-09 14:28:00 -08:00
Sebastian "Sebbie" Silbermann 51459c6f8a Update installed Next.js (#86822) 2025-12-04 15:15:23 +01:00
Niklas Mischkulnig 4db3802eb5 Stop apps/bundle-analyzer/next-env.d.ts from changing (#86743) 2025-12-02 20:02:58 +01:00
Jiwon Choi c40eb0c18e [bundle-analyzer] Disable revalidateOnFocus and revalidateOnReconnect (#86688)
For the `experimental-analyze`, the page resets its selected state
`onSuccess`.


https://github.com/vercel/next.js/blob/2307d46f511d02f48d4b8f93713c4bc087c0e5ff/apps/bundle-analyzer/app/page.tsx#L64-L68

However, since SWR revalidates on focus, if you click outside the tab
and come back, e.g., write to docs or messengers, it revalidates and
resets the state. Since the current view can be inside multiple depths,
losing that state for focus can be painful. Therefore, set
`revalidateOnFocus` to false. For similar reasons, set
`revalidateOnReconnect` to false as well.

### Before


https://github.com/user-attachments/assets/ed04b4c2-f414-4fd9-9a6e-4c910031af9f

### After


https://github.com/user-attachments/assets/4130e3ca-9f3a-4f8b-8a5b-a8eb8d7d23dc
2025-12-01 14:22:36 +01:00
Zack Tanner a315d9fe32 Revert "add bundle analyzer as dev dependency to next (#86497)" (#86672)
I believe this is still breaking publishes. Reverts #86497
x-ref:
https://github.com/vercel/next.js/actions/runs/19790732218/job/56728905106
2025-11-30 20:23:23 +00:00
Tobias Koppers a1e2499574 add bundle analyzer as dev dependency to next (#86497)
### What?

We need to the dependency to make turborepo run the tasks in the correct order.
2025-11-27 13:36:25 +01:00
Zack Tanner 09c2f3c992 Revert "Turbopack: add bundle-analyzer to versioning and add dependen… (#86394)
…cy (#86355)"

This reverts commit 5b97f1f7b5.

Investigating if it fixes broken publishes.
2025-11-21 11:40:13 -08:00
Tobias Koppers e9a3ba935f Turbopack: fix import chain by determining depth locally per route (#86350)
### What?

fix the import chain showing only modules relevant to the current route

fix module graph being merged by path. It's keyed by identifier now.

also add more info to import chain, e. g. layer info. and more details in tooltip.
2025-11-21 11:39:18 +01:00
Tobias Koppers 5b97f1f7b5 Turbopack: add bundle-analyzer to versioning and add dependency (#86355)
### What?

fix lerna config and add dependency to make turborepo happy
2025-11-21 08:32:18 +01:00
Tobias Koppers c42d0e3d27 Turbopack: decode url encoding and relative paths in source maps (#86342)
### What?

decode url encoding and relative paths in source maps
2025-11-21 06:15:36 +01:00
Will Binns-Smith 24033486b5 next-analyze: improve network error visuals (#86222)
This improves how network errors (such as when the bundle analyzer error server is shut down) are shown.

Fixes PACK-5877

![image.png](https://app.graphite.com/user-attachments/assets/69e57bb7-03ca-45ec-9816-f4bc512bfd58.png)

![image.png](https://app.graphite.com/user-attachments/assets/450ed52c-5368-49ee-a149-e7b17a8c21db.png)
2025-11-20 11:13:57 -08:00
Tobias Koppers f0a1a69a2b Turbopack: bundle-analyzer need to avoid using the local next.js build (#86258)
### What?

Next build breaks when the API doesn't match.
2025-11-20 12:36:39 +01:00
Will Binns-Smith 3e5b96a17e next analyze: annotate polyfill modules in UI (#86062)
For small routes, it can appear like the polyfill chunk takes up a sizable amount of data, but `polyfill-nomodule.js` is only sent to legacy browsers. This makes it clearer.

This PR enhances the bundle analyzer by adding visual indicators for polyfill chunks, and noting they're conditionally sent to modern or legacy browsers. The changes include:

- Adds a source map to polyfill chunks (for the large pre-bundled input only)
- Visually distinguished polyfill chunks in the treemap by lightening their color
- Added a "Polyfill" badge (other badges coming soon!) with text when viewing polyfill chunk details

<img width="388" height="227" alt="image" src="https://github.com/user-attachments/assets/bcebfba6-1e10-459a-9364-b6b8197cd3df" />

Fixes PACK-5826
2025-11-17 18:02:03 -08:00
Will Binns-Smith 617ead5753 Turbopack: Add bundle analyzer UI to next build --experimental-analyze (#85788)
This adds an interactive Treemap-style bundle analyzer app to the Next.js codebase and writes a copy to disk when `next build --experimental-analyze` is run.

* It's a separate app in `apps/bundle-analyzer` as `@next/bundle-analyzer-ui` that uses `output: 'export'` to export a purely static Next.js app
* These static resources are copied into Next.js's published `dist` directory in the `next` package itself. Users never depend on `@next/bundle-analyzer-ui`
* When users run `next build --experimental-analyze`, these static resources are copied into the user's `.next/diagnostics/analyze` along with the data payloads needed to visualize the user's app

In an upcoming PR, we'll add `next experimental-analyze` that will create analysis files without build artifacts, as well as optionally start a static file server.

Test Plan: Ran `next build --experimental-analyze` in a test app and ran a static file server to run it.
2025-11-14 15:50:42 -08:00