All Frameworks
Dependency Counts
Section titled “Dependency Counts”Methodology: Dependency Counts.
For dependency counts we start by looking at the dependencies for the meta-framework package directly, for example how many prod, dev and overall deps does `Nuxt` have. Then we look at dependencies again for the starter projects. While we think looking at projects dependencies is more realistic like the `starter-*` projects as meta-frameworks rarely just run with meta-framework package it is also important to look at direct dependencies. This is the only tests in Dev Time Stats where we do this every other Dev Time Test is based on the Start ProjectsMeta-framework Direct Package Counts
Section titled “Meta-framework Direct Package Counts”| Framework | Deps | Dev | Prod | Graph |
|---|---|---|---|---|
| Astro | 80 | 27 | 53 | View |
| Mastro | 1 | 0 | 1 | View |
| Next.js | 229 | 223 | 6 | View |
| Nuxt | 68 | 11 | 57 | View |
| React Router | 50 | 22 | 28 | View |
| SolidStart | 18 | 3 | 15 | View |
| SvelteKit | 25 | 13 | 12 | View |
| TanStack Start | 8 | 0 | 8 | View |
Metaframework Dependencies
| Framework | Dependency count |
|---|---|
| Mastro | 1 |
| TanStack Start | 8 |
| SolidStart | 18 |
| SvelteKit | 25 |
| React Router | 50 |
| Nuxt | 68 |
| Astro | 80 |
| Next.js | 229 |
The chart includes a dotted median reference line calculated from the visible framework values.
Metaframework Development Dependencies
| Framework | Dependency count |
|---|---|
| Mastro | 0 |
| TanStack Start | 0 |
| SolidStart | 3 |
| Nuxt | 11 |
| SvelteKit | 13 |
| React Router | 22 |
| Astro | 27 |
| Next.js | 223 |
The chart includes a dotted median reference line calculated from the visible framework values.
Metaframework Production Dependencies
| Framework | Dependency count |
|---|---|
| Mastro | 1 |
| Next.js | 6 |
| TanStack Start | 8 |
| SvelteKit | 12 |
| SolidStart | 15 |
| React Router | 28 |
| Astro | 53 |
| Nuxt | 57 |
The chart includes a dotted median reference line calculated from the visible framework values.
Starter Projects
Section titled “Starter Projects”| Framework | Deps Dev / Prod | All Deps | Dup. Deps | node_modules | node_modules (prod) | Dep Install Size | Graph |
|---|---|---|---|---|---|---|---|
| Astro | 2 / 1 | 390 | 11 | 207.85MB | 144.67MB | 186.51MB | View |
| Mastro | 2 / 2 | 6 | 0 | 29.16MB | 3.36MB | 27.39MB | View |
| Next.js | 6 / 3 | 421 | 12 | 560.04MB | 436.00MB | 506.22MB | View |
| Nuxt | 2 / 3 | 694 | 63 | 208.81MB | 208.79MB | 172.24MB | View |
| React Router | 8 / 6 | 268 | 9 | 106.86MB | 17.27MB | 102.22MB | View |
| SolidStart | 0 / 5 | 582 | 77 | 156.30MB | 156.24MB | 133.30MB | View |
| SvelteKit | 7 / 0 | 119 | 1 | 60.05MB | 0.02MB | 63.60MB | View |
| TanStack Start | 11 / 13 | 424 | 14 | 234.77MB | 201.87MB | 198.52MB | View |
Starter Project Dev Dependencies
| Framework | Dependency count |
|---|---|
| SolidStart | 0 |
| Astro | 2 |
| Mastro | 2 |
| Nuxt | 2 |
| Next.js | 6 |
| SvelteKit | 7 |
| React Router | 8 |
| TanStack Start | 11 |
The chart includes a dotted median reference line calculated from the visible framework values.
Starter Project Production Dependencies
| Framework | Dependency count |
|---|---|
| SvelteKit | 0 |
| Astro | 1 |
| Mastro | 2 |
| Next.js | 3 |
| Nuxt | 3 |
| SolidStart | 5 |
| React Router | 6 |
| TanStack Start | 13 |
The chart includes a dotted median reference line calculated from the visible framework values.
Starter Project Duplicate Dependencies
| Framework | Dependency count |
|---|---|
| Mastro | 0 |
| SvelteKit | 1 |
| React Router | 9 |
| Astro | 11 |
| Next.js | 12 |
| TanStack Start | 14 |
| Nuxt | 63 |
| SolidStart | 77 |
The chart includes a dotted median reference line calculated from the visible framework values.
Node Modules Size
Section titled “Node Modules Size”Methodology: Node Modules Size.
Node modules size
| Framework | Megabytes |
|---|---|
| Mastro | 29.16 MB |
| SvelteKit | 60.05 MB |
| React Router | 106.86 MB |
| SolidStart | 156.30 MB |
| Astro | 207.85 MB |
| Nuxt | 208.81 MB |
| TanStack Start | 234.77 MB |
| Next.js | 560.04 MB |
The chart includes a dotted median reference line calculated from the visible framework values.
Node modules size (prod only)
| Framework | Megabytes |
|---|---|
| SvelteKit | 0.02 MB |
| Mastro | 3.36 MB |
| React Router | 17.27 MB |
| Astro | 144.67 MB |
| SolidStart | 156.24 MB |
| TanStack Start | 201.87 MB |
| Nuxt | 208.79 MB |
| Next.js | 436.00 MB |
The chart includes a dotted median reference line calculated from the visible framework values.
Build and Install Times
Section titled “Build and Install Times”Methodology: Build and Install Times.
| Framework | Avg Install | Min Install | Max Install | Avg Cold Build | Avg Warm Build | Build Output |
|---|---|---|---|---|---|---|
| Astro | 1.51s | 1.45s | 1.58s | 0.97s | 0.89s | 0.03MB |
| Mastro | 0.53s | 0.50s | 0.60s | 0.38s | 0.38s | 0.01MB |
| Next.js | 2.82s | 2.76s | 2.88s | 5.38s | 5.24s | 6.05MB |
| Nuxt | 2.92s | 2.76s | 3.20s | 3.87s | 3.84s | 2.46MB |
| React Router | 1.13s | 1.10s | 1.15s | 1.81s | 1.67s | 0.38MB |
| SolidStart | 1.77s | 1.67s | 1.83s | 5.39s | 5.30s | 0.84MB |
| SvelteKit | 1.22s | 1.19s | 1.25s | 2.44s | 2.33s | 1.36MB |
| TanStack Start | 1.85s | 1.80s | 1.95s | 5.22s | 5.09s | 2.05MB |
Avg install time
| Framework | Seconds |
|---|---|
| Mastro | 0.53s |
| React Router | 1.13s |
| SvelteKit | 1.22s |
| Astro | 1.51s |
| SolidStart | 1.77s |
| TanStack Start | 1.85s |
| Next.js | 2.82s |
| Nuxt | 2.92s |
The chart includes a dotted median reference line calculated from the visible framework values.
Cold build time
| Framework | Seconds |
|---|---|
| Mastro | 0.38s |
| Astro | 0.97s |
| React Router | 1.81s |
| SvelteKit | 2.44s |
| Nuxt | 3.87s |
| TanStack Start | 5.22s |
| Next.js | 5.38s |
| SolidStart | 5.39s |
The chart includes a dotted median reference line calculated from the visible framework values.
Warm build time
| Framework | Seconds |
|---|---|
| Mastro | 0.38s |
| Astro | 0.89s |
| React Router | 1.67s |
| SvelteKit | 2.33s |
| Nuxt | 3.84s |
| TanStack Start | 5.09s |
| Next.js | 5.24s |
| SolidStart | 5.30s |
The chart includes a dotted median reference line calculated from the visible framework values.
Build output size
| Framework | Megabytes |
|---|---|
| Mastro | 0.01 MB |
| Astro | 0.03 MB |
| React Router | 0.38 MB |
| SolidStart | 0.84 MB |
| SvelteKit | 1.36 MB |
| TanStack Start | 2.05 MB |
| Nuxt | 2.46 MB |
| Next.js | 6.05 MB |
The chart includes a dotted median reference line calculated from the visible framework values.
Core-JS Polyfills
Section titled “Core-JS Polyfills”Methodology: Core-JS Polyfills.
| Framework | ~Size | Unnecessary Modules |
|---|---|---|
| Astro | — | — |
| Mastro | — | — |
| Next.js | 110.0 KB | 302 |
| Nuxt | — | — |
| React Router | — | — |
| SolidStart | — | — |
| SvelteKit | — | — |
| TanStack Start | — | — |
Browser Baseline
Section titled “Browser Baseline”Methodology: Browser Baseline.
| Framework | Baseline | Feature | Year | Features |
|---|---|---|---|---|
| Astro | — | — | — | 0 |
| Mastro | — | — | — | 0 |
| Next.js | High | — | 2022 | 46 |
| Nuxt | Limited | temporal | — | 40 |
| React Router | High | — | 2022 | 40 |
| SolidStart | High | — | 2020 | 29 |
| SvelteKit | High | — | 2020 | 40 |
| TanStack Start | High | — | 2022 | 45 |
Client Side Rendered Tests
Section titled “Client Side Rendered Tests”Methodology: Client Side Rendered Tests.
| Framework | First Paint | FCP | INP |
|---|---|---|---|
| Astro | 185.4ms | 185.23ms | 0ms |
| Next.js | 342.8ms | 342.94ms | 0ms |
| Nuxt | 225.8ms | 225.82ms | 0ms |
| React Router | 172.6ms | 172.41ms | 0ms |
| SolidStart | 195.2ms | 195.12ms | 0ms |
| SvelteKit | 168.6ms | 168.59ms | 0ms |
| TanStack Start | 229.2ms | 229.08ms | 0ms |
First Paint (ms)
| Framework | Milliseconds |
|---|---|
| SvelteKit | 168.60 ms |
| React Router | 172.60 ms |
| Astro | 185.40 ms |
| SolidStart | 195.20 ms |
| Nuxt | 225.80 ms |
| TanStack Start | 229.20 ms |
| Next.js | 342.80 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
First Contentful Paint (ms)
| Framework | Milliseconds |
|---|---|
| SvelteKit | 168.59 ms |
| React Router | 172.41 ms |
| Astro | 185.23 ms |
| SolidStart | 195.12 ms |
| Nuxt | 225.82 ms |
| TanStack Start | 229.08 ms |
| Next.js | 342.94 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Interaction to Next Paint (ms)
| Framework | Milliseconds |
|---|---|
| Astro | 0.00 ms |
| Next.js | 0.00 ms |
| Nuxt | 0.00 ms |
| React Router | 0.00 ms |
| SolidStart | 0.00 ms |
| SvelteKit | 0.00 ms |
| TanStack Start | 0.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Server Side Rendered Tests
Section titled “Server Side Rendered Tests”Methodology: Server Side Rendered Tests.
| Framework | First Paint | FCP | INP |
|---|---|---|---|
| Astro | 117ms | 116.99ms | 0ms |
| Mastro | 145.6ms | 145.62ms | 0ms |
| Next.js | 178ms | 178.12ms | 0ms |
| Nuxt | 162.2ms | 162.25ms | 0ms |
| React Router | 163ms | 162.98ms | 0ms |
| SolidStart | 145.6ms | 145.72ms | 0ms |
| SvelteKit | 139.8ms | 139.75ms | 0ms |
| TanStack Start | 177ms | 177.04ms | 0ms |
First Paint (ms)
| Framework | Milliseconds |
|---|---|
| Astro | 117.00 ms |
| SvelteKit | 139.80 ms |
| Mastro | 145.60 ms |
| SolidStart | 145.60 ms |
| Nuxt | 162.20 ms |
| React Router | 163.00 ms |
| TanStack Start | 177.00 ms |
| Next.js | 178.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
First Contentful Paint (ms)
| Framework | Milliseconds |
|---|---|
| Astro | 116.99 ms |
| SvelteKit | 139.75 ms |
| Mastro | 145.62 ms |
| SolidStart | 145.72 ms |
| Nuxt | 162.25 ms |
| React Router | 162.98 ms |
| TanStack Start | 177.04 ms |
| Next.js | 178.12 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Interaction to Next Paint (ms)
| Framework | Milliseconds |
|---|---|
| Astro | 0.00 ms |
| Mastro | 0.00 ms |
| Next.js | 0.00 ms |
| Nuxt | 0.00 ms |
| React Router | 0.00 ms |
| SolidStart | 0.00 ms |
| SvelteKit | 0.00 ms |
| TanStack Start | 0.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Server Side Throughput Tests
Section titled “Server Side Throughput Tests”Methodology: Server Side Throughput Tests.
| Framework | Ops/sec | Median Latency | Body Size | Duplication |
|---|---|---|---|---|
| Baseline HTML | 851 | 1.201ms | 96.83kb | 1x |
| Astro | 671 | 1.425ms | 96.89kb | 1x |
| Mastro | 343 | 2.882ms | 327.46kb | 1.5x |
| Next.js | 232 | 4.484ms | 199.52kb | 2x |
| Nuxt | 351 | 2.755ms | 201.27kb | 2x |
| React Router | 343 | 2.891ms | 211.63kb | 2x |
| SolidStart | 408 | 2.449ms | 230.24kb | 2x |
| SvelteKit | 460 | 2.106ms | 183.53kb | 2x |
| TanStack Start | 319 | 3.091ms | 193.62kb | 2x |
Ops/sec
| Framework | Operations per second |
|---|---|
| Baseline HTML | 851 |
| Astro | 671 |
| SvelteKit | 460 |
| SolidStart | 408 |
| Nuxt | 351 |
| Mastro | 343 |
| React Router | 343 |
| TanStack Start | 319 |
| Next.js | 232 |
The chart includes a dotted median reference line calculated from the visible framework values.
Body Size
| Framework | Kilobytes |
|---|---|
| Baseline HTML | 96.83 KB |
| Astro | 96.89 KB |
| SvelteKit | 183.53 KB |
| TanStack Start | 193.62 KB |
| Next.js | 199.52 KB |
| Nuxt | 201.27 KB |
| React Router | 211.63 KB |
| SolidStart | 230.24 KB |
| Mastro | 327.46 KB |
The chart includes a dotted median reference line calculated from the visible framework values.
Median Latency
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 1.20 ms |
| Astro | 1.43 ms |
| SvelteKit | 2.11 ms |
| SolidStart | 2.45 ms |
| Nuxt | 2.75 ms |
| Mastro | 2.88 ms |
| React Router | 2.89 ms |
| TanStack Start | 3.09 ms |
| Next.js | 4.48 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Server Side Load Test
Section titled “Server Side Load Test”Methodology: Server Side Load Test.
| Framework | Peak req/s | Peak Connections | P99 @ 25 | P99 @ 50 | P99 @ 100 | Total Req. |
|---|---|---|---|---|---|---|
| Baseline HTML | 1,594.4 | 100 | 21ms | 44ms | 109ms | 47,097 |
| Astro | 1,176 | 100 | 36ms | 67ms | 331ms | 35,445 |
| Mastro | 577.6 | 25 | 47ms | 169ms | 1447ms | 18,080 |
| Next.js | 37 | 5 | 2120ms | 4793ms | 4766ms | 1,041 |
| Nuxt | 67.6 | 5 | 2002ms | 4191ms | 4416ms | 2,142 |
| React Router | 163 | 25 | 356ms | 1942ms | 4002ms | 5,423 |
| SolidStart | 62 | 5 | 3317ms | 4176ms | 4097ms | 2,010 |
| SvelteKit | 473.8 | 25 | 88ms | 344ms | 2614ms | 15,278 |
| TanStack Start | 43.6 | 5 | 3847ms | 3890ms | 4335ms | 1,340 |
P99 Latency
Section titled “P99 Latency”P99 Latency at 25 Connections
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 21.00 ms |
| Astro | 36.00 ms |
| Mastro | 47.00 ms |
| SvelteKit | 88.00 ms |
| React Router | 356.00 ms |
| Nuxt | 2002.00 ms |
| Next.js | 2120.00 ms |
| SolidStart | 3317.00 ms |
| TanStack Start | 3847.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P99 Latency at 50 Connections
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 44.00 ms |
| Astro | 67.00 ms |
| Mastro | 169.00 ms |
| SvelteKit | 344.00 ms |
| React Router | 1942.00 ms |
| TanStack Start | 3890.00 ms |
| SolidStart | 4176.00 ms |
| Nuxt | 4191.00 ms |
| Next.js | 4793.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P99 Latency at 100 Connections
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 109.00 ms |
| Astro | 331.00 ms |
| Mastro | 1447.00 ms |
| SvelteKit | 2614.00 ms |
| React Router | 4002.00 ms |
| SolidStart | 4097.00 ms |
| TanStack Start | 4335.00 ms |
| Nuxt | 4416.00 ms |
| Next.js | 4766.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P90 Latency
Section titled “P90 Latency”P90 Latency at 25 Connections
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 18.00 ms |
| Astro | 23.00 ms |
| Mastro | 44.00 ms |
| SvelteKit | 63.00 ms |
| React Router | 156.00 ms |
| Nuxt | 371.00 ms |
| SolidStart | 531.00 ms |
| TanStack Start | 739.00 ms |
| Next.js | 770.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P90 Latency at 50 Connections
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 33.00 ms |
| Astro | 43.00 ms |
| Mastro | 90.00 ms |
| SvelteKit | 135.00 ms |
| React Router | 327.00 ms |
| Nuxt | 489.00 ms |
| SolidStart | 591.00 ms |
| TanStack Start | 914.00 ms |
| Next.js | 2542.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
P90 Latency at 100 Connections
| Framework | Milliseconds |
|---|---|
| Baseline HTML | 77.00 ms |
| Astro | 87.00 ms |
| Mastro | 194.00 ms |
| SvelteKit | 236.00 ms |
| React Router | 391.00 ms |
| SolidStart | 601.00 ms |
| Nuxt | 741.00 ms |
| TanStack Start | 1317.00 ms |
| Next.js | 2986.00 ms |
The chart includes a dotted median reference line calculated from the visible framework values.
Core Web Vitals
Section titled “Core Web Vitals”CWV Desktop
Section titled “CWV Desktop”| Framework | LCP% | CLS% | FCP% | TTFB% | INP% |
|---|---|---|---|---|---|
| Astro | 91 | 87 | 91 | 82 | 97 |
| SolidStart | 91 | 66 | 91 | 83 | 100 |
| SvelteKit | 79 | 77 | 78 | 71 | 94 |
| Next.js | 72 | 69 | 76 | 67 | 94 |
| React Router | 61 | 62 | 66 | 70 | 90 |
| Nuxt.js | 65 | 57 | 67 | 59 | 95 |
Good Largest Contentful Paint
Measures how fast a page's main content loads. To provide a good user experience, the LCP should be 2.5 seconds or less.
| Framework | % |
|---|---|
| Astro | 91 |
| SolidStart | 91 |
| SvelteKit | 79 |
| Next.js | 72 |
| Nuxt.js | 65 |
| React Router | 61 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good Cumulative Layout Shift
Measures how much and how far content unexpectedly moves on a page. To provide a good user experience, sites should maintain a CLS score of 0.1 or less for at least 75% of page visits.
| Framework | % |
|---|---|
| Astro | 87 |
| SvelteKit | 77 |
| Next.js | 69 |
| SolidStart | 66 |
| React Router | 62 |
| Nuxt.js | 57 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good First Contentful Paint
Measures initial loading speed. To provide a good user experience, the FCP should be 1.8 seconds or less.
| Framework | % |
|---|---|
| Astro | 91 |
| SolidStart | 91 |
| SvelteKit | 78 |
| Next.js | 76 |
| Nuxt.js | 67 |
| React Router | 66 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good Time To First Byte
Measures the time between the request for a resource and when the first byte of a response begins to arrive. A good TTFB is less than or equal to 800ms.
| Framework | % |
|---|---|
| SolidStart | 83 |
| Astro | 82 |
| SvelteKit | 71 |
| React Router | 70 |
| Next.js | 67 |
| Nuxt.js | 59 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good Interaction to Next Paint
Measures overall page responsiveness to user actions. To provide a good user experience, the INP should be 200ms or less.
| Framework | % |
|---|---|
| SolidStart | 100 |
| Astro | 97 |
| Nuxt.js | 95 |
| SvelteKit | 94 |
| Next.js | 94 |
| React Router | 90 |
The chart includes a dotted median reference line calculated from the visible framework values.
CWV Mobile
Section titled “CWV Mobile”| Framework | LCP% | CLS% | FCP% | TTFB% | INP% |
|---|---|---|---|---|---|
| Astro | 77 | 92 | 71 | 60 | 86 |
| SolidStart | 90 | 63 | 90 | 81 | 100 |
| SvelteKit | 67 | 81 | 60 | 58 | 75 |
| Next.js | 51 | 69 | 50 | 47 | 58 |
| Nuxt.js | 45 | 58 | 43 | 45 | 65 |
| React Router | 41 | 64 | 41 | 53 | 56 |
Good Largest Contentful Paint
Measures how fast a page's main content loads. To provide a good user experience, the LCP should be 2.5 seconds or less.
| Framework | % |
|---|---|
| SolidStart | 90 |
| Astro | 77 |
| SvelteKit | 67 |
| Next.js | 51 |
| Nuxt.js | 45 |
| React Router | 41 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good Cumulative Layout Shift
Measures how much and how far content unexpectedly moves on a page. To provide a good user experience, sites should maintain a CLS score of 0.1 or less for at least 75% of page visits.
| Framework | % |
|---|---|
| Astro | 92 |
| SvelteKit | 81 |
| Next.js | 69 |
| React Router | 64 |
| SolidStart | 63 |
| Nuxt.js | 58 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good First Contentful Paint
Measures initial loading speed. To provide a good user experience, the FCP should be 1.8 seconds or less.
| Framework | % |
|---|---|
| SolidStart | 90 |
| Astro | 71 |
| SvelteKit | 60 |
| Next.js | 50 |
| Nuxt.js | 43 |
| React Router | 41 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good Time To First Byte
Measures the time between the request for a resource and when the first byte of a response begins to arrive. A good TTFB is less than or equal to 800ms.
| Framework | % |
|---|---|
| SolidStart | 81 |
| Astro | 60 |
| SvelteKit | 58 |
| React Router | 53 |
| Next.js | 47 |
| Nuxt.js | 45 |
The chart includes a dotted median reference line calculated from the visible framework values.
Good Interaction to Next Paint
Measures overall page responsiveness to user actions. To provide a good user experience, the INP should be 200ms or less.
| Framework | % |
|---|---|
| SolidStart | 100 |
| Astro | 86 |
| SvelteKit | 75 |
| Nuxt.js | 65 |
| Next.js | 58 |
| React Router | 56 |
The chart includes a dotted median reference line calculated from the visible framework values.
Methodology: Core Web Vitals.