Skip to content

feat(benchmarks): client-side CPU benchmark scenario suite - #7732

Merged
Sheraff merged 8 commits into
mainfrom
flo/client-nav-cpu-scenarios
Jul 3, 2026
Merged

feat(benchmarks): client-side CPU benchmark scenario suite#7732
Sheraff merged 8 commits into
mainfrom
flo/client-nav-cpu-scenarios

Conversation

@Sheraff

Copy link
Copy Markdown
Collaborator

Summary

Adds a complete suite of client-side CPU benchmarks to benchmarks/client-nav: 11 scenarios × react/solid/vue (36 benches), covering the client router's main code paths. They run in CI through CodSpeed via the existing Benchmarks workflow (the matrix picks them up with zero workflow changes) and locally via the usual nx targets.

ScenarioIsolates
async-pipelineasync loaders (transition-held navigation), async beforeLoad context, parallel nested async loaders — all via counted 0ms hops
control-flowloader-thrown redirect (2-hop chain), notFound(), loader errors + errorComponent, boundary reset on recovery
headnested head() evaluation, meta/link dedupe, head DOM updates per navigation
historypush/replace/back/forward traversal, location masking, registered-but-never-blocking useBlocker, useCanGoBack/useLocation
links~200 mounted <Link>s recomputing active state per navigation, activeOptions variants, MatchRoute/useMatchRoute
loadersalways-stale re-runs, cache hits, loaderDeps-keyed caching, router.invalidate(), useLoaderData selectors
mountcold start: createRouter + first render + initial load + unmount (fresh router per mount)
nested-params8 dynamic levels: per-level params.parse/stringify, beforeLoad context accumulation, per-level subscribers
preloadhover-intent preloading, programmatic preloadRoute, deterministic preload cache (defaultPreloadStaleTime: 0)
route-tree-scalematching/link resolution on a wide ~40-route tree (static, dynamic, prefixed-param, splat, pathless, groups)
search-paramsvalidateSearch, retainSearchParams/stripSearchParams, functional updaters, structural sharing, useSearch selectors

Design

  • Every scenario is an isolated file-based-routing app per framework (route trees generated by @tanstack/router-plugin, routeTree.gen.ts committed), built for production (minify: false) and benched against the built bundle in jsdom — real-user app shape, not synthetic route objects.
  • A shared harness (scenarios/harness.ts) drives circular step sequences of real <Link> clicks (plus hover / programmatic-preload / history-traversal / invalidate steps), each synchronized on the router's onRendered event. Setup runs a warm-up lap asserting every step's observable output (document.title, DOM markers, active-link counts, pathnames) so a scenario that silently breaks fails instead of reporting a fast time.
  • The workload definition (scenarios/<name>/shared.ts) is framework-agnostic; the three apps differ only in the rendering layer, so cross-framework numbers are comparable in shape.
  • Determinism: no wall-clock timers (counted 0ms hops only), staleTime/gcTime pinned to 0/1e9, defaultPreloadStaleTime: 0, stationary DOM and session-history depth across laps. Calibrated so each bench's vitest bench run lands between ~10s and ~16.5s locally.
  • Baseline apps and bench names are untouched for CodSpeed continuity (baseline vite configs only gain an explicit root/absolute setupFiles so they resolve identically under the new per-framework aggregate configs).

Notable findings encoded in the suite

  • React 19 throttles every Suspense reveal by ~300ms wall-clock (Await, pendingComponent, fallback-less suspension alike) — component-level Suspense is inherently non-deterministic to benchmark, so async-pipeline measures the router's async pipeline instead (documented in the README and the scenario's shared.ts).
  • control-flow's React app passes onCaughtError: () => {} to createRoot — React 19's default caught-error reporting otherwise emits ~23k stderr lines per run inside the measured loop.
  • Vue route files must define defineComponent components before the createFileRoute() call: after bundling (var hoisting), a later declaration silently becomes component: undefined with no error.
  • Hover-intent preloading works in jsdom across all three adapters (React via synthetic mouseover-driven mouseEnter, Solid/Vue via native mouseenter — the harness dispatches both).
  • Vue's MatchRoute doesn't accept params (usages are to-only; params matching covered via useMatchRoute). Side observation: vue-router's MatchRoute calls useMatchRoute() inside its render function, which may be worth a look separately.

Validation

  • Full nx typecheck: 42 tasks green (33 scenario projects + baselines + builds).
  • All 36 benches run serially per framework: warm-lap assertions pass, rme ≤ ~4% locally (Vue's occasional jsdom GC outliers; CodSpeed's instrumented measurement is unaffected).
  • Exact CI command pair verified per framework: nx run @benchmarks/client-nav:build:<fw> then instrumented test:perf:<fw> --excludeTaskDependencies — 12/12 benches under the CodSpeed plugin.
  • pnpm-lock.yaml change is a hand-added 3-line importer entry for @tanstack/router-plugin (validated by pnpm install --frozen-lockfile); a full re-resolve is currently blocked by the tmp@0.2.7 trust-policy issue, which is unrelated to this PR.

🤖 Generated with Claude Code

