png나 jpeg 형식의 이미지를 사용했기 때문에 발생. WebP 혹은 AVIF는 압축률이 훨씬 좋기 때문에 이 포멧을 사용해서 이미지를 인코딩하면 빠른 로딩 & 적은 데이터 가능하다.
(해결 방법:WebP 혹은 AVIF 형식으로 이미지를 인코딩 )
라이트하우스는 페이지의 이미지에대해서 렌더링된 이미지의 크기를 실제 이미지의 크기와 비교한다.
일반적으로 브라우저에 렌더링된 버전보다 큰 이미지가 페이지에 제공되어서는 안 된다. 이 경우에 바이트가 낭비되고 페이지 로드 시간이 느려진다.
이를 방지하기 위한 방법으로는
라이트 하우스는 모든 jpeg 혹은 bmp 이미지를 수집해 각 이미지의 압축 수준을 85로 설정한 후, 원본과 압축 버전을 비교한다. 잠재적인 절감 효과가 4KiB이상 경우, 라이트하우스는 이미지를 최적화가 필요하다고 설정한다.
또 다른 방식으로는 컴퓨터에 설치하고 GUI로 실행하는 최적화 프로그램을 통해 이미지를 최적화하는 것이다.
대표적으로 script 태그와 link rel="stylesheet"태그는 위치에 따라 렌더링을 막을 수 있다.
이러한 리소스에 대해
중요한 리소스는 인라인하고
중요하지 않은 리소스는 미루고
사용하지 않는 리소스는 제거함으로써 이러한 렌더 블라킹 URL의 효과를 줄이는 것이다.
방법으로는
1. 자바스크립트를 async를 이용한 비동기로 생성하는것
<script async src="my.js">
자바스크립트 파일의 크기가 작은 경우 그냥 html문서에 바로 삽입해 버리기 (script 태그를 이용한다. 단 태그에 src속성을 이용해 자바스크립트 파일을 불러오는 것이 아니라, 태그 속성 내부에 바로 자바스크립트 코드를 작성하는 것이다.)
위에서 언급한 script태그와 link로 불러오는 css파일의 경우 가장 기본적으로 위치 배치를 통해 이를 해결할 수 있다.(script태그는 body가 끝나기 전, link는 head에 삽입)
사용하지 않는 자바스크립트란
사용하지 않는 자바스크립트를 로드하게 되면 대역폭이 불필요하게 증가하고, 페이지의 첫 페인트(FCP)가 지연되어 전체적인 페이지 성능이 느려진다.
이를 해결하기 위한 방법으로는
1) 코드 분할
코드 분할을 통해 번들링된 자바스크립트를 중요한 자바스크립트와 그렇지 않은 자바스크립트로 나누고, 중요한 자바스크립트가 먼저 로드되게 할 수 있다.
2) dead code 걷어내기
현재 페이지에서 사용되지 않는 코드를 제거(트리쉐이킹 이용)
3) dead imported code 걷어내기
import후 사용하지 않는 라이브러리를 제거하는 플러그인을 설치해 사용하지 않는 코드는 걷어낸다.
(https://github.com/GoogleChromeLabs/webpack-libs-optimizations)
용량이 큰 gif는 움직이는 콘텐츠를 전달하기에 비효율적이다. 애니메이션을 위해서는 MPEG4/WebM 를, 고정된 이미지를 위해서는 PNG/WebP을 사용하는 것이 네트워크 바이트를 줄일 수 있다.
최소화된 css파일은 페이지 로드 퍼포먼스를 향상시킬 수 있다. 예를 들어
h1 {
background-color: #000000;
}
h2 {
background-color: #000000;
}
이 코드를 다시쓰면
h1, h2 { background-color: #000000; }
이렇게 할 수 있고 다시한번
h1,h2{background-color:#000000;}
불필요한 여백마저 줄여서 css파일을 읽는 속도를 높일 수 있다.
느낀점: 개인적으로 코드에 여백 주면서 작성하는걸 좋아했는데(왜냐면 보기 편하니까) 성능을 위해서는 좀 바꿔야겠구나...생각했습니다.