📖 Reference
📎https://boxfoxs.tistory.com/408
📎https://velog.io/@bumsu0211/브라우저-렌더링-과정과-최적화
사용자 경험 이다.시각적인 측면도 웹의 첫인상일 수 있지만, 응답성 측면의 첫인상도 있다.
만약, 페이지 로딩이 길어서 사용자가 3초 이상 아무것도 없는 화면을 보게된다면?.. → 바로 페이지 나가기.
구글에서 제공하는 페이지 속도 측정 사이트에서 원하는 페이지의 최적화 점수 를 알아낼 수 있다.
이때, 크롬 확장 프로그램인 Light House 에서도 최적화 점수 측정이 가능하다.
→ Google Speed Insight가 Light House 를 내부적으로 사용한다.
📎PageSpeed Insights
📎Lighthouse | Tools for Web Developers | Google Developers


1.8sec 이내에 FCP가 수행되어야 GOOD 으로 좋은 점수를 받는다.3sec 이상 FCP가 수행되면 개선이 필요한 페이지임을 알 수 있다. → 사용자가 3초동안 아무런 화면도 볼 수 없는 상태를 뜻한다.텍스트 일 가능성이 크다.
위 사진과 같이 각각의 폰트 또한 하나의 모듈(Module) 이기에 다운로드 시간을 가진다.
만약 다운로드되는 폰트의 파일 용량이 크다면 다운로드 시간은 길어질 것이며 최종적으로 사용자는 폰트가 적용된 텍스트를 보기까지의 시간이 더 소요된다.
이를 해결하기 위해 FOUT(Flash of Unstyled Text) 방식을 사용하거나 웹 폰트 포맷인 woff2 , woff , eot , ttf 등을 사용한다.
웹 폰트 를 적용해본 경험이 있다면 @font-face 를 사용해본 경험이 있을 것이다.웹 폰트 는 대표적으로 woff2 , woff , eot , ttf 등의 형식이 존재하며, 각각의 포맷은 압축 방식이 달라 파일 용량이 다르다.@font-face {
font-family: NanumSquareRound;
src: local("NanumSquareRound"),
local("NanumSquareRound"),
url(NanumSquareRound.woff2),
url(NanumSquareRound.woff),
url(NanumSquareRound.eot),
url(NanumSquareRound.ttf);
font-weight: bold;
}


woff2 형식을 지원한다.IE 에서는 그 다음으로 압축율이 좋은 woff 형식을 지원한다. → 즉, 대부분의 브라우저는 woff 와 woff2 형식의 폰트 파일만으로도 충분히 커버할 수 있다.IE 에서 woff2 , woff 폰트 파일이 2가지 존재한다면 woff2 를 다운로드 후 폴백(fallback)한 뒤 woff 파일을 사용한다.FOUT(Falsh Of Unstyled Text) 가 뭐지?
위 사진을 보면 폰트가 제대로 불러와지지 않아 잘못된 정보를 사용자에게 전달하고 있음을 알 수 있다.
웹 폰트의 문제는 폰트가 다운로드되기 전 텍스트를 표시하지 않으면 사용자에게 잘못된 정보를 전달할 수 있다는 것이다.

CSSOM 트리 를 만드는 과정에서 CSS 파일에 포함된 웹 폰트 모듈을 다운로드 받기 시작한다.Paint 단계에서 웹 폰트 모듈이 다운로드되지 않은 경우 화면에 그리는 것을 차단한다. → 따라서, 웹 폰트가 적용된 텍스트가 사용자에게 보이지 않는 순간이 존재하게 된다.
FOIT(Flash Of Invisible Text): 폰트파일이 다운로드되기 전에 텍스트가 보이지 않고, 다운로드 후에 번쩍이듯이 텍스트가 등장
FOUT(Flash Of Unstyled Text): 폰트파일이 다운로드 되기 전에는기본 폰트로 텍스트가 표시되다가 다운로드가 완료되면 해당 폰트로 변경
크롬(Chrome) 은 기본적으로 FOIT 방식을 사용한다. ← 사용자 경험(UX) 관점에서는 좋지 않음.
→ FOUT(Flash Of Unstyled Text) 방식 권장
FOUT 방식 설정@font-face{
...
***font-display: swap;***
font-weight: bold;
}
font-display: swap 속성을 사용하여 텍스트들을 FOUT 방식으로 렌더링 할 수 있다. 즉, 기본 텍스트를 빠르게 출력시켜 FCP 시간을 단축하기 위해 적용할 수 있음.

