"매 frame 60fps = 16.67ms budget. 매 그 budget 안에서 layout / paint / composite 모두 끝나야 한다". Browser 매 critical rendering path 의 각 단계 (Parse → Style → Layout → Paint → Composite) 의 cost 를 이해하고, 매 reflow 를 최소화하고 GPU compositing layer 로 offload 하는 것이 매 핵심.
매 핵심
매 Critical Rendering Path
Parse HTML → DOM tree
Parse CSS → CSSOM
Style → DOM + CSSOM 합쳐 Render Tree
Layout (Reflow) → 매 element 의 geometry (x, y, w, h) 계산
Paint → pixel 채우기 (color, image, shadow)
Composite → GPU layer 합성
매 비싼 동작 ranking
Layout (Reflow): 가장 비쌈. width, height, top, left, font-size 변경 → 매 reflow trigger.
Paint: 중간. color, background, box-shadow 변경.
Composite only: 매 cheap. transform, opacity 만 변경 → GPU 에서 처리.
매 응용
Animation: transform / opacity 만 사용 (composite-only).
Scroll perf: passive event listener, will-change.
Long list: virtualization (react-window, virtual scroll).
💻 패턴
Composite-only animation (60fps 보장)
/* 매 BAD — reflow 매 frame */.bad{transition:left300ms;}.bad.move{left:200px;}/* 매 GOOD — composite only */.good{transition:transform300ms;will-change:transform;}.good.move{transform:translateX(200px);}
Batch DOM read/write (avoid layout thrashing)
// 매 BAD — read/write/read/write → forced sync layout 매번
elements.forEach(el=>{constw=el.offsetWidth;// read (layout)
el.style.width=(w*2)+'px';// write (invalidate)
});// 매 GOOD — batch read first, then batch write
constwidths=elements.map(el=>el.offsetWidth);// all reads
elements.forEach((el,i)=>{el.style.width=(widths[i]*2)+'px';// all writes
});