跳至主要內容

    INP

    INP 衡量互動延遲(使用者操作到畫面更新)。它取代 FID,反映 JS 主執行緒是否被長任務阻塞。

    定義

    INP(Interaction to Next Paint)是 Core Web Vitals 的互動指標,用來衡量使用者互動後到下一次畫面更新的延遲。INP 受長任務(long tasks)、JS 執行、第三方 script、以及主執行緒阻塞影響。

    為什麼重要

    • 直接影響互動體感與使用者對「網站是否卡頓」的感受
    • 2024 年 3 月正式取代 FID,成為 Core Web Vitals 互動指標
    • 偏差會拖累轉換率與使用者滿意度
    • 反映真實的互動品質,不只是第一次點擊
    • 第三方 script(分析、廣告)常是 INP 問題的元兇
    • 過多 JS 會阻塞主執行緒,導致點擊無回應
    • 良好的 INP 讓使用者感覺網站「順暢」

    怎麼做(實作重點)

    • 拆分 JS、延後非必要 script、使用 async/defer
    • 識別並消除長任務(> 50ms):用 DevTools Performance 分析
    • 使用 Web Worker 把耗時計算移出主執行緒
    • 減少第三方 script 負擔:延後載入、使用 facade
    • 優化事件處理:debounce/throttle、避免複雜 DOM 操作
    • 使用 requestAnimationFrame 安排視覺更新
    • 監控 INP:用 web-vitals 函式庫或 RUM 持續追蹤

    範例

    html
    import { onINP } from 'web-vitals';
    
    onINP((metric) => {
      console.log('INP:', metric.value, 'ms');
      console.log('Rating:', metric.rating); // 'good' | 'needs-improvement' | 'poor'
      
      // 回報給分析服務
      analytics.track('INP', {
        value: metric.value,
        rating: metric.rating
      });
    });
    html
    // 長任務分割(實驗性 API)
    async function processItems(items) {
      for (const item of items) {
        processItem(item);
        
        // 每處理一項就讓出主執行緒
        if ('scheduler' in window && 'yield' in scheduler) {
          await scheduler.yield();
        } else {
          await new Promise(r => setTimeout(r, 0));
        }
      }
    }

    相關連結

    常見問題

    關於這個詞彙的常見問答。

    回到詞彙表