웹 개발에서 말하는 최적화란 주어진 조건 아래에서 최대한 빠르게 화면을 표시하는 것을 말하며 프론트엔드 웹 개발 중에서 할 수 있는 최적화 방법이다.
자식요소가 많을수록 DOM트리의 복잡도는 커지며 계산해야 할 것도 많아지기 때문에 불필요하게 깊이를 증가시키는 요소는 삭제하는 것이 좋다.
인라인 스타일은 리플로우를 계속 발생시켜 렌더링 완료 시점을 늦추기 때문에 CSS 파일을 따로 작성하는 것이 좋다.
불필요한 CSS 코드가 있다면 CSSOM 트리의 완성이 늦기 때문에 사용하지 않는 CSS 코드가 있다면 제거하는 것이 좋다.
셀렉터가 복잡할수록 스타일 계산과 레이아웃에 시간을 더 많이 소모하기에 최대한 간결한 CSS 셀렉터를 사용하는 것이 좋다
이미지 스프라이트는 여러 개의 이미지를 모아 하나의 스프라이트 이미지를 만들고 CSS의 background-position 속성을 사용해 이미지의 일정 부분만 클래스 등으로 구분하여 사용하는 방법을 말한다.
이미지 최적화를 위해 전통적으로 사용하는 JPEG 또는 PNG 형식이 아닌 새롭게 등장한 이미지 포맷인 WebP 또는 AVIF를 사용하여 용량을 더욱 감소시킬 수 있다.
CDN은 유저가 가까운 곳에 위치한 데이터 센터(서버)의 데이터를 가져온다. 그러므로 데이터가 전달되기 위해 거쳐야하는 서버의 갯수가 크게 줄기 때문에 로딩 속도가 빨라진다.
캐시(Cache)는 다운로드 받은 데이터나 값을 미리 복사해 놓는 임시 장소를 뜻하며, 데이터에 접근하는 시간이 오래 걸리는 경우나 값을 다시 계산하는 시간을 절약하고 싶은 경우에 사용한다.
트리쉐이킹(Tree Shaking)은 나무를 흔들어 잔가지를 털어내듯이 불필요한 코드를 제거하는 행위를 말한다.
JavaScript 파일 크기의 증가, 요청 횟수의 증가는 그만큼 파일이 오고 가는 동안 화면 표시가 늦어진다는 것을 뜻하고, 네트워크 속도가 느린 환경에서는 더 큰 병목현상을 유발하기 때문에 트리쉐이킹을 통해 파일 크기를 가능한 줄이는 것이 최적화에 도움된다.
JavaScript 파일의 실행은 CPU에 크게 영향을 받는데, 그렇다 보니 사양이 천차만별인 모바일 환경에서 그 영향이 더욱 두드러진다. 기기 환경에 따라서 2.9초의 몇 배의 시간을 파일 실행에만 사용한다면 이탈률은 그만큼 커질 수 있기 때문에 이러한 상황을 최대한 줄이기 위해서라도 트리쉐이킹을 통한 최적화가 필요하다.
import 해올 때 아래와 같이 실제로 사용할 코드만 불러와 주기!
import { useState, useEffect } from 'react'
Babel은 자바스크립트 문법이 구형 브라우저에서도 호환이 가능하도록 ES5 문법으로 변환하는 라이브러이다. 이 때 ES5문법은 import를 지원하지 않기 때문에 commonJS 문법의 require로 변경시키는데, 이 과정은 트리쉐이킹에 큰 걸림돌이 되기 때문에 Barbelrc 파일에 다음과 같은 코드를 작성해주면 ES5로 변환하는 것을 막을 수 있습니다.
{
“presets”: [
[
“@babel/preset-env”,
{
"modules": false
}
]
]
}
웹팩은 사이드 이펙트를 일으킬 수 있는 코드의 경우, 사용하지 않는 코드라도 트리쉐이킹 대상에서 제외시키기 때문에 package.json 파일에서 sideEffects를 설정하여 사이드 이펙트가 생기지 않을 것이므로 코드를 제외시켜도 됨을 웹팩에게 알려줄 수 있다.
{
"name": "tree-shaking",
"version": "1.0.0",
"sideEffects": false
}