
웹 성능 측정 지표.
라이트하우스로 측정한 LCP 외에도 INP, CLS가 있다!
사용자가 클릭/탭/키보드 입력 등 상호작용을 했을 때..
-> 그에 따른 화면 변화가 실제로 일어나는 시점까지 걸린 시간!
-> LCP가 2.5초 이하를 권장하듯, INP는 0.2초 이하를 권장한다.
브라우저는 성능 최적화를 위해 DOM 업데이트를 비동기적으로 처리하려 한다! = batch처리
그래서 아래처럼 dom 레이아웃 읽기와 쓰기가 반복되면..
for (let el of elements) {
const height = el.clientHeight; //reflow
el.style.height = height + 10 + "px"; //repaint
}
계속해서 레이아웃을 재계산하면서..
-> CPU를 낭비하고 프레임이 드랍돼 FPS가 감소한다!
-> 이것이 바로 레이아웃 스레싱.
간단하다! 아래처럼 reflow와 repaint가 일어날 지점을 모아 묶어주면 됨.
const heights = elements.map(el => el.clientHeight); // 읽기 묶기
elements.forEach((el, i) => {
el.style.height = heights[i] + 10 + "px"; // 쓰기 묶기
});
구글에서는 document.querySelectorAll("*").length 로 얻은 돔 개수가 1400개 이하일 것을 권장!
따라서...
useEffect(() => {
const element = document.getElementById("some-box");
const height1 = element.getBoundingClientRect().height;
console.log(`이 ${height1}는 실제 그려진 height와 다를수도 있다!`);
//useEffect가 실행될 시점엔 아직 리페인트가 완벽하게 끝나지 않았다!
setTimeout(() => {
const height2 = element.getBoundingClientRect().height;
console.log(`이 ${height2}가 실제 그려진 height!`);
//다음 이벤트 루프때 실행!
}, 0);
}, []);
모든 레이아웃이 다 보여지고 난 후에 해야 하는 작업에!!