TML 파일은 DOM 트리를, CSS 파일은 CSSOM 트리를 만듬
랜더링시 두 트리를 결합
이 두 트리 중에서 하나라도 변경되면 리렌더링을 유발
이때 트리의 크기가 크고 복잡할수록 더 많은 계산이 필요하기 때문에 리렌더링에 소모되는 시간도 길어짐
=> 따라서 HTML, CSS 코드를 최적화함으로써 렌더링 성능을 향상시킬 수 있음
파일을 불러오는 위치가 어디인지에 따라서 렌더링 완료 시점이 달라짐
DOM트리는 HTML코드를 한 줄씩 읽으면서 순차적으로 구성
CSSOM 트리는 CSS 코드를 모두 해석해야 구성
=> 따라서 CSSOM 트리는 가능한 빠르게 구성할 수 있도록
CSS는 HTML문서 최상단 위치
// CSS 파일은 HTML 파일 상단의 head 요소 안에서 불러올 것
<head>
<link href="style.css" rel="stylesheet" />
</head>
<body>
// JavsScript 파일은 body 요소가 닫히기 직전에 작성할 것
<script src="script.js" type="text/javascript"></script>
</body>
페이지의 대부분의 용량은 HTML/CSS와 같은 코드 데이터가 아닌
이미지 파일과 같은 미디어 파일이 차지(전체 용량의 약 51%)
=> 그래서 이미지의 용량을 줄이거나 요청의 수를 줄여야함
여러개의 이미지를 모아 하나의 스프라이트 이미지로 만들rh
CSS의 background-position 속성을 사용해
이미지의 일정 부분만 클래스 등으로 구분하여 사용하는 방법
모든 아이콘을 이미지로 사용하는 것이 아니라 아이콘 폰트를 사용하여 용량을 줄일 수 있습니다. 대표적인 아이콘 글꼴 서비스로는 Font Awesome이 있dma
React 환경에서 사용할 경우에는 패키지를 설치하면 됨
// 핵심 패키지 설치
npm i --save @fortawesome/fontawesome-svg-core
// 무료 아이콘 패키지 설치
npm i --save @fortawesome/free-solid-svg-icons
npm i --save @fortawesome/free-regular-svg-icons
npm i --save @fortawesome/free-brands-svg-icons
// Font Awesome React 구성 요소 설치
npm i --save @fortawesome/react-fontawesome@latest
JPEG,PNG(x) 고용량, 대부분의 브라우저 지원
WebP,AVIF(o) 저용량, 구버전 브라우저에서 지원 안됨, safari 지원안됨
Q. 그럼 어떻게 해야하는가?
A. 다행히도 HTML의 Picture 태그 이용하면
각 브라우저의 호환에 맞도록 분기 가능
<picture>
<source srcset="logo.webp" type="image/webp">
<img src="logo.png" alt="logo">
</picture>
// <souce srcset>에 정의한 logo.WebP 포맷을 지원하지 않는다면 souce태그는 무시됨
프론트엔드단에서 캐시를 사용하지 위해서는
HTTP 요청을 보낼 때 조건부 요청 헤더를 작성해서
캐시를 재사용해도 되는지 확인만 해주면 됨!
If-Modified-Since: 캐시된 리소스의 Last-Modified 값 이후에 서버 리소스가 수정되었는지 확인하고, 수정되지 않았다면 캐시된 리소스를 사용
If-None-Match: 캐시된 리소스의 ETag 값과 현재 서버 리소스의 ETag 값이 같은지 확인하고, 같으면 캐시된 리소스를 사용
=> 보통 두 종류의 헤더를 동시에 사용
둘 중 하나만 사용했다가 매칭되는 응답 헤더가 없는 경우에는
재사용할 수 있는 경우에도 리소스를 다시 받는 번거로움을 피하려고!
네트워크 지연은 우저와 호스팅 서버간의 물리적 거리 때문에 발생
유저-서버의 거리가 멀다면 지연도 늘어남
CDN은 이를 해결하고자 세계 곳곳에 분포한 분산된 서버에 콘텐츠를 저장
간단히 말해, CDN은 유저가 가까운 곳에 위치한 데이터 센터의 데이터를 가져옴
그러므로 데이터가 전달되기 위해 거쳐야하는 서버의 갯수가 크게 줄어
로딩 속도가 빨라짐!