// main
constw=newWorker("./parse.worker.js",{type:"module"});w.postMessage(largePayload);w.onmessage=(e)=>render(e.data);// parse.worker.js
self.onmessage=(e)=>{constresult=heavyParse(e.data);self.postMessage(result);};
React deferred / transition
import{useDeferredValue,useTransition}from"react";constdeferred=useDeferredValue(query);const[isPending,start]=useTransition();start(()=>setFilter(next));// non-urgent → no long task on type
web-vitals 통합
import{onINP}from"web-vitals/attribution";onINP((m)=>{// m.attribution.longAnimationFrameEntries → 원인 frame
beacon("inp",m);},{reportAllChanges:true});
매 결정 기준
상황
도구
측정 시작
LoAF (지원) → Long Tasks fallback
사용자 INP 추적
web-vitals attribution
CPU-bound
Web Worker
큰 리스트 처리
scheduler.yield, chunking
Render bottleneck
useDeferredValue, virtualization
Third-party 무거움
defer/async, Partytown
기본값: web-vitals onINP + LoAF observer로 attribute → 가장 큰 script 우선 최적화.