Main-thread yielding on React sites

No yielding API, requestIdleCallback(), scheduler.yield(), isInputPending(), or scheduler.postTask(): how JavaScript-heavy sites break up long tasks and keep Interaction to Next Paint (INP) fast.

Field data PhoneDesktopAll Scope All sites October 2026 edition · All devices field outcomes · React sites only
React Scoped to 9,570 sites out of 210,902 analyzed (frameworks) Compare with all sites →

On React, 14.3% of sites call no main-thread yielding API. 22.8% use requestIdleCallback() and 62.8% use scheduler.yield(). Across all React sites, 94% without a yielding API have a good INP, compared with 97% for scheduler.yield() and 91% for requestIdleCallback(). Sites without a yielding API load a median of 40 scripts, while scheduler.yield() sites load 82 scripts. Even with that workload, scheduler.yield() holds median Total Blocking Time to 28 ms, against 155 ms for requestIdleCallback().

The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
1

INP pass rate

Sites with scheduler.yield() have a good INP most often at 97%, followed by no yielding API at 94% and requestIdleCallback() at 91%. Both isInputPending() and scheduler.postTask() appear on fewer than 50 sites across the dataset. Pages with little JavaScript do not need a yielding helper, so the raw pass rates mostly reflect how much script each page loads.

SitesGood, needs improvement, poor INPMedian
All React sites9,11095%80ms
scheduler.yield() 62.8%5,69797%74ms
No yielding API (none) 14.3%1,31094%88ms
requestIdleCallback() 22.8%2,09991%96ms
scheduler.postTask() <0.1%475%115ms
GoodNeeds improvementPoorSites: with Chrome field data
The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
2

Main-thread yielding usage

85.7% of React sites call a main-thread yielding API, while 14.3% run scripts without one. Among the sites that yield, 23% (2,180 sites) use requestIdleCallback() and 63% (6,014 sites) use scheduler.yield().

scheduler.yield() 62.8% requestIdleCallback() 22.8% No yielding API (none) 14.3%
scheduler.yield() 62.8% requestIdleCallback() 22.8% No yielding API (none) 14.3% scheduler.postTask() <0.1%
The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
3

JavaScript workload by yielding strategy

Yielding APIs appear on pages with heavy JavaScript bundles. Sites with no yielding API load a median of 40 scripts and spend 632 ms in CPU scripting (71 ms Total Blocking Time). Sites using requestIdleCallback() load 85 scripts and spend 1218 ms in scripting, which pushes median Total Blocking Time to 155 ms. Sites using scheduler.yield() load a median of 82 scripts (623 ms scripting). Breaking up those tasks keeps median Total Blocking Time at 28 ms, and 97% have a good INP.

Strategy Median scripts on page Median CPU scripting time Median Total Blocking Time Pass rate
scheduler.yield() 6,014 82 scripts 623 ms 28 ms 97%
requestIdleCallback() 2,180 85 scripts 1,218 ms 155 ms 91%
No yielding API (none) 1,372 40 scripts 632 ms 71 ms 94%
The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
4

INP pass rate by total script count

Six in ten scheduler.yield() sites load 66 or more scripts. On those heavy pages, 97% of scheduler.yield() sites have a good INP with a 28 ms median Total Blocking Time. Sites on requestIdleCallback() drop to 94% (208 ms TBT), and sites without yielding sit at 98% (347 ms TBT).

Scripts on page scheduler.yield() requestIdleCallback() No yielding API
1 to 15 scripts few sites
84% 1 ms TBT 42 sites
82% 6 ms TBT 172 sites
16 to 35 scripts few sites
66% 74 ms TBT 254 sites
92% 40 ms TBT 404 sites
36 to 65 scripts
100% 94 ms TBT 40 sites
95% 91 ms TBT 427 sites
98% 73 ms TBT 547 sites
66 or more scripts
97% 28 ms TBT 5,958 sites
94% 208 ms TBT 1,457 sites
98% 347 ms TBT 249 sites
The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
5

Main-thread yielding per platform

Wix uses scheduler.yield() on 100% of its sites, and 97% of Wix sites have a good INP. WordPress uses requestIdleCallback() on 61% of its sites, and 98% of WordPress sites have a good INP.

PlatformMain-thread yielding on its sitesGood INP
All React sites 9,570 sitesscheduler.yield() 63%requestIdleCallback() 23%No yielding API (none) 14%95%
WordPress 2,342 sitesrequestIdleCallback() 61%No yielding API (none) 32%98%
Wix 5,824 sitesscheduler.yield() 100%97%
scheduler.yield() requestIdleCallback() No yielding API (none) scheduler.postTask()
The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
6

Main-thread yielding or the platform

Does the platform explain the yielding pass rate?

Wix includes scheduler.yield() in its core runtime on 100% of its sites. Wix alone accounts for 97% of all scheduler.yield() sites in the dataset. On WordPress, 99% of sites without a yielding API have a good INP, compared with 97% for scheduler.yield() and 98% for requestIdleCallback().

Why scheduler.yield() resumes faster than setTimeout or requestIdleCallback()

When a script yields with setTimeout(fn, 0) or requestIdleCallback(), the remaining work goes to the back of the task queue. Any queued timer, third-party tracker, or network callback runs before your function continues. scheduler.yield() pauses the current task so the browser can handle input and paint the next frame, then resumes your code ahead of regular tasks. On script-heavy sites (82 median scripts), that holds median Total Blocking Time to 28 ms, against 155 ms on sites using requestIdleCallback().

The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
7

Understanding main-thread yielding

Break up long JavaScript tasks (over 50 ms) with await scheduler.yield(), and fall back to setTimeout(resolve, 0) in browsers that do not support it yet. Keep requestIdleCallback() for background work like analytics batching, never inside an interaction handler. Across this dataset, sites with no yielding API score 94% good INP because they only load a median of 40 scripts (71 ms Total Blocking Time). Sites using scheduler.yield() load a median of 82 scripts. On pages with 66 or more scripts, scheduler.yield() reaches 97% good INP and 28 ms TBT, ahead of requestIdleCallback() at 94% good INP (208 ms TBT) and 347 ms TBT without yielding.

The State of Web Vitals · October 2026 · React: 9,570 crawled sites · 9,110 with all devices field dataBy Arjen Karel · corewebvitals.io/state-of-cwv
Related signals Scheduling API use → CSS hints → Interaction invoker types → Blocking frame breakdown → By Arjen Karel · 9,570 crawled React sites (9,110 with all devices Chrome field data, October 2026) · How we measured