โ All frameworks Dev Time Performance
| Prod Deps | Dev Deps | Dup. Deps | node_modules | node_modules (prod) | Dep Install Size | Graph |
| 0 | 7 | 1 | 61.81MB | 0.02MB | 65.36MB | View |
| Metric | Avg | Min | Max |
| Install | 1.22s | 1.18s | 1.28s |
| Cold Build | 2.36s | 2.24s | 2.72s |
| Warm Build | 2.28s | 2.22s | 2.36s |
Build output size: 1.29MB
Duplicate Dependencies
1 duplicate dependency
detected across this starter's node_modules.
View 1 duplicate dependency
Runtime Performance
SSR Performance
| Framework | Ops/sec | Median Latency | Body Size | Duplication |
| Baseline HTML | 856 | 1.198ms | 96.81kb | 1x |
| SvelteKit | 440 | 2.217ms | 183.55kb | 2x |
Methodology
- Each framework renders a table of 1000 rows with two UUID columns
-
Mock HTTP requests bypass TCP overhead for accurate rendering measurement
- Data is loaded asynchronously to simulate real-world data fetching
-
Duplication factor indicates how many times each UUID appears in the
response (1x = optimal, 2x = includes hydration payload)
-
Benchmarks run for 10 seconds using tinybench
-
Astro, Nuxt, and SvelteKit handle Node.js HTTP requests natively. React
Router, SolidStart, and TanStack Start use Web APIs internally, so
benchmarks include the cost of their Node.js adapter layers (
@react-router/node, h3, and srvx respectively)
-
Next.js defaults to React Server Components (RSC), a different rendering
model than traditional SSR. To keep the comparison fair, Next.js uses
"use client" to opt out of RSC and use traditional SSR + hydration like most of the other
frameworks
-
Inspired by eknkc/ssr-benchmark
SPA Performance
| Framework | First Paint | FCP | INP |
| SvelteKit | 108.4ms | 108.41ms | 16.73ms |
Methodology
- Each framework renders a table of 1000 rows with two UUID columns
-
Measured using Lighthouse flow with Chromium via Puppeteer for accurate
browser metrics
-
First Paint and First Contentful Paint are measured on initial navigation
-
Interaction to Next Paint is measured by clicking the first row's detail
link
- Benchmarks run 5 times and results are averaged
-
Next.js, TanStack Start, and React Router default to SSR with no per-route
opt-out. Next.js wraps the SPA table in a
dynamic import with ssr: false to prevent build-time prerendering. TanStack Start uses its built-in spa mode.
React Router disables SSR entirely via ssr: false in its config.
All other frameworks (Nuxt, SvelteKit, SolidStart, Astro) disable SSR per-route
without a separate build.
MPA Performance
| Framework | First Paint | FCP | INP |
| SvelteKit | 72.6ms | 72.66ms | 0.48ms |
Methodology
- Each framework renders a table of 1000 rows with two UUID columns
-
Measured using Lighthouse flow with Chromium via Puppeteer for accurate
browser metrics
-
First Paint and First Contentful Paint are measured on initial navigation
-
Interaction to Next Paint is measured by clicking the first row's detail
link
- Benchmarks run 5 times and results are averaged
-
Next.js, TanStack Start, and React Router default to SSR with no per-route
opt-out. Next.js wraps the SPA table in a
dynamic import with ssr: false to prevent build-time prerendering. TanStack Start uses its built-in spa mode.
React Router disables SSR entirely via ssr: false in its config.
All other frameworks (Nuxt, SvelteKit, SolidStart, Astro) disable SSR per-route
without a separate build.