Add 11 client-side CPU benchmark scenarios to benchmarks/client-nav, each
implemented identically across react/solid/vue and tracked by CodSpeed
through the existing Benchmarks workflow (no CI changes needed):
async-pipeline, control-flow, head, history, links, loaders, mount,
nested-params, preload, route-tree-scale, search-params
Each scenario is an isolated file-based-routing app (route trees generated
by @tanstack/router-plugin) built for production and driven in jsdom by a
shared harness (scenarios/harness.ts): circular step sequences of real
<Link> clicks (plus hover/preload/history-traversal/invalidate steps),
each synchronized on the router's onRendered event, with a warm-up lap
that asserts every step's observable output. Determinism rules: no
wall-clock timers (counted 0ms hops only), staleTime/gcTime pinned to 0 or
1e9, deterministic preload staleness, stationary DOM and history depth.
The existing baseline apps and bench names are untouched for CodSpeed
continuity; baseline vite configs only gain an explicit root/setupFiles so
they resolve identically under the new per-framework aggregate configs.
Notable constraints encoded in the scenarios:
- Component-level Await/Suspense is excluded from async-pipeline: React 19
throttles every Suspense reveal by ~300ms wall-clock, which is
inherently non-deterministic to benchmark.
- control-flow/react silences React 19's onCaughtError reporting, which
otherwise dominates the measured loop with console I/O.
- Vue route components must be defined before their createFileRoute call
(bundled var hoisting silently yields component: undefined otherwise).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitaiBot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 626 files, which is 326 over the limit of 300.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a59767ee-c82d-4c01-bc57-03e0831cfe7b

📥 Commits

