What Is INP and How JavaScript Affects It

Interaction to Next Paint (INP) is a Core Web Vital metric that measures a web page’s overall responsiveness by tracking the latency of user interactions throughout a visit. This article explores what the INP metric measures, the three phases of interaction latency, how heavy JavaScript execution blocks the main thread to degrade performance, and practical strategies to optimize JavaScript for faster interaction response times.

Understanding Interaction to Next Paint (INP)

Interaction to Next Paint measures the time it takes for a page to present a visual update after a user interacts with it—such as clicking a button, tapping a touchscreen, or pressing a key. Unlike First Input Delay (FID), which only measured the initial delay of the very first interaction, INP observes all qualifying interactions throughout the entire lifecycle of a page visit and reports a value representing the worst or near-worst latency.

An interaction’s total latency consists of three distinct phases:

  1. Input Delay: The time between when the user initiates an action and when the corresponding event handlers begin executing.
  2. Processing Duration: The time spent executing the JavaScript event handlers associated with the interaction.
  3. Presentation Delay: The time required by the browser to recalculate styles, perform layout, paint pixels, and present the next visual frame on the screen.

An INP value under 200 milliseconds is considered good, values between 200 and 500 milliseconds need improvement, and values exceeding 500 milliseconds indicate poor responsiveness.

How JavaScript Execution Directly Affects INP

Browsers execute JavaScript on a single thread—the main thread. Because the main thread also handles parsing HTML, calculating layout, and rendering the user interface, any intensive JavaScript execution directly impacts interaction latency.

1. Long Tasks Block Input Handling

When JavaScript executes a “long task”—defined as any task taking longer than 50 milliseconds—the main thread becomes completely occupied. If a user clicks or taps while a script is executing, the browser must queue that interaction until the current task finishes. This increases the Input Delay phase of INP.

2. Heavy Event Listener Execution

When an interaction occurs, the browser runs the associated event handlers (e.g., click, keydown, pointerup). If these handlers perform heavy calculations, complex synchronous operations, or trigger multiple state updates, the Processing Duration increases, delaying the browser from moving on to the rendering phase.

3. Layout Thrashing and Forced Synchronous Layouts

JavaScript that alternates between reading and writing DOM properties (such as reading offsetHeight right after modifying styles) forces the browser to synchronously recalculate layouts. This excessive DOM manipulation delays the rendering pipeline, significantly extending the Presentation Delay.

Strategies to Optimize JavaScript for Lower INP

Improving INP requires freeing up the main thread so the browser can respond immediately to user actions.