브라우저가 html 파일을 다운로드합니다.
html파일을 해석하여 DOM tree, CSSOM 트리를 구성합니다. -> domContentLoadedEvent
이 과정에서 다운로드할 다른 파일이나 이미지를 다운로드합니다. -> loadEvent
DOM과 CSSOM을 조합하는 렌더 트리를 만듭니다.
노드의 정확한 위치와 크기를 px로 계산하는 작업.
위치와 관계없는 CSS 속성(색상, 투명도 등)을 적용합니다. 이 과정에서 포토샵의 레이어처럼 레이어화도 이루어집니다.
페인트 단계에서 생성된 레이어들을 합성하여 스크린을 업데이트 합니다.
리플로우가 리페인트보다 부하가 크고, 리플로우를 일으키는 명령이 없으면 다시 실행하지 않으므로 불필요한 리플로우가 없도록 관리합니다.
파싱 단계에서 css 또는 javascript로 파싱이 중단될 수 있습니다. 이런 블록리소스들은 페인트 단계를 지연시킵니다.
1) css
2) js
</body>
직전)에 배치합니다.1) 이미지 스프라이트 사용
https://spritegen.website-performance.org/
2) css, js 번들화
웹팩 등의 사용.
3) 내부 스타일시트 사용하기
캐시 사용이 안되므로, 필요한 경우에만 사용하기
4) Data uri
이미지를 데이터로 바꾸는 것인데, 이 것도 캐시 사용이 안됩니다.
1) 중복 코드 제거하기
코드 자체의 용량을 늘리는 주범이 됩니다.
2) html 마크업 최적화
태그 중첩 최소화, 권장하는 DOM 트리의 노드 수는 전체 1500개 미만, 최대 깊이는 32개, 자식 노드를 가지는 부모 노드는 60개 미만. (참조: Excessive DOM)
3) 간결한 css 선택자 사용
4) 파일 압축
https://www.websiteplanet.com/ko/webtools/jscssminifier/
1) 자바스크립트가 레이아웃을 건드리는 상황을 최대한 피하세요
2) 강제 동기 레이아웃 최적화가 되는 부분을 피하세요
ex) offsetHeight
3) dom을 변경할 거면 최대한 하위 요소로
4) 숨겨진 엘리먼트는 display: none
이 유리합니다.
리플로우, 리페인트를 발생시키지 않습니다.
1) 자바스크립트보다는 css로
2) 애니메이션이 주변에 영향을 주지 않도록 position:absolute나 fixed 처리가 좋다
3) transform은 레이어로부터 분리시키기 때문에 리플로우 리페인트를 줄임