본문 바로가기
프론트엔드/CSS

[CSS] CSS 최적화 기법

by zzocco94 2023. 2. 21.

기법 

1. Remove unused CSS 사용하지 않는 CSS 제거

2. Eliminate render-blocking resources 렌더 차단 리소스 제거

 

 


1. Remove unused CSS

 

CSS = 렌더 차단 리소스

브라우저가 CSS 파일을 해석하는 동안 웹 페이지 렌더링은 차단된다.

즉, CSS는 페이지 렌더링을 차단하는 리소스임.

사용하지 않는 CSS가 많을 수록

브라우저가 스타일을 계산하는데 잠재적으로 더 많은 시간을 소비한다.

 

Lighthouse

미사용 CSS가 포함된 2KB 이상의 파일을 검출해서 오류로 보고한다.

Remove unused CSS 라는 항목을 클릭해서 보면 된다.

 

# 주의사항

- font-face 규칙을 사용하지 않는 CSS로 보고하는 오류가 있음 (사용하는데 미사용이라고 보고)

 

 

개발자 도구 Coverage Tap

cmd + shift + P 를 눌러서 coverage 또는 적용 범위로 검색하면

coverage 탭에 들어갈 수 있다.

여기서 실제로 사용되지 않는 CSS 코드를 확인할 수 있다.

 

적용 범위 보기 (show coverage) 를 클릭하면 하단에 탭이 뜬다
[붉은색]으로 표시된 부분이 unused css 이다.

 


2. Eliminate render-blocking resources

 

Render blocking 왜 문제인가?

브라우저가 외부 리소스를 다운로드하고 파싱하는 동안

페이지 콘텐츠를 파싱하거나 렌더링하지 않기 때문에 (아무것도 보여지지 않음)

페이지 표시 속도 저하의 원인. 

 

# unused css는 render blocking을 가중하는 요인이다.

 

Lighthouse

티스토리 웹을 측정했더니 렌더링 차단 리소스가 있다고 뜬다 ㅇㅅㅇ

 

Render blocking resource 표시 조건

- <head> 요소의 <script> 태그에 defer, async 속성이 없음

- <link rel="stylesheet"> 태그에 media 속성이 없거나, 값이 all임

 

script 태그

- defer 속성을 권장함

- script 병렬 다운로드 + 지연 실행하므로, HTML 파싱이 중단 없이 계속 진행 됨

 

 

link rel=stylesheet

 

방법 1. media 속성 추가

- media = 조건문

- 특정 조건일 때만 stylesheet를 해석하므로, 렌더 차단 리소스로 파악 되지 않음

 

// 방향이 portrait 일 때 stylesheet 해석
<link href="portrait.css" rel="stylesheet" media="orientation:portrait">

// print 할 때 stylesheet 해석
<link href="portrait.css" rel="stylesheet" media="print">

 

- 반응형 웹 구현 시 해상도 구간별로 CSS 파일을 분리 + media 속성으로 분기
   ㄴ 모바일에서는 모바일 코드만, 데스크톱에서는 데스크톱 코드만 다운로드 하게 하는 것이 좋음 

 

<link href="*.css" rel="stylesheet" media="(max-width: 639px)"> // 스마트폰
<link href="*.css" rel="stylesheet" media="(min-width: 640px) and (max-width: 960px)"> // 태블릿
<link href="*.css" rel="stylesheet" media="(min-width: 691px)"> // 데스크톱

 

방법 2. 필수 스타일은 head의 <style> 태그 안에 작성

- style 태그 안에 작성한 코드는 렌더 차단 리소스가 되지 않고 빠르게 해석됨

 

 

방법 3. link ref="preload"

- 뷰포트 화면 안에 있는 내용물을 그리는데 당장 필요한 CSS와 그렇지 않은 CSS가 있음

   (ex. 유저가 특정 행동을 하면 팝업 띄우기, 화면 스크롤 아래쪽에 있는 것)

- 지연하고 싶은 스타일은 <link ref="preload"> 속성으로 병렬 로딩 후 지연 적용

- css 파일만 다운로드 받았다가, 페이지 load가 완료되면 rel 속성을 preload => stylesheet로 변경

 

<style>
/* 필수 스타일 */
</style>
<link rel="preload" as="style" href="x.css"
onload="this.onload=null;this.rel='stylesheet'">

 

 

효과. FCP 시점을 앞당김

- first contentful paint : 첫 번째 내용물이 화면에 그려지는 시점

- CSS 파일이 다운로드 및 해석될 때까지 FCP가 발생하지 않음 => 페이지가 느리다고 느껴짐

-> 방법 1~3을 적용하면 HTML 문서를 해석하면서 CSS도 병행 로딩하므로, FCP 시점을 앞당길 수 있다

 

 

 


요약

1. 웹 브라우저는 외부 JS, CSS 파일을 로딩하고 파싱하는 동안 렌더링 차단 상태를 유지한다.

2. 사용하지 않는 JS, CSS 제거 필요

3. 필수 코드는 페이지 <style>...</style>, <script>...</script>에 작성하기

4. 필수가 아닌 JS는 </body> 종료 직전 위치를 고려. defer, async 속성 사용

5. 필수가 아닌 CSS는 병렬 로딩 (preload)하고 지연 적용 (onload)하기 

 

 

참고 자료

- 패스트캠퍼스 강의 [견고한 UI 설계를 위한 마크업 가이드]

댓글