Reviewing files that changed from the base of the PR and between a6337fb and f373691.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (626)
  • benchmarks/client-nav/README.md
  • benchmarks/client-nav/jsdom.ts
  • benchmarks/client-nav/package.json
  • benchmarks/client-nav/react/vite.config.ts
  • benchmarks/client-nav/scenarios/async-pipeline/react/project.json
  • benchmarks/client-nav/scenarios/async-pipeline/react/setup.ts
  • benchmarks/client-nav/scenarios/async-pipeline/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/async-pipeline/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/main.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routes/ctx.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routes/nested.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routes/nested.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/src/routes/slow.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/react/tsconfig.json
  • benchmarks/client-nav/scenarios/async-pipeline/react/vite.config.ts
  • benchmarks/client-nav/scenarios/async-pipeline/shared.ts
  • benchmarks/client-nav/scenarios/async-pipeline/solid/project.json
  • benchmarks/client-nav/scenarios/async-pipeline/solid/setup.ts
  • benchmarks/client-nav/scenarios/async-pipeline/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/async-pipeline/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routes/ctx.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routes/nested.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routes/nested.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/src/routes/slow.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/async-pipeline/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/async-pipeline/vue/project.json
  • benchmarks/client-nav/scenarios/async-pipeline/vue/setup.ts
  • benchmarks/client-nav/scenarios/async-pipeline/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/async-pipeline/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routes/ctx.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routes/nested.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routes/nested.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/src/routes/slow.$id.tsx
  • benchmarks/client-nav/scenarios/async-pipeline/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/async-pipeline/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/control-flow/react/project.json
  • benchmarks/client-nav/scenarios/control-flow/react/setup.ts
  • benchmarks/client-nav/scenarios/control-flow/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/control-flow/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/control-flow/react/src/main.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/broken.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/hop1.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/hop2.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/missing.$id.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/src/routes/target.tsx
  • benchmarks/client-nav/scenarios/control-flow/react/tsconfig.json
  • benchmarks/client-nav/scenarios/control-flow/react/vite.config.ts
  • benchmarks/client-nav/scenarios/control-flow/shared.ts
  • benchmarks/client-nav/scenarios/control-flow/solid/project.json
  • benchmarks/client-nav/scenarios/control-flow/solid/setup.ts
  • benchmarks/client-nav/scenarios/control-flow/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/control-flow/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/control-flow/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/broken.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/hop1.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/hop2.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/missing.$id.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/src/routes/target.tsx
  • benchmarks/client-nav/scenarios/control-flow/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/control-flow/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/control-flow/vue/project.json
  • benchmarks/client-nav/scenarios/control-flow/vue/setup.ts
  • benchmarks/client-nav/scenarios/control-flow/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/control-flow/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/control-flow/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/broken.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/hop1.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/hop2.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/missing.$id.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/src/routes/target.tsx
  • benchmarks/client-nav/scenarios/control-flow/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/control-flow/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/harness.ts
  • benchmarks/client-nav/scenarios/head/react/project.json
  • benchmarks/client-nav/scenarios/head/react/setup.ts
  • benchmarks/client-nav/scenarios/head/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/head/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/head/react/src/main.tsx
  • benchmarks/client-nav/scenarios/head/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/head/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/head/react/src/routes/articles.$id.tsx
  • benchmarks/client-nav/scenarios/head/react/src/routes/docs.$section.tsx
  • benchmarks/client-nav/scenarios/head/react/src/routes/docs.tsx
  • benchmarks/client-nav/scenarios/head/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/head/react/src/routes/settings.tsx
  • benchmarks/client-nav/scenarios/head/react/tsconfig.json
  • benchmarks/client-nav/scenarios/head/react/vite.config.ts
  • benchmarks/client-nav/scenarios/head/shared.ts
  • benchmarks/client-nav/scenarios/head/solid/project.json
  • benchmarks/client-nav/scenarios/head/solid/setup.ts
  • benchmarks/client-nav/scenarios/head/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/head/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/head/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/head/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/head/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/head/solid/src/routes/articles.$id.tsx
  • benchmarks/client-nav/scenarios/head/solid/src/routes/docs.$section.tsx
  • benchmarks/client-nav/scenarios/head/solid/src/routes/docs.tsx
  • benchmarks/client-nav/scenarios/head/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/head/solid/src/routes/settings.tsx
  • benchmarks/client-nav/scenarios/head/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/head/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/head/vue/project.json
  • benchmarks/client-nav/scenarios/head/vue/setup.ts
  • benchmarks/client-nav/scenarios/head/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/head/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/head/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/head/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/head/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/head/vue/src/routes/articles.$id.tsx
  • benchmarks/client-nav/scenarios/head/vue/src/routes/docs.$section.tsx
  • benchmarks/client-nav/scenarios/head/vue/src/routes/docs.tsx
  • benchmarks/client-nav/scenarios/head/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/head/vue/src/routes/settings.tsx
  • benchmarks/client-nav/scenarios/head/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/head/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/history/react/project.json
  • benchmarks/client-nav/scenarios/history/react/setup.ts
  • benchmarks/client-nav/scenarios/history/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/history/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/history/react/src/main.tsx
  • benchmarks/client-nav/scenarios/history/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/history/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/history/react/src/routes/gallery.tsx
  • benchmarks/client-nav/scenarios/history/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/history/react/src/routes/pages.$n.tsx
  • benchmarks/client-nav/scenarios/history/react/src/routes/photos.$photoId.tsx
  • benchmarks/client-nav/scenarios/history/react/tsconfig.json
  • benchmarks/client-nav/scenarios/history/react/vite.config.ts
  • benchmarks/client-nav/scenarios/history/shared.ts
  • benchmarks/client-nav/scenarios/history/solid/project.json
  • benchmarks/client-nav/scenarios/history/solid/setup.ts
  • benchmarks/client-nav/scenarios/history/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/history/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/history/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/history/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/history/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/history/solid/src/routes/gallery.tsx
  • benchmarks/client-nav/scenarios/history/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/history/solid/src/routes/pages.$n.tsx
  • benchmarks/client-nav/scenarios/history/solid/src/routes/photos.$photoId.tsx
  • benchmarks/client-nav/scenarios/history/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/history/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/history/vue/project.json
  • benchmarks/client-nav/scenarios/history/vue/setup.ts
  • benchmarks/client-nav/scenarios/history/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/history/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/history/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/history/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/history/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/history/vue/src/routes/gallery.tsx
  • benchmarks/client-nav/scenarios/history/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/history/vue/src/routes/pages.$n.tsx
  • benchmarks/client-nav/scenarios/history/vue/src/routes/photos.$photoId.tsx
  • benchmarks/client-nav/scenarios/history/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/history/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/links/react/project.json
  • benchmarks/client-nav/scenarios/links/react/setup.ts
  • benchmarks/client-nav/scenarios/links/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/links/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/links/react/src/main.tsx
  • benchmarks/client-nav/scenarios/links/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/links/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/links/react/src/routes/about.tsx
  • benchmarks/client-nav/scenarios/links/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/links/react/src/routes/items.$id.tsx
  • benchmarks/client-nav/scenarios/links/react/tsconfig.json
  • benchmarks/client-nav/scenarios/links/react/vite.config.ts
  • benchmarks/client-nav/scenarios/links/shared.ts
  • benchmarks/client-nav/scenarios/links/solid/project.json
  • benchmarks/client-nav/scenarios/links/solid/setup.ts
  • benchmarks/client-nav/scenarios/links/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/links/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/links/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/links/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/links/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/links/solid/src/routes/about.tsx
  • benchmarks/client-nav/scenarios/links/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/links/solid/src/routes/items.$id.tsx
  • benchmarks/client-nav/scenarios/links/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/links/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/links/vue/project.json
  • benchmarks/client-nav/scenarios/links/vue/setup.ts
  • benchmarks/client-nav/scenarios/links/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/links/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/links/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/links/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/links/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/links/vue/src/routes/about.tsx
  • benchmarks/client-nav/scenarios/links/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/links/vue/src/routes/items.$id.tsx
  • benchmarks/client-nav/scenarios/links/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/links/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/loaders/react/project.json
  • benchmarks/client-nav/scenarios/loaders/react/setup.ts
  • benchmarks/client-nav/scenarios/loaders/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/loaders/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/loaders/react/src/main.tsx
  • benchmarks/client-nav/scenarios/loaders/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/loaders/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/loaders/react/src/routes/cached.$id.tsx
  • benchmarks/client-nav/scenarios/loaders/react/src/routes/deps.tsx
  • benchmarks/client-nav/scenarios/loaders/react/src/routes/fresh.$id.tsx
  • benchmarks/client-nav/scenarios/loaders/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/loaders/react/tsconfig.json
  • benchmarks/client-nav/scenarios/loaders/react/vite.config.ts
  • benchmarks/client-nav/scenarios/loaders/shared.ts
  • benchmarks/client-nav/scenarios/loaders/solid/project.json
  • benchmarks/client-nav/scenarios/loaders/solid/setup.ts
  • benchmarks/client-nav/scenarios/loaders/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/loaders/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/loaders/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/loaders/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/loaders/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/loaders/solid/src/routes/cached.$id.tsx
  • benchmarks/client-nav/scenarios/loaders/solid/src/routes/deps.tsx
  • benchmarks/client-nav/scenarios/loaders/solid/src/routes/fresh.$id.tsx
  • benchmarks/client-nav/scenarios/loaders/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/loaders/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/loaders/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/loaders/vue/project.json
  • benchmarks/client-nav/scenarios/loaders/vue/setup.ts
  • benchmarks/client-nav/scenarios/loaders/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/loaders/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/loaders/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/loaders/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/loaders/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/loaders/vue/src/routes/cached.$id.tsx
  • benchmarks/client-nav/scenarios/loaders/vue/src/routes/deps.tsx
  • benchmarks/client-nav/scenarios/loaders/vue/src/routes/fresh.$id.tsx
  • benchmarks/client-nav/scenarios/loaders/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/loaders/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/loaders/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/mount/react/project.json
  • benchmarks/client-nav/scenarios/mount/react/setup.ts
  • benchmarks/client-nav/scenarios/mount/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/mount/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/mount/react/src/main.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/mount/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/about.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/blog.$slug.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/blog.index.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/blog.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/search.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/settings.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/shop.$productId.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/shop.index.tsx
  • benchmarks/client-nav/scenarios/mount/react/src/routes/shop.tsx
  • benchmarks/client-nav/scenarios/mount/react/tsconfig.json
  • benchmarks/client-nav/scenarios/mount/react/vite.config.ts
  • benchmarks/client-nav/scenarios/mount/shared.ts
  • benchmarks/client-nav/scenarios/mount/solid/project.json
  • benchmarks/client-nav/scenarios/mount/solid/setup.ts
  • benchmarks/client-nav/scenarios/mount/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/mount/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/mount/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/about.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/blog.$slug.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/blog.index.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/blog.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/search.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/settings.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/shop.$productId.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/shop.index.tsx
  • benchmarks/client-nav/scenarios/mount/solid/src/routes/shop.tsx
  • benchmarks/client-nav/scenarios/mount/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/mount/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/mount/vue/project.json
  • benchmarks/client-nav/scenarios/mount/vue/setup.ts
  • benchmarks/client-nav/scenarios/mount/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/mount/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/mount/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/about.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/blog.$slug.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/blog.index.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/blog.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/search.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/settings.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/shop.$productId.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/shop.index.tsx
  • benchmarks/client-nav/scenarios/mount/vue/src/routes/shop.tsx
  • benchmarks/client-nav/scenarios/mount/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/mount/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/nested-params/react/project.json
  • benchmarks/client-nav/scenarios/nested-params/react/setup.ts
  • benchmarks/client-nav/scenarios/nested-params/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/nested-params/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/nested-params/react/src/main.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.$c.$d.$e.$f.$g.$h.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.$c.$d.$e.$f.$g.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.$c.$d.$e.$f.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.$c.$d.$e.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.$c.$d.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.$c.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.$b.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/src/routes/l.$a.tsx
  • benchmarks/client-nav/scenarios/nested-params/react/tsconfig.json
  • benchmarks/client-nav/scenarios/nested-params/react/vite.config.ts
  • benchmarks/client-nav/scenarios/nested-params/shared.ts
  • benchmarks/client-nav/scenarios/nested-params/solid/project.json
  • benchmarks/client-nav/scenarios/nested-params/solid/setup.ts
  • benchmarks/client-nav/scenarios/nested-params/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/nested-params/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/nested-params/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.$c.$d.$e.$f.$g.$h.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.$c.$d.$e.$f.$g.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.$c.$d.$e.$f.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.$c.$d.$e.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.$c.$d.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.$c.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.$b.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/src/routes/l.$a.tsx
  • benchmarks/client-nav/scenarios/nested-params/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/nested-params/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/nested-params/vue/project.json
  • benchmarks/client-nav/scenarios/nested-params/vue/setup.ts
  • benchmarks/client-nav/scenarios/nested-params/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/nested-params/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/nested-params/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.$c.$d.$e.$f.$g.$h.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.$c.$d.$e.$f.$g.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.$c.$d.$e.$f.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.$c.$d.$e.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.$c.$d.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.$c.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.$b.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/src/routes/l.$a.tsx
  • benchmarks/client-nav/scenarios/nested-params/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/nested-params/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/preload/react/project.json
  • benchmarks/client-nav/scenarios/preload/react/setup.ts
  • benchmarks/client-nav/scenarios/preload/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/preload/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/preload/react/src/main.tsx
  • benchmarks/client-nav/scenarios/preload/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/preload/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/preload/react/src/routes/docs.tsx
  • benchmarks/client-nav/scenarios/preload/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/preload/react/src/routes/sections.$section.tsx
  • benchmarks/client-nav/scenarios/preload/react/tsconfig.json
  • benchmarks/client-nav/scenarios/preload/react/vite.config.ts
  • benchmarks/client-nav/scenarios/preload/shared.ts
  • benchmarks/client-nav/scenarios/preload/solid/project.json
  • benchmarks/client-nav/scenarios/preload/solid/setup.ts
  • benchmarks/client-nav/scenarios/preload/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/preload/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/preload/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/preload/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/preload/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/preload/solid/src/routes/docs.tsx
  • benchmarks/client-nav/scenarios/preload/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/preload/solid/src/routes/sections.$section.tsx
  • benchmarks/client-nav/scenarios/preload/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/preload/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/preload/vue/project.json
  • benchmarks/client-nav/scenarios/preload/vue/setup.ts
  • benchmarks/client-nav/scenarios/preload/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/preload/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/preload/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/preload/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/preload/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/preload/vue/src/routes/docs.tsx
  • benchmarks/client-nav/scenarios/preload/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/preload/vue/src/routes/sections.$section.tsx
  • benchmarks/client-nav/scenarios/preload/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/preload/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/rewrites/react/project.json
  • benchmarks/client-nav/scenarios/rewrites/react/setup.ts
  • benchmarks/client-nav/scenarios/rewrites/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/rewrites/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/rewrites/react/src/main.tsx
  • benchmarks/client-nav/scenarios/rewrites/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/rewrites/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/rewrites/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/rewrites/react/src/routes/p.$a.$b.tsx
  • benchmarks/client-nav/scenarios/rewrites/react/src/routes/p.$a.tsx
  • benchmarks/client-nav/scenarios/rewrites/react/tsconfig.json
  • benchmarks/client-nav/scenarios/rewrites/react/vite.config.ts
  • benchmarks/client-nav/scenarios/rewrites/shared.ts
  • benchmarks/client-nav/scenarios/rewrites/solid/project.json
  • benchmarks/client-nav/scenarios/rewrites/solid/setup.ts
  • benchmarks/client-nav/scenarios/rewrites/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/rewrites/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/rewrites/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/rewrites/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/rewrites/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/rewrites/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/rewrites/solid/src/routes/p.$a.$b.tsx
  • benchmarks/client-nav/scenarios/rewrites/solid/src/routes/p.$a.tsx
  • benchmarks/client-nav/scenarios/rewrites/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/rewrites/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/rewrites/vue/project.json
  • benchmarks/client-nav/scenarios/rewrites/vue/setup.ts
  • benchmarks/client-nav/scenarios/rewrites/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/rewrites/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/rewrites/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/rewrites/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/rewrites/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/rewrites/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/rewrites/vue/src/routes/p.$a.$b.tsx
  • benchmarks/client-nav/scenarios/rewrites/vue/src/routes/p.$a.tsx
  • benchmarks/client-nav/scenarios/rewrites/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/rewrites/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/react/project.json
  • benchmarks/client-nav/scenarios/route-tree-scale/react/setup.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/main.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/(marketing)/pricing.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/(marketing)/promo.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/_layout.alpha.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/_layout.beta.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/_layout.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/files.$.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/release.v{$version}.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-a.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-a.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-a.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-a.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-a.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-b.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-b.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-b.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-b.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-b.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-c.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-c.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-c.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-c.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-c.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-d.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-d.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-d.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-d.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-d.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-e.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-e.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-e.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-e.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-e.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-f.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-f.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-f.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-f.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/src/routes/sec-f.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/react/tsconfig.json
  • benchmarks/client-nav/scenarios/route-tree-scale/react/vite.config.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/shared.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/project.json
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/setup.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/(marketing)/pricing.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/(marketing)/promo.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/_layout.alpha.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/_layout.beta.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/_layout.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/files.$.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/release.v{$version}.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-a.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-a.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-a.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-a.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-a.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-b.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-b.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-b.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-b.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-b.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-c.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-c.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-c.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-c.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-c.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-d.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-d.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-d.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-d.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-d.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-e.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-e.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-e.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-e.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-e.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-f.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-f.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-f.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-f.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/src/routes/sec-f.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/project.json
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/setup.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/(marketing)/pricing.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/(marketing)/promo.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/_layout.alpha.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/_layout.beta.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/_layout.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/files.$.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/release.v{$version}.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-a.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-a.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-a.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-a.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-a.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-b.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-b.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-b.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-b.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-b.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-c.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-c.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-c.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-c.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-c.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-d.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-d.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-d.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-d.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-d.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-e.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-e.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-e.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-e.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-e.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-f.$id.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-f.about.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-f.index.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-f.settings.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/src/routes/sec-f.tsx
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/vite.config.ts
  • benchmarks/client-nav/scenarios/search-params/react/project.json
  • benchmarks/client-nav/scenarios/search-params/react/setup.ts
  • benchmarks/client-nav/scenarios/search-params/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/search-params/react/speed.flame.ts
  • benchmarks/client-nav/scenarios/search-params/react/src/main.tsx
  • benchmarks/client-nav/scenarios/search-params/react/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/search-params/react/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/search-params/react/src/routes/catalog.tsx
  • benchmarks/client-nav/scenarios/search-params/react/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/search-params/react/src/routes/products.tsx
  • benchmarks/client-nav/scenarios/search-params/react/tsconfig.json
  • benchmarks/client-nav/scenarios/search-params/react/vite.config.ts
  • benchmarks/client-nav/scenarios/search-params/shared.ts
  • benchmarks/client-nav/scenarios/search-params/solid/project.json
  • benchmarks/client-nav/scenarios/search-params/solid/setup.ts
  • benchmarks/client-nav/scenarios/search-params/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/search-params/solid/speed.flame.ts
  • benchmarks/client-nav/scenarios/search-params/solid/src/main.tsx
  • benchmarks/client-nav/scenarios/search-params/solid/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/search-params/solid/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/search-params/solid/src/routes/catalog.tsx
  • benchmarks/client-nav/scenarios/search-params/solid/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/search-params/solid/src/routes/products.tsx
  • benchmarks/client-nav/scenarios/search-params/solid/tsconfig.json
  • benchmarks/client-nav/scenarios/search-params/solid/vite.config.ts
  • benchmarks/client-nav/scenarios/search-params/vue/project.json
  • benchmarks/client-nav/scenarios/search-params/vue/setup.ts
  • benchmarks/client-nav/scenarios/search-params/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/search-params/vue/speed.flame.ts
  • benchmarks/client-nav/scenarios/search-params/vue/src/main.tsx
  • benchmarks/client-nav/scenarios/search-params/vue/src/routeTree.gen.ts
  • benchmarks/client-nav/scenarios/search-params/vue/src/routes/__root.tsx
  • benchmarks/client-nav/scenarios/search-params/vue/src/routes/catalog.tsx
  • benchmarks/client-nav/scenarios/search-params/vue/src/routes/index.tsx
  • benchmarks/client-nav/scenarios/search-params/vue/src/routes/products.tsx
  • benchmarks/client-nav/scenarios/search-params/vue/tsconfig.json
  • benchmarks/client-nav/scenarios/search-params/vue/vite.config.ts
  • benchmarks/client-nav/solid/vite.config.ts
  • benchmarks/client-nav/vitest.config.ts
  • benchmarks/client-nav/vitest.react.config.ts
  • benchmarks/client-nav/vitest.solid.config.ts
  • benchmarks/client-nav/vitest.vue.config.ts
  • benchmarks/client-nav/vue/vite.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch flo/client-nav-cpu-scenarios

