Why it matters
The render body runs on every render (and twice in Strict Mode), so each render schedules another timer that is never cleared: leaks, duplicated state updates and render storms.
How to fix it
Start timers in useEffect and clear them in the cleanup function.
Example
useEffect(() => {
const id = setInterval(tick, 1000)
return () => clearInterval(id)
}, [])References
More lint rules
void lint reports 67 rules in this category. Static source checks with no browser: Tailwind v4 silent failures, Next.js 16 API traps, React render-body bugs, accessibility markup, SEO files and motion hygiene.
font-display`@font-face` without `font-display`too-many-font-familiesMore than 3 font families loadedscript-strategyThird-party script loads too earlybrowser-global-in-renderBrowser global (`window`, `document`, `navigator`, `localStorage`) at module scope or during rendermotionvalue-subscribe-in-renderMotionValue `.on("change")` subscription in a component bodywebgl-in-mapWebGL canvas rendered inside `.map()`raf-without-cancel`requestAnimationFrame` loop in an effect without `cancelAnimationFrame`listener-without-cleanupEvent listener or interval added in an effect without cleanup