Main-thread yielding (scheduler.yield vs requestIdleCallback) and the Core Web Vitals
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.
More than two in three sites (68.3%) call no main-thread yielding API. 26.8% use requestIdleCallback() and 4.9% use scheduler.yield(). Across all sites, 99% without a yielding API have a good INP, compared with 98% for scheduler.yield() and 99% for requestIdleCallback(). Sites without a yielding API load a median of 20 scripts, while scheduler.yield() sites load 77 scripts. Even with that workload, scheduler.yield() holds median Total Blocking Time to 33 ms, against 91 ms for requestIdleCallback().
INP pass rate
Sites with no yielding API have a good INP most often at 99%, followed by requestIdleCallback() at 99% and scheduler.yield() at 98%. 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.
Main-thread yielding usage
31.7% of sites call a main-thread yielding API, while 68.3% run scripts without one. Among the sites that yield, 27% (55,193 sites) use requestIdleCallback() and 5% (10,081 sites) use scheduler.yield().
JavaScript workload by yielding strategy
Yielding APIs appear on pages with heavy JavaScript bundles. Sites with no yielding API load a median of 20 scripts and spend 324 ms in CPU scripting (7 ms Total Blocking Time). Sites using requestIdleCallback() load 44 scripts and spend 1007 ms in scripting, which pushes median Total Blocking Time to 91 ms. Sites using scheduler.yield() load a median of 77 scripts (662 ms scripting). Breaking up those tasks keeps median Total Blocking Time at 33 ms, and 98% have a good INP.
INP pass rate by total script count
Six in ten scheduler.yield() sites load 66 or more scripts. On those heavy pages, 98% of scheduler.yield() sites have a good INP with a 36 ms median Total Blocking Time. Sites on requestIdleCallback() drop to 99% (216 ms TBT), and sites without yielding sit at 99% (204 ms TBT).
| Scripts on page | scheduler.yield() | requestIdleCallback() | No yielding API |
|---|---|---|---|
| 1 to 15 scripts | 96% 648 sites | 98% 6,528 sites | 99% 50,755 sites |
| 16 to 35 scripts | 98% 1,512 sites | 99% 15,278 sites | 99% 46,674 sites |
| 36 to 65 scripts | 99% 1,131 sites | 99% 17,488 sites | 99% 25,631 sites |
| 66 or more scripts | 98% 6,787 sites | 99% 15,857 sites | 99% 8,595 sites |
Understanding main-thread yielding
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 (77 median scripts), that holds median Total Blocking Time to 33 ms, against 91 ms on sites using requestIdleCallback().
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 99% good INP because they only load a median of 20 scripts (7 ms Total Blocking Time). Sites using scheduler.yield() load a median of 77 scripts. On pages with 66 or more scripts, scheduler.yield() reaches 98% good INP and 36 ms TBT, ahead of requestIdleCallback() at 99% good INP (216 ms TBT) and 204 ms TBT without yielding.
How main-thread yielding plays out per platform
What the field data shows when you isolate a single CMS or framework.
65.3% of WordPress sites call no main-thread yielding API.
Across WordPress, 65.3% of sites run scripts without a yielding API, 32.1% call requestIdleCallback(), and 2.6% call scheduler.yield().
React sites using scheduler.yield() pass INP 2 points more often than sites using requestIdleCallback().
Across React sites, 62.8% call scheduler.yield() (100% good INP, 39ms median) compared with 22.8% calling requestIdleCallback() (98% good INP, 57ms median).
95% of Shopify stores call requestIdleCallback().
Across Shopify storefronts, 95.5% call requestIdleCallback() (61ms median INP, 99% good INP overall) and 4.2% call scheduler.yield().
100% of Wix sites call scheduler.yield().
Across Wix sites, 99.9% call scheduler.yield() (100% good INP, 37ms median).
By Arjen Karel · 210,902 crawled sites (69,745 with desktop Chrome field data, 206,118 sites with main-thread yielding, October 2026). How we measured.