Frameworks performance

How JavaScript frameworks score across LCP, INP and CLS.

Field data PhoneDesktopAll Scope All sites November 2026 edition · Desktop 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.

79.9%
Best: React
good CLS
77.5%
Most used: jQuery
good CLS
49.2%
Worst: Angular
good CLS

React passes CLS most often of any framework. 79.9% of its sites pass. Angular passes least at 49.2%. jQuery (the most-used framework) sits at 77.5%. The gap is 31 percentage points.

The State of Web Vitals · November 2026 · 213,971 crawled sites · desktop field datacorewebvitals.io/state-of-cwv
2

The ranking sorted by CLS at p75, fastest first

# Framework CLS p75 Passing Sites
1 Svelte 0.07 78.8%
476
2 htmx 0.07 78.5%
306
3 Alpine.js 0.08 80.2%
2,711
4 React 0.08 79.9%
9,727
5 jQuery 0.09 77.5%
145,574
6 Remix 0.11 74.2%
54
7 Vue 0.12 71.5%
12,318
8 Gatsby 0.15 67.5%
222
9 Next.js 0.15 66.3%
1,858
10 Nuxt 0.16 64.0%
1,325
11 Angular 0.27 49.2%
3,423
The State of Web Vitals · November 2026 · 213,971 crawled sites · desktop field datacorewebvitals.io/state-of-cwv
3

Passing CLS per framework which group passes the CLS most often

FrameworkSitesPassing CLSp75
Alpine.js 1.3% 2,711 80% 0.08
React 4.6% 9,727 80% 0.08
Svelte 0.2% 476 79% 0.07
htmx 0.1% 306 79% 0.07
jQuery 69.5% 145,574 78% 0.09
Remix 0% 54 74% 0.11
Vue 5.9% 12,318 72% 0.12
Gatsby 0.1% 222 68% 0.15
Next.js 0.9% 1,858 66% 0.15
Nuxt 0.6% 1,325 64% 0.16
Angular 1.6% 3,423 49% 0.27
Good Needs Improvement Poor Sorted best-passing first · median colored by its own rating · pass = good CLS (0.1 at p75) · one value per site

80% of Alpine.js sites pass CLS. Angular trails 31 points behind, leaving 51% of its sites failing. computed

The State of Web Vitals · November 2026 · 213,971 crawled sites · desktop 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.5%
852.0s
9962ms
780.09
801.6s
571.2s
Vue 5.9%
832.2s
9978ms
720.12
801.6s
611.1s
React 4.6%
792.3s
9966ms
800.08
771.7s
531.5s
Angular 1.6%
752.5s
96106ms
490.27
801.6s
82643ms
Alpine.js 1.3%
921.7s
9966ms
800.08
871.4s
611.1s
Next.js 0.9%
862.0s
95111ms
660.15
861.4s
71885ms
Nuxt 0.6%
782.4s
9798ms
640.16
781.7s
641.0s
Svelte 0.2%
881.9s
9886ms
790.07
871.3s
75811ms
htmx 0.1%
961.7s
10065ms
790.07
911.3s
631.1s
Gatsby 0.1%
832.4s
85138ms
680.15
931.0s
88568ms
Remix 0%
872.1s
100100ms
740.11
881.4s
59994ms
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.

React leads on CLS: 80% of its sites pass. Angular trails at 49%. computed

The State of Web Vitals · November 2026 · 213,971 crawled sites · desktop 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, Svelte reaches a good CLS on 78.8% of sites; Angular on 49.2%.

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