<script/> , <link/> <img/>
태그를 만나면 리소스 요청 후 다운HTML 태그는 항상 node와 맞물려짐
link를 통한 외부 스타일이나 내부 스타일 시트가 포함된 경우
CSS를 해석해서 CSSOM 트리를 생성함
픽셀값
으로 렌더트리에 반영%
레이아웃 단계를 거친 후 → 계산 → 픽셀 단위로 변환변환된 픽셀 값은 어떻게 관리 되나요?
포토샵의 레이어처럼 생성되어 개별 레이어로 관리됨
- 모든 엘리먼트가 레이어가 되는 것은 아님
- transform 속성을 사용하면 엘리먼트가 레이어화 됨 → 이를 페인트
렌더링 과정은 상황
에 따라 반복될 수 있음animation, transition → layout, paint, composition 중 어떤 것이 일어날지 알려줌
그럼 어떤 기준으로 로딩 속도가 빠르고 느린지 판별할까?
브라우저 기준과 사용자 기준으로 나눌 수 있음
DOMContentLoaded
, load
이벤트 이용 DOMContentLoaded
이벤트load
이벤트내비게이션 타이밍 API 이용
- 브라우저에서 웹 페이지 성능 측정 하기 위해 제공
렌더 트리 구성에서는 DOM 트리와 CSSOM 트리가 필요함
파싱 중에 태그 발견 마다 구성가능
하지만모두 해석해야 구성이 가능함
우리가 head 태그 밑 배치하는 이유
<head>
<link href="style.css" rel="stylesheet" />
</head>
<link href="style.css" rel="stylesheet" />
<link href="print.css" rel="stylesheet" media="print" />
<link href="portrait.css" rel="stylesheet" media="orientation:portrait" />
/* foo.css */
@import url("bar.css")
<head>
<style type="text/css">
.wrapper {
background-color: red;
}
</style>
</head>
webpack 같은 번들러를 사용하여 파일 요청을 줄이기
<html>
<head>
<link href="bundle.css" rel="stylesheet" />
</head>
<body>
<div class="foo">...</div>
<script async src="bundle.js" type="text/javascript"></script>
</body>
</html>
<html>
<head>
<style type="text/css">
.foo {
background-color: red;
}
</style>
</head>
<body>
<div class="foo">...</div>
</body>
</html>
장점
캐시 불
가 하므로 필요한 경우만 사용// befroe
.btn{background: url('../img/arrow_top.png') no-repeat 0 0;}
<img src="../img/arrow_top.png" />
// after
.btn{background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAOCAYAAAAbvf3sAAAAAXNSR0IArs4c6QAAAHBJREFUKBVjYBimICwsLAaEsXmPGV0QqnAeUNxfW1v7/tWrVy8hq0HRgKQ4CahoIxDPQ9cE14CseNWqVUtAJoMUo2tiBFkXGRmp9/fv3zNAZhJIMUgMBmAGMTMzmyxfvhzhPJAmmCJ0Gp8cutqhwAcASWgwk+79LiQAAAAASUVORK5CYII=') no-repeat 0 0;}
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAOCAYAAAAbvf3sAAAAAXNSR0IArs4c6QAAAHBJREFUKBVjYBimICwsLAaEsXmPGV0QqnAeUNxfW1v7/tWrVy8hq0HRgKQ4CahoIxDPQ9cE14CseNWqVUtAJoMUo2tiBFkXGRmp9/fv3zNAZhJIMUgMBmAGMTMzmyxfvhzhPJAmmCJ0Gp8cutqhwAcASWgwk+79LiQAAAAASUVORK5CYII=" />
// before
// 모든 것을 다 가져와서 용량이 큼
import _ from 'lodash';
_.array(...);
_.object(...);
// after
// 필요한 것만 가져오기
import array from 'lodash/array';
import object from 'lodash/fp/object';
array(...);
object(...);
<html>
<head>
...
</head>
<body>
<p>hello</p>
</body>
</html>
클래스 선택자
를 사용하면 중복되는 스타일 묶어서 처리 가능// before
<head>
<style type="text/css">
#wrapper {
border: 1px solid blue;
}
#wrapper #foo {
color: red;
font-size: 15px;
}
#wrapper #bar {
color: red;
font-size: 15px;
font-weight: bold;
}
#wrapper #bar > span {
color: blue;
font-weight: normal;
}
</style>
</head>
<span id="foo">hello</span>
<span id="bar">
javascript <span>world</span>
</span>
// after
<head>
<style type="text/css">
.wrapper {
border: 1px solid blue;
}
.text {
color: red;
font-size: 15px;
}
.strong {
font-weight: bold;
}
.wrapper .text {
color: blue;
font-weight: normal;
}
</style>
</head>
<span class="text">hello</span>
<span class="text strong">
javascript <span class="text">world</span>
</span>
DOM 속성을 변경하면 화면 업데이트를 위한 레이아웃 발생 가능
특정 상황에서 동기적으로 발생 가능
강제 동기 레이아웃
강제 동기 레이아웃 피하기 - offsetHeigth
, offsetTop
const tabBtn = document.getElementById('tab_btn');
tabBtn.style.fontSize = '24px';
console.log(testBlock.offsetTop); // offsetTop 호출 직전 브라우저 내부에서는 동기 레이아웃이 발생한다.
tabBtn.style.margin = '10px';
// 레이아웃
성능이 저하됨
function resizeAllParagraphs() {
const box = document.getElementById('box');
const paragraphs = document.querySelectorAll('.paragraph');
for (let i = 0; i < paragraphs.length; i += 1) {
paragraphs[i].style.width = box.offsetWidth + 'px';
}
}
// 레이아웃 스래싱을 개선한 코드
function resizeAllParagraphs() {
const box = document.getElementById('box');
const paragraphs = document.querySelectorAll('.paragraph');
const width = box.offsetWidth;
for (let i = 0; i < paragraphs.length; i += 1) {
paragraphs[i].style.width = width + 'px';
}
}
What forces layout/reflow. The comprehensive list.
체크 항목
DOM 트리 상위 노드의 스타일 변경 → 하위에 영향
변경 범위를 최소화 → 레이아웃 범위가 줄어듬
영향 받는 엘리먼트 제한하기
체크 항목
width
값 변경으로 인해 나머지 엘리먼트의 위치 변경이 일어나므로 유의한다.disaplay : none
→ 레이아웃 리페인트 발생 X최소화
CSS 사용 애니메이션 구현 권장의 이유
브라우저의 프레임 속도에 맞춰서 애니메이션을 실행시킬 수 있도록 도와줌
프레임을 시작할 때 호출
페이지가 보이지 않으면 콜백함수가 호출되지 않음
CSS3 애니메이션을 사용하면 JS 실행할 필요가 없고
브라우저가 애니메이션 처리 최적화 → 부드러운 애니메이션 사용 가능
poistion : absolute
transform
사용
레이어로 분리
합성
만 발생 → 렌더링 속도 향상(composition)/* bad */
@keyframes move {
50% {
top: 100px;
left: 100px;
}
}
/* good */
@keyframes move {
50% {
transform: translate(100px, 100px);
}
}