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.
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, 92% without a yielding API have a good INP, compared with 96% for scheduler.yield() and 85% 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().
INP pass rate
Sites with scheduler.yield() have a good INP most often at 96%, followed by no yielding API at 92% and requestIdleCallback() at 85%. 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
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().
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 96% 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, 96% of scheduler.yield() sites have a good INP with a 28 ms median Total Blocking Time. Sites on requestIdleCallback() drop to 89% (208 ms TBT), and sites without yielding sit at 97% (347 ms TBT).
| Scripts on page | scheduler.yield() | requestIdleCallback() | No yielding API |
|---|---|---|---|
| 1 to 15 scripts | few sites | 82% 42 sites | 77% 172 sites |
| 16 to 35 scripts | few sites | 56% 254 sites | 93% 404 sites |
| 36 to 65 scripts | 96% 40 sites | 93% 427 sites | 93% 547 sites |
| 66 or more scripts | 96% 5,958 sites | 89% 1,457 sites | 97% 249 sites |
Main-thread yielding per platform
Wix uses scheduler.yield() on 100% of its sites, and 96% of Wix sites have a good INP. WordPress uses requestIdleCallback() on 61% of its sites, and 96% of WordPress sites have a good INP.
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, 98% of sites without a yielding API have a good INP, against 95% 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().
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 92% 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 96% good INP and 28 ms TBT, ahead of requestIdleCallback() at 89% good INP (208 ms TBT) and 347 ms TBT without yielding.
By Arjen Karel · 9,570 crawled React sites (5,488 with phone Chrome field data, October 2026). How we measured.