โ All frameworks Dev Time Performance
Measured using pnpm on GitHub Actions (ubuntu-latest, Node 24) based on the
starter project set up by each framework's CLI.
| Prod Deps | Dev Deps | Dup. Deps | node_modules | node_modules (prod) | Dep Install Size | Graph |
| 1 | 2 | 17 | 193.24MB | 156.01MB | 153.32MB | View |
| Metric | Avg | Min | Max |
| Install | 2.09s | 1.99s | 2.40s |
| Cold Build | 2.12s | 2.08s | 2.23s |
| Warm Build | 2.12s | 2.10s | 2.17s |
Build output size: 0.03MB
Duplicate Dependencies
17 duplicate dependencies
detected across this starter's node_modules.
View 17 duplicate dependencies
- chokidar
[duplicate dependency] chokidar has 2 installed versions:
4.0.3 via the following 1 package(s) @astrojs/check@0.9.6
5.0.0 via the following 1 package(s) unstorage@1.17.4
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- kleur
[duplicate dependency] kleur has 2 installed versions:
4.1.5 via the following 1 package(s) @astrojs/check@0.9.6
3.0.3 via the following 1 package(s) prompts@2.4.2
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- yaml
[duplicate dependency] yaml has 2 installed versions:
2.8.2 via the following 2 package(s) vite@6.4.1, @astrojs/yaml2ts@0.2.2
2.7.1 via the following 1 package(s) yaml-language-server@1.19.2
๐ก Suggestions
- Consider standardizing on version 2.8.2 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- estree-walker
[duplicate dependency] estree-walker has 2 installed versions:
2.0.2 via the following 1 package(s) @rollup/pluginutils@5.3.0
3.0.3 via the following 1 package(s) astro@5.16.15
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- picomatch
[duplicate dependency] picomatch has 2 installed versions:
4.0.3 via the following 5 package(s) @rollup/pluginutils@5.3.0, astro@5.16.15, fdir@6.5.0, tinyglobby@0.2.15, vite@6.4.1
2.3.1 via the following 1 package(s) anymatch@3.1.3
๐ก Suggestions
- Consider standardizing on version 4.0.3 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- request-light
[duplicate dependency] request-light has 2 installed versions:
0.7.0 via the following 1 package(s) @volar/language-server@2.4.28
0.5.8 via the following 1 package(s) yaml-language-server@1.19.2
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- jsonc-parser
[duplicate dependency] jsonc-parser has 2 installed versions:
2.3.1 via the following 1 package(s) @vscode/emmet-helper@2.11.0
3.3.1 via the following 1 package(s) vscode-json-languageservice@4.1.8
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- string-width
[duplicate dependency] string-width has 2 installed versions:
4.2.3 via the following 4 package(s) ansi-align@3.0.1, cliui@8.0.1, wrap-ansi@7.0.0, yargs@17.7.2
7.2.0 via the following 3 package(s) boxen@8.0.1, widest-line@5.0.0, wrap-ansi@9.0.2
๐ก Suggestions
- Consider standardizing on version 4.2.3 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- ansi-styles
[duplicate dependency] ansi-styles has 2 installed versions:
4.3.0 via the following 1 package(s) wrap-ansi@7.0.0
6.2.3 via the following 1 package(s) wrap-ansi@9.0.2
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- wrap-ansi
[duplicate dependency] wrap-ansi has 2 installed versions:
9.0.2 via the following 1 package(s) boxen@8.0.1
7.0.0 via the following 1 package(s) cliui@8.0.1
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- readdirp
[duplicate dependency] readdirp has 2 installed versions:
4.1.2 via the following 1 package(s) chokidar@4.0.3
5.0.0 via the following 1 package(s) chokidar@5.0.0
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- strip-ansi
[duplicate dependency] strip-ansi has 2 installed versions:
6.0.1 via the following 3 package(s) string-width@4.2.3, cliui@8.0.1, wrap-ansi@7.0.0
7.1.2 via the following 2 package(s) string-width@7.2.0, wrap-ansi@9.0.2
๐ก Suggestions
- Consider standardizing on version 6.0.1 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- css-tree
[duplicate dependency] css-tree has 2 installed versions:
2.2.1 via the following 1 package(s) csso@5.0.5
3.1.0 via the following 2 package(s) svgo@4.0.0, unifont@0.7.4
๐ก Suggestions
- Consider standardizing on version 3.1.0 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- mdn-data
[duplicate dependency] mdn-data has 2 installed versions:
2.0.28 via the following 1 package(s) css-tree@2.2.1
2.12.2 via the following 1 package(s) css-tree@3.1.0
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- entities
[duplicate dependency] entities has 2 installed versions:
4.5.0 via the following 1 package(s) dom-serializer@2.0.0
6.0.1 via the following 1 package(s) parse5@7.3.0
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- emoji-regex
[duplicate dependency] emoji-regex has 2 installed versions:
8.0.0 via the following 1 package(s) string-width@4.2.3
10.6.0 via the following 1 package(s) string-width@7.2.0
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- ansi-regex
[duplicate dependency] ansi-regex has 2 installed versions:
5.0.1 via the following 1 package(s) strip-ansi@6.0.1
6.2.2 via the following 1 package(s) strip-ansi@7.1.2
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
Runtime Performance
SSR Performance
Measured on GitHub Actions (ubuntu-latest, Node 24) using custom SSR
benchmark apps.
| Framework | Ops/sec | Avg Latency | Body Size | Duplication |
| Baseline HTML | 706 | 1.417ms | 96.81kb | 1x |
| Astro | 366 | 2.735ms | 99.86kb | 1x |
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
Measured on GitHub Actions (ubuntu-latest, Node 24) using Lighthouse
flow with Chromium.
| Framework | First Paint | FCP | INP |
| Astro | 36.8ms | 36.8ms | 98.72ms |
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.