Comment @coderabbitai help to get the list of available commands.

@nx-cloud

nx-cloudBot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit f373691

CommandStatusDurationResult
nx affected --targets=test:eslint,test:unit,tes...❌ Failed6m 34sView ↗
nx run-many --target=build --exclude=examples/*...✅ Succeeded24sView ↗

☁️ Nx Cloud last updated this comment at 2026-07-02 22:47:31 UTC

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Changeset Version Preview

No changeset entries found. Merging this PR will not cause a version bump for any packages.

@github-actions

github-actionsBot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Bundle Size Benchmarks

  • Commit: cb5257ac4316
  • Measured at: 2026-07-02T22:41:56.398Z
  • Baseline source: history:a6337fb98e62
  • Dashboard: bundle-size history
ScenarioCurrent (gzip)Delta vs baselineInitial gzipRawBrotliTrend
react-router.minimal87.37 KiB0 B (0.00%)87.24 KiB273.88 KiB75.99 KiB▁▁▁▁▄▄▄▄███
react-router.full91.10 KiB0 B (0.00%)90.96 KiB285.78 KiB79.15 KiB▁▁▁▁▅▅▅▅███
solid-router.minimal35.56 KiB0 B (0.00%)35.44 KiB106.08 KiB32.05 KiB▁▁▁▁▅▅▅▅███
solid-router.full40.61 KiB0 B (0.00%)40.49 KiB121.30 KiB36.54 KiB▁▁▁▁▆▆▆▆███
vue-router.minimal53.07 KiB0 B (0.00%)52.94 KiB150.12 KiB47.70 KiB▁▁▁▁▄▄▄▄███
vue-router.full59.03 KiB0 B (0.00%)58.90 KiB168.88 KiB52.93 KiB▁▁▁▁▄▄▄▄███
react-start.minimal102.03 KiB0 B (0.00%)101.89 KiB322.31 KiB88.32 KiB▁▁▁▁▃▃▃▆███
react-start.deferred-hydration102.76 KiB0 B (0.00%)101.91 KiB323.69 KiB88.91 KiB▁▁▁▁▄▄▄▆███
react-start.full105.45 KiB0 B (0.00%)105.31 KiB332.24 KiB91.23 KiB▁▁▁▁▃▃▃▅███
react-start.rsbuild.minimal99.74 KiB0 B (0.00%)99.57 KiB316.74 KiB85.81 KiB▁▁▁▁▃▂▂▅███
react-start.rsbuild.minimal-iife100.14 KiB0 B (0.00%)99.98 KiB317.67 KiB86.21 KiB▁▁▁▁▃▂▂▅███
react-start.rsbuild.full102.96 KiB0 B (0.00%)102.79 KiB326.79 KiB88.60 KiB▁▁▁▁▃▃▃▅███
solid-start.minimal49.71 KiB0 B (0.00%)49.58 KiB152.25 KiB43.88 KiB▁▁▁▁▃▃▃▆███
solid-start.deferred-hydration52.97 KiB0 B (0.00%)49.64 KiB160.29 KiB46.85 KiB▁▁▁▁▃▃▃▅███
solid-start.full55.51 KiB0 B (0.00%)55.38 KiB169.30 KiB48.97 KiB▁▁▁▁▄▄▄▆███
vue-start.minimal71.13 KiB0 B (0.00%)71.00 KiB207.37 KiB63.03 KiB▁▁▁▁▄▄▄▇███
vue-start.full75.13 KiB0 B (0.00%)75.00 KiB220.01 KiB66.37 KiB▁▁▁▁▄▄▄▆███

Current gzip tracks all emitted client JS chunks. Initial gzip tracks only the entry/import graph. Trend sparkline is historical current gzip ending with this PR measurement; lower is better.

@pkg-pr-new

pkg-pr-newBot commented Jul 2, 2026

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/@tanstack/arktype-adapter@7732

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/@tanstack/eslint-plugin-router@7732

@tanstack/eslint-plugin-start

npm i https://pkg.pr.new/@tanstack/eslint-plugin-start@7732

@tanstack/history

npm i https://pkg.pr.new/@tanstack/history@7732

@tanstack/nitro-v2-vite-plugin

npm i https://pkg.pr.new/@tanstack/nitro-v2-vite-plugin@7732

@tanstack/react-router

npm i https://pkg.pr.new/@tanstack/react-router@7732

@tanstack/react-router-devtools

npm i https://pkg.pr.new/@tanstack/react-router-devtools@7732

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/@tanstack/react-router-ssr-query@7732

@tanstack/react-start

npm i https://pkg.pr.new/@tanstack/react-start@7732

@tanstack/react-start-client

npm i https://pkg.pr.new/@tanstack/react-start-client@7732

@tanstack/react-start-rsc

npm i https://pkg.pr.new/@tanstack/react-start-rsc@7732

@tanstack/react-start-server

npm i https://pkg.pr.new/@tanstack/react-start-server@7732

@tanstack/router-cli

npm i https://pkg.pr.new/@tanstack/router-cli@7732

@tanstack/router-core

npm i https://pkg.pr.new/@tanstack/router-core@7732

@tanstack/router-devtools

npm i https://pkg.pr.new/@tanstack/router-devtools@7732

@tanstack/router-devtools-core

npm i https://pkg.pr.new/@tanstack/router-devtools-core@7732

@tanstack/router-generator

npm i https://pkg.pr.new/@tanstack/router-generator@7732

@tanstack/router-plugin

npm i https://pkg.pr.new/@tanstack/router-plugin@7732

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/@tanstack/router-ssr-query-core@7732

@tanstack/router-utils

npm i https://pkg.pr.new/@tanstack/router-utils@7732

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/@tanstack/router-vite-plugin@7732

@tanstack/solid-router

npm i https://pkg.pr.new/@tanstack/solid-router@7732

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/@tanstack/solid-router-devtools@7732

@tanstack/solid-router-ssr-query

npm i https://pkg.pr.new/@tanstack/solid-router-ssr-query@7732

@tanstack/solid-start

npm i https://pkg.pr.new/@tanstack/solid-start@7732

@tanstack/solid-start-client

npm i https://pkg.pr.new/@tanstack/solid-start-client@7732

@tanstack/solid-start-server

npm i https://pkg.pr.new/@tanstack/solid-start-server@7732

@tanstack/start-client-core

npm i https://pkg.pr.new/@tanstack/start-client-core@7732

@tanstack/start-fn-stubs

npm i https://pkg.pr.new/@tanstack/start-fn-stubs@7732

@tanstack/start-plugin-core

npm i https://pkg.pr.new/@tanstack/start-plugin-core@7732

@tanstack/start-server-core

npm i https://pkg.pr.new/@tanstack/start-server-core@7732

@tanstack/start-static-server-functions

npm i https://pkg.pr.new/@tanstack/start-static-server-functions@7732

@tanstack/start-storage-context

npm i https://pkg.pr.new/@tanstack/start-storage-context@7732

@tanstack/valibot-adapter

npm i https://pkg.pr.new/@tanstack/valibot-adapter@7732

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/@tanstack/virtual-file-routes@7732

@tanstack/vue-router

npm i https://pkg.pr.new/@tanstack/vue-router@7732

@tanstack/vue-router-devtools

npm i https://pkg.pr.new/@tanstack/vue-router-devtools@7732

@tanstack/vue-router-ssr-query

npm i https://pkg.pr.new/@tanstack/vue-router-ssr-query@7732

@tanstack/vue-start

npm i https://pkg.pr.new/@tanstack/vue-start@7732

@tanstack/vue-start-client

npm i https://pkg.pr.new/@tanstack/vue-start-client@7732

@tanstack/vue-start-server

npm i https://pkg.pr.new/@tanstack/vue-start-server@7732

@tanstack/zod-adapter

npm i https://pkg.pr.new/@tanstack/zod-adapter@7732

commit: f373691

@codspeed-hq

codspeed-hqBot commented Jul 2, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 11.51%

⚡ 1 improved benchmark
❌ 2 regressed benchmarks
✅ 141 untouched benchmarks
🆕 36 new benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

ModeBenchmarkBASEHEADEfficiency
Memorymem aborted-requests (vue)875 KB1,055 KB-17.06%
Memorymem request-churn (solid)1.2 MB1.2 MB-5.05%
Memorymem serialization-payload (solid)6.2 MB3.5 MB+76.07%
🆕Simulationclient-async-pipeline navigation loop (solid)N/A84.7 msN/A
🆕Simulationclient-control-flow navigation loop (solid)N/A82.1 msN/A
🆕Simulationclient-head navigation loop (solid)N/A195.9 msN/A
🆕Simulationclient-history navigation loop (solid)N/A69.4 msN/A
🆕Simulationclient-links navigation loop (solid)N/A483.3 msN/A
🆕Simulationclient-loaders navigation loop (solid)N/A95.5 msN/A
🆕Simulationclient-mount loop (solid)N/A58.5 msN/A
🆕Simulationclient-nested-params navigation loop (solid)N/A255.7 msN/A
🆕Simulationclient-preload interaction loop (solid)N/A80.6 msN/A
🆕Simulationclient-route-tree-scale navigation loop (solid)N/A170 msN/A
🆕Simulationclient-search-params navigation loop (solid)N/A151.2 msN/A
🆕Simulationclient-rewrites navigation loop (solid)N/A109.9 msN/A
🆕Simulationclient-async-pipeline navigation loop (vue)N/A45.9 msN/A
🆕Simulationclient-control-flow navigation loop (vue)N/A50.3 msN/A
🆕Simulationclient-head navigation loop (vue)N/A97.4 msN/A
🆕Simulationclient-history navigation loop (vue)N/A47.8 msN/A
🆕Simulationclient-links navigation loop (vue)N/A172.7 msN/A
..................

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing flo/client-nav-cpu-scenarios (f373691) with main (a6337fb)

Open in CodSpeed

nx-cloud[bot]

This comment was marked as outdated.

All benches in @benchmarks/client-nav now start with "client" so they are
easy to identify on the CodSpeed dashboard (the baseline already did).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nx-cloud[bot]

This comment was marked as outdated.

…lity
Fixes from an adversarial review of the scenario suite:
- mount: create the browser history explicitly and destroy() it on unmount.
The default per-router createBrowserHistory() monkey-patches
window.history.pushState/replaceState, chaining one wrapper per router —
per-mount cost degraded 1.8ms -> 6ms over 3000 mounts (O(N^2) drift in
the cold-start bench). Verified flat (~1.86ms) after the fix.
- links: replace the five <MatchRoute> components with setup-scoped
useMatchRoute probes in all three apps. vue-router's MatchRoute calls
useMatchRoute() inside its render function, leaking one undisposed
watcher per render — the Vue bench accumulated ~5 dead subscribers per
navigation. Verified flat per-tick cost over 2000 ticks after the fix.
- all scenarios: bound the scroll-restoration cache with
getScrollRestorationKey: (location) => location.pathname. The default
key is a fresh random per-entry location key, so the module-level cache
grew one entry per push navigation for the whole run.
- harness hover step: dispatch a single mouseover instead of
mouseover+mouseenter. Solid/Vue attach intent-preload handlers to BOTH
events, so the old double dispatch ran the preload pipeline twice for
them but once for React. Verified all three adapters preload exactly
once per hover via cached-matches probes.
- README: correct the loaders row (the invalidate step means cached routes
re-run once per lap), the links row, and document the session-history
growth characteristics.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nx-cloud[bot]

This comment was marked as outdated.

…arams
Closes the three coverage gaps identified in the scenario-suite analysis:
- new `rewrites` scenario (react/solid/vue): router basepath '/app' composed
with a locale input/output rewrite pair — the client analog of the SSR
rewrites scenario. Every href build runs the output rewrite and every
committed location runs the input rewrite; assertions check both the
internal router pathname and the external window pathname. The harness
gained an `initialUrl` option since a basepath app cannot start at '/'.
- route-tree-scale now builds with `autoCodeSplitting: true`, so its
navigations also exercise lazy route-chunk resolution — the default shape
of real file-based apps, previously uncovered.
- nested-params and route-tree-scale param sets now include characters that
need percent-encoding (spaces, `&`, `%`, `+`, unicode) so the segment
encode/decode paths run on every navigation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nx-cloud[bot]

This comment was marked as outdated.

nx-cloud[bot]

This comment was marked as outdated.

…t bench
CodSpeed excludes syscall time from simulation measures, and past a
threshold it warns ("cannot be consistently instrumented") and skips the
benchmark; the exclusion is also inconsistent run-to-run, which was the
root cause of the two same-code CI swings (route-tree-scale react 13%,
async-pipeline react 3.6%) and of skipped runs on hop-heavy benches like
async-pipeline solid (579 calls / 12.1ms).
- Replace all counted setTimeout(0) hops with setImmediate hops (harness
timerHop + async-pipeline hopDelay). Both are deterministic event-loop
turns that yield to timers and the React Node scheduler, but a timer
costs ~3-4 syscalls (timerfd + epoll) per hop vs ~1 for an immediate.
Same-machine instrumented before/after: preload solid 39.8ms -> 1.2ms of
syscall time, preload vue 30.1 -> 1.1, async-pipeline solid 23.5 -> 1.1,
async-pipeline vue 17.9 -> 0.9. head/route-tree-scale are unchanged
(their residual syscalls are GC/scheduler, and their measures were
already stable); history's syscalls come from jsdom's internal
timer-queued traversal and are not reachable from bench code (its
measured values are stable regardless).
- mount: 6 ticks per iteration instead of 2. A single mount simulates to
only ~8ms and very short measures amplify allocator/GC quantization;
the bench now measures ~50ms+ of simulated CPU.
All 39 benches pass; full nx typecheck green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nx-cloud[bot]

This comment was marked as outdated.

…imers
The history benches were skip-warned by CodSpeed for excessive syscall
time (5-26ms, highly variable across runs). Root cause: jsdom delivers
history traversals through two nested window.setTimeout(0) tasks, and Node
clamps zero timers to 1ms of wall time — so while awaiting onRendered
after back/forward/go, the event loop blocked in epoll_wait until each
timer expired. That blocked wall-time is recorded as syscall time, and its
duration depends on host timer behavior, hence the variability.
The harness now reroutes zero-delay window.setTimeout calls onto
setImmediate for the duration of a benchmark (non-zero delays pass
through; clearTimeout handles both). Zero-delay timeouts carry no ordering
semantics a check-phase immediate doesn't satisfy, and the suite's
conventions already forbid real-delay timers in measured code.
Instrumented A/A verification (2 runs per framework): history syscall time
react 23-26ms -> 2.5ms, solid 14-23ms -> 1.1ms, vue 11-12ms -> 1.2ms, with
bit-identical syscall counts across runs and measured values stable to
0.06%. The benches also stopped measuring sleep: locally an iteration
dropped from ~42-49ms to ~5-11ms of actual CPU work. All 39 benches pass.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@nx-cloudnx-cloudBot left a comment

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.

Nx Cloud has identified a possible root cause for your failed CI:

We identified the tanstack-start-example-rscs:build failure as a pre-existing environment issue: nitro-nightly attempts to import ./runtime/meta from nitro, but that subpath is not exported in nitro's package.json, indicating a version incompatibility unrelated to this PR's benchmark changes. Our cross-branch analysis confirmed the identical error exists in branch 7735, proving it predates this PR.

No code changes were suggested for this issue.

Trigger a rerun:

Rerun CI

Nx Cloud View detailed reasoning on Nx Cloud ↗


🎓 Learn more about Self-Healing CI on nx.dev

@Sheraff
Sheraff merged commit 208100b into mainJul 3, 2026
24 of 26 checks passed
@Sheraff
Sheraff deleted the flo/client-nav-cpu-scenarios branch July 3, 2026 06:18
Sign up for freeto 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.

1 participant

@Sheraff