Frameworks performance

How JavaScript frameworks score across LCP, INP and CLS.

Field data PhoneDesktopAll Scope All sites October 2026 edition · All devices field outcomes
Metric LCP INP CLS FCP TTFB
1

At a glance the headline numbers for Frameworks performance

How JavaScript frameworks score across LCP, INP and CLS.

98.8%
Best: htmx
good INP
96.7%
Most used: jQuery
good INP
67.5%
Worst: Next.js
good INP

htmx passes INP most often of any framework. 98.8% of its sites pass. Next.js passes least at 67.5%. jQuery (the most-used framework) sits at 96.7%. The gap is 31 percentage points.

The State of Web Vitals · October 2026 · 210,902 crawled sites · all devices field datacorewebvitals.io/state-of-cwv
2

The ranking sorted by INP at p75, fastest first

# Framework INP p75 Passing Sites
1 React 103ms 95.1%
9,570
2 jQuery 104ms 96.7%
143,509
3 htmx 108ms 98.8%
301
4 Alpine.js 115ms 96.5%
2,671
5 Vue 127ms 95.1%
12,115
6 Svelte 138ms 92.3%
467
7 Remix 150ms 87.0%
53
8 Nuxt 157ms 88.3%
1,309
9 Angular 162ms 87.6%
3,377
10 Gatsby 180ms 81.8%
218
11 Next.js 233ms 67.5%
1,832
The State of Web Vitals · October 2026 · 210,902 crawled sites · all devices field datacorewebvitals.io/state-of-cwv
3

Passing INP per framework which group passes the INP most often

FrameworkSitesPassing INPp75
htmx 0.1% 301 99% 108ms
jQuery 69.6% 143,509 97% 104ms
Alpine.js 1.3% 2,671 97% 115ms
Vue 5.9% 12,115 95% 127ms
React 4.6% 9,570 95% 103ms
Svelte 0.2% 467 92% 138ms
Nuxt 0.6% 1,309 88% 157ms
Angular 1.6% 3,377 88% 162ms
Remix 0% 53 87% 150ms
Gatsby 0.1% 218 82% 180ms
Next.js 0.9% 1,832 68% 233ms
Good Needs Improvement Poor Sorted best-passing first · median colored by its own rating · pass = good INP (200ms at p75) · one value per site

99% of htmx sites pass INP. Next.js trails 31 points behind, leaving 32% of its sites failing. computed

The State of Web Vitals · October 2026 · 210,902 crawled sites · all devices field datacorewebvitals.io/state-of-cwv
4

All five vitals at once the whole category without toggling - cell is the pass rate, small number the p75

LCP
INP
CLS
FCP
TTFB
jQuery 69.6%
812.3s
97104ms
880.04
731.9s
511.4s
Vue 5.9%
762.4s
95127ms
830.06
712.0s
531.4s
React 4.6%
852.1s
95103ms
920.01
811.5s
671.1s
Angular 1.6%
662.8s
88162ms
560.24
702.0s
76766ms
Alpine.js 1.3%
891.9s
97115ms
910.03
821.6s
571.1s
Next.js 0.9%
852.1s
68233ms
660.17
841.5s
69878ms
Nuxt 0.6%
722.6s
88157ms
690.14
731.9s
631.0s
Svelte 0.2%
832.1s
92138ms
850.05
821.6s
71885ms
htmx 0.1%
911.9s
99108ms
870.03
831.5s
591.1s
Gatsby 0.1%
712.6s
82180ms
650.19
931.4s
78755ms
Remix 0%
852.2s
87150ms
730.11
811.6s
561.1s
60%95%+ passing Cell: pass rate, small number = p75 · faded rows: under 100 sites

One row per framework, one column per vital - the cell is the share of sites passing, the small number the p75. No toggling needed to see where the category actually differs.

htmx leads on INP: 99% of its sites pass. Next.js trails at 68%. computed

The State of Web Vitals · October 2026 · 210,902 crawled sites · all devices field datacorewebvitals.io/state-of-cwv
5

Why this matters for the Core Web Vitals, and where to start fixing it

A JavaScript framework shapes how much code runs in the browser to put your page on the screen. Some render on the server and ship light; others send a large bundle and rebuild the page on the client, which lands on the main thread and shows up in INP. The framework is not destiny, but its defaults and how you use them decide how much JavaScript the visitor has to pay for.

Start by looking at what ships to the browser and when it runs. Render on the server where you can, split the bundle so each page only loads what it needs, and defer the work that is not required for the first interaction. Framework JavaScript runs on the main thread, so the less of it the browser has to execute, the better INP gets.

How does your framework affect Core Web Vitals?

Among the JavaScript frameworks, React reaches a good INP on 95.1% of sites; Next.js on 67.5%.

Related signals CDN (7) → CMS (12) → 210,902 crawled sites with Chrome field data, representing millions of real page loads · How we measured