Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FE] feat : 폰트 preload 적용 #605

Merged
merged 6 commits into from
Sep 12, 2024
Merged

[FE] feat : 폰트 preload 적용 #605

merged 6 commits into from
Sep 12, 2024

Conversation

BadaHertz52
Copy link
Contributor

@BadaHertz52 BadaHertz52 commented Sep 12, 2024


🚀 어떤 기능을 구현했나요 ?

  • 구글 폰트에 preload를 적용해, 로딩 속도를 개선했어요.
  • pretendard 폰트는 가변 다이나믹 서브셋(Variable Dynamic Subsetting)로 변경해 폰트 파일 크기를 줄이고 preload를 함께 적용해 로딩 속도를 개선했어요.

pretendard 폰트에 가변 다이나믹 서브셋을 적용한 이유?

기존 코드

 <link rel="stylesheet" type="text/css"
    href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />

기존에 했던 코드로는 rel에 preload를 사용하면 css만 받고, css 안의 pretendard 글꼴을 받지 못했어요.
pretendard 를 preload하는 방법을 찾다가 가변 다이나믹 서브셋을 사용하면 preload되고 폰트 파일 용량도 작아지는 진다는 것을 알게되었어요. 적용해보니, 로드 속도와 용량 측면에서 개선이 있다는 것을 확인했어요.

🔥 어떻게 해결했나요 ?

waterfull 비교

  • 아주 미세하게 로딩 속도가 빨라 빨라짐
    개선 전
    image

개선 후
image

pretendard

개선 전
스크린샷 2024-09-12 143639
개선 후
스크린샷 2024-09-12 152548

  • 폰트 총 리소스 용량 감소 : 2.4 MB ->209 kB
  • 가변 다이나믹 서브셋으로 변경되면서 폰트 파일이 여러개로 나뉘었고, 개별 파일 용량과 총 용량이 줄어들었어요.
  • 리뷰미 서비스에서 지원하는 브라우저 내에서 모두 가변 다이나믹 서브셋을 지원해요.

📝 어떤 부분에 집중해서 리뷰해야 할까요?

📚 참고 자료, 할 말

가변 다이나믹 서브셋 vs 다이나믹 서브셋

다이나믹 서브셋: 웹 페이지에서 사용되는 글리프만 포함된 폰트 파일을 동적으로 생성하여 용량을 줄이는 방식.
가변 다이나믹 서브셋: 다이나믹 서브셋과 가변 폰트를 결합하여, 하나의 폰트 파일에 다양한 스타일(굵기, 너비 등)을 포함하면서 필요한 글리프만 동적으로 불러오는 방식.

🚨 build 시 BundleAnalyzerPlugin 실행되면 CI 빌드 속도가 너~무 느려요!!!

build시 (=production 모드)에서 BundleAnalyzerPlugin가 실행되도록 했는데, CI에서 이 부분에 의해 CI 시간이 10분을 넘어서도 끝나지 않는 오류가 있었어요. 아마 BundleAnalyzerPlugin이 실행되면서 분석 결과 페이지를 실행하는 부분으로 인한 오류지 않을까해요. 그레서 BundleAnalyzerPlugin 부분을 우선 주석처리했어요. 성능 개선이 끝나면 BundleAnalyzerPlugin 플러그인을 삭제해야할 것 같네요.

- dev 모드가 아닌 prod 모드에서 실행하도록 수정
- 변경 사유 :rel이 preload인 link, stylesheet인 link가 두 개 같이 존재해서 헷갈림
- 변경 방법 : onload="this.onload=null;this.rel='stylesheet'" 사용
Copy link
Contributor

@soosoo22 soosoo22 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

바다, 에프이 수고했어요!!!

@@ -10,7 +10,7 @@ const globalStyles = css`
}

body {
font-family: 'Pretendard', 'Noto Sans', sans-serif;
font-family: 'Pretendard Variable', 'Noto Sans', sans-serif;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오! 다시 추가가 되었네요!

Copy link
Contributor

@ImxYJL ImxYJL left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

번거로운 폰트 작업하느라 수고 많았어요~~~


<link rel="preload" href="https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap"
as="style" />
<link rel="preload" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/variable/pretendardvariable-dynamic-subset.css" onload="this.onload=null;this.rel='stylesheet'" />
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

실행 순서

Preload (미리 로드)

는 CSS 파일을 미리 로드하겠다는 의미입니다. 브라우저에게 해당 파일이 나중에 필요할 것이라고 미리 알려서, 브라우저가 해당 파일을 미리 다운로드하게끔 합니다. 하지만 preload는 파일을 가져오기만 할 뿐, 그 파일을 실제로 적용하지는 않습니다.

onload 후 rel을 'stylesheet'로 변경

onload="this.onload=null;this.rel='stylesheet'"는 CSS 파일이 완전히 로드된 후에 실행됩니다.
이 코드의 역할은 로드가 끝나면 rel="preload"를 rel="stylesheet"로 바꿔서, CSS 파일이 실제로 웹 페이지에 적용되도록 합니다.

중복 실행 방지

this.onload=null는 onload 이벤트 핸들러를 한번 실행한 후 제거하는 역할을 합니다. 이렇게 하면 이벤트가 다시 실행되지 않도록 막을 수 있습니다.

@BadaHertz52 BadaHertz52 changed the title [FE] feat 폰트 preload 적용 [FE] feat : 폰트 preload 적용 Sep 12, 2024
Copy link
Contributor

@chysis chysis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아자잣 아직은 100% 이해가 안 되는 부분이 있으나 천천히 공부해보도록 해요...

@chysis chysis merged commit d134c0b into develop Sep 12, 2024
5 checks passed
@BadaHertz52 BadaHertz52 deleted the fe/feat/602-font_preload branch September 13, 2024 06:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[FE] 폰트에 preload를 적용한다.
4 participants