โ 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 | Size | Size (Prod Only) | Graph |
| 3 | 6 | 12 | 560.03MB | 435.99MB | View |
| Metric | Avg | Min | Max |
| Install | 2.04s | 1.89s | 2.35s |
| Cold Build | 7.22s | 7.09s | 7.51s |
| Warm Build | 7.24s | 7.21s | 7.30s |
Build output size: 6.18MB
Duplicate Dependencies
12 duplicate dependencies
detected across this starter's node_modules.
View 12 duplicate dependencies
- debug
[duplicate dependency] debug has 2 installed versions:
4.4.3 via the following 10 package(s) @babel/traverse@7.29.0, @babel/core@7.29.0, @eslint/config-array@0.21.1, @eslint/eslintrc@3.3.3, eslint@9.39.2, eslint-import-resolver-typescript@3.10.1, @typescript-eslint/project-service@8.55.0, @typescript-eslint/typescript-estree@8.55.0, @typescript-eslint/parser@8.55.0, @typescript-eslint/type-utils@8.55.0
3.2.7 via the following 3 package(s) eslint-import-resolver-node@0.3.9, eslint-plugin-import@2.32.0, eslint-module-utils@2.12.1
๐ก Suggestions
- Consider standardizing on version 4.4.3 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- json5
[duplicate dependency] json5 has 2 installed versions:
2.2.3 via the following 1 package(s) @babel/core@7.29.0
1.0.2 via the following 1 package(s) tsconfig-paths@3.15.0
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- semver
[duplicate dependency] semver has 2 installed versions:
6.3.1 via the following 4 package(s) @babel/helper-compilation-targets@7.28.6, @babel/core@7.29.0, eslint-plugin-import@2.32.0, eslint-plugin-react@7.37.5
7.7.4 via the following 3 package(s) sharp@0.34.5, is-bun-module@2.0.0, @typescript-eslint/typescript-estree@8.55.0
๐ก Suggestions
- Consider standardizing on version 6.3.1 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- eslint-visitor-keys
[duplicate dependency] eslint-visitor-keys has 2 installed versions:
3.4.3 via the following 1 package(s) @eslint-community/eslint-utils@4.9.1
4.2.1 via the following 3 package(s) espree@10.4.0, eslint@9.39.2, @typescript-eslint/visitor-keys@8.55.0
๐ก Suggestions
- Consider standardizing on version 4.2.1 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- minimatch
[duplicate dependency] minimatch has 2 installed versions:
3.1.2 via the following 6 package(s) @eslint/config-array@0.21.1, @eslint/eslintrc@3.3.3, eslint@9.39.2, eslint-plugin-import@2.32.0, eslint-plugin-jsx-a11y@6.10.2, eslint-plugin-react@7.37.5
9.0.5 via the following 1 package(s) @typescript-eslint/typescript-estree@8.55.0
๐ก Suggestions
- Consider standardizing on version 3.1.2 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- globals
[duplicate dependency] globals has 2 installed versions:
14.0.0 via the following 1 package(s) @eslint/eslintrc@3.3.3
16.4.0 via the following 1 package(s) eslint-config-next@16.1.1
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- ignore
[duplicate dependency] ignore has 2 installed versions:
5.3.2 via the following 2 package(s) @eslint/eslintrc@3.3.3, eslint@9.39.2
7.0.5 via the following 1 package(s) @typescript-eslint/eslint-plugin@8.55.0
๐ก Suggestions
- Consider standardizing on version 5.3.2 as this version is the most commonly used.
- Consider upgrading consuming packages as this may resolve this duplicate version.
- postcss
[duplicate dependency] postcss has 2 installed versions:
8.5.6 via the following 1 package(s) @tailwindcss/postcss@4.1.18
8.4.31 via the following 1 package(s) next@16.1.1
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- brace-expansion
[duplicate dependency] brace-expansion has 2 installed versions:
1.1.12 via the following 1 package(s) minimatch@3.1.2
2.0.2 via the following 1 package(s) minimatch@9.0.5
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- resolve
[duplicate dependency] resolve has 2 installed versions:
1.22.11 via the following 1 package(s) eslint-import-resolver-node@0.3.9
2.0.0-next.5 via the following 1 package(s) eslint-plugin-react@7.37.5
๐ก Suggestions
- Consider upgrading consuming packages as this may resolve this duplicate version.
- glob-parent
[duplicate dependency] glob-parent has 2 installed versions:
6.0.2 via the following 1 package(s) eslint@9.39.2
5.1.2 via the following 1 package(s) fast-glob@3.3.1
๐ก 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 2 package(s) fdir@6.5.0, tinyglobby@0.2.15
2.3.1 via the following 1 package(s) micromatch@4.0.8
๐ก 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.
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 |
| Next.js | 129 | 7.74ms | 198.59kb | 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