TTI(Time to Interactive) 이란 ? → 페이지가 완전히 상호작용할 준비를 마치기까지 걸린 시간Idle Window 시간 이내에 존재하는 Last Long-Task 가 끝나는 시간을 측정한다.Idle Window = CPU Idle & Network IdleCPU Idle = 메인 스레드에 작업이 존재하지 않는 짧은 시간Network Idle = 2개 이하의 네트워크 요청(Request)이 존재하는 시간JavaScript 를 통해 이뤄지므로, Last Long-Task 가 끝나면 상호작용 준비가 되었다고 간주한다.
TBT(Total Blocking Time) : 메인 스레드가 차단된 시간의 총합SI(Speed Index) : 페이지 콘텐츠가 채워지는 속도LCP(Largest Contentful Paint) : 페이지 로드 시점부터 첫 화면 영역 내의 가장 큰 이미지나 텍스트 블록이 렌더링될 때까지의 시간CLS(Cumulative Layout Shift) : 페이지 수명 동안 발생하는 모든 예기치 않은 레이아웃 변화에 점수를 매겨 특정위와 같이 다양한 브라우저 최적화 측정 기준이 존재한다. 자세한 내용은 아래를 참고하자.
📎 https://velog.io/@bumsu0211/브라우저-렌더링-과정과-최적화
화면을 띄우기까지 걸리는 시간=필요한 파일 다운로드 시간+브라우저에 화면을 그리는 시간
- 만약,
파일 다운로드에 초점을 맞춰 브라우저 최적화를 진행하고자 하면 다음과 같이 진행한다.
- 파일의 용량을 줄인다.
- 한 도메인에서 다운로드 받는 파일의 개수를 많이 늘리지 않는다.
- 초기 화면에 필요한 파일만 다운로드 받거나 지연시킨다.
- 여러 페이지에 걸쳐 사용되는 파일을 캐싱한다.
- 이미지 다운로드를 뒤로 미뤄 CSS, JS 파일을 더 빨리 다운로드 시킨다.
모듈 번들링 을 통한 파일 개수를 감소한다.자세한 사항은 아래에서 확인한다.
WebPack, Babel
<img loading="lazy" src="..."/>
WebP는 구글에서 개발한 이미지 포맷WebP 는 인터넷에서 흔히 쓰이는 GIF , JPG , PNG 포맷을 대체하기 위해 개발WebP 의 가장 큰 강점은 이미지 품질이 같을 때 WebP 파일의 크기가 다른 포맷의 파일에 비해 훨씬 작다는 것이다.GIF 와 같은 애니메이션 이미지의 경우 GIF 파일을 WebP 파일로 바꾸면 이미지 품질은 유지하며 파일 크기는 절반 이하로 줄일 수 있다.

크롬(Chrome), 엣지(Edge) , 사파리(Safari) 등 대부분의 웹 브라우저에서 WebP 포맷으로 구성된 이미지를 볼 수 있다.<img src="some-image.webp" onerror="this.src='some-image.png'"/>
const Home = () => import('/Home.vue');
const About = () => import('/About.vue');
const Contact = () => import('/Contact.vue');
const routes = [
{ path : '/', name: 'home', component: Home },
{ path : '/about', name: 'about', component: About },
{ path : '/contact', name: 'contact', component: Contact },
]

브라우저 캐싱(Browser Caching)에 대한 자세한 설명은 여기