πŸ‘¨‍πŸ’»κ°œλ°œ/🌐Front-End

[CSS] μ›Ή 폰트 λ‘œλ”©μ„ 더 λΉ λ₯΄κ²Œ ν•˜λŠ” 방법

kimtongting μž…λ‹ˆλ‹€ 2023. 6. 9. 11:16

 

 

 

κ°œμš”

* μ›μΈνŒŒμ•…-첫 ν™”λ©΄(λŒ€μ‹œλ³΄λ“œ) μ§„μž… μ‹œ 느림

무렀 3.5μ΄ˆλ™μ•ˆ Font λ₯Ό κ°€μ Έμ˜΄

πŸ“μ‹œμž‘μ€ 이렇닀. '우리 μ‚¬μ΄νŠΈκ°€ λ„ˆλ¬΄ λŠλ €μš”.. μ–΄λ–»κ²Œ κ°œμ„ μ•ˆλ κΉŒμš”?' λΌλŠ” 말을 λ“£κ³  μ‚¬μ΄νŠΈλ₯Ό λ“€μ–΄κ°€λ΄€λ‹€.

세상에.. μ‚¬μš©μž κ²½ν—˜μ΄ 미처 μŒ“μ΄κΈ°λ„ 전에 λ‚˜μ‘°μ°¨λ„ μ΄νƒˆν•˜κ³  싢은 μ†λ„μ˜€λ‹€.

 

DevTools 둜 λ„€νŠΈμ›Œν¬ μ‘°νšŒν•΄λ³΄λ‹ˆ μ‚¬μ΄νŠΈ μ§„μž… μ‹œ, Font에 λŒ€ν•œ CSS νŒŒμΌμ„ λΆˆλŸ¬μ˜€λŠ”λ° κ½€λ‚˜ 큰 λͺ«μ„ ν•˜κ³  μžˆμ—ˆλ‹€.

원인

원인은 Font! κ΅¬κΈ€μ—μ„œ fonts λ₯Ό λΆˆλŸ¬μ˜€λŠ” κ³³μ—μ„œ 큰 Delay κ°€ μžˆμ—ˆλŠ”λ°, λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ μš”μ²­κ³Ό ν•¨κ»˜ μ—„μ²­ λ§Žμ€ font λ₯Ό 뢈러였고 μžˆμ—ˆλ‹€.

μ„œλ²„μ˜ κ²½λŸ‰ν™”λ₯Ό μœ„ν•΄μ„œμΈμ§€(μΆ”μΈ‘) Google fonts λ₯Ό 직접 ν˜ΈμΆœν•˜κ³  μžˆμ—ˆλŠ”λ° 심지어 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” font 듀도 μ„ μ–Έν•˜μ—¬ ν˜ΈμΆœμ€‘μ΄μ—ˆλ‹€.. (이런.. cdn μ„œλ²„κ°€ κ°€κΉŒμš΄μ§€λ„ λͺ¨λ₯΄λŠ”데..?)

 

λ‹€ν–‰νžˆ CSS Font 에 λŒ€ν•œ 속도 μ΄μŠˆλŠ” 과거에도 κ²½ν—˜ν•œ 적이 μžˆμ—ˆλŠ”λ°, μ•„λž˜ λ‚΄μš©μ„ 톡해 ν•΄κ²°ν–ˆλ‹€.

μ΄λ²ˆμ—λŠ” κΌ­ 기둝해야지..

  • λ¦¬μ†ŒμŠ€μ˜ Local ν™”
  • λͺ¨λ˜ 파일 포맷 μ‚¬μš©
  • font-display μ‚¬μš©
  • FOIT/FOUT μ‚¬μš©
  • CSS의 preload

쑰치

λ¦¬μ†ŒμŠ€μ˜ Local ν™”

λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€μ˜ μ™ΈλΆ€ ν˜ΈμΆœμ„ λ§‰κΈ°μœ„ν•΄(λ„€νŠΈμ›Œν¬ 이슈둜 μΈν•œ 지연을 μ—†μ• κΈ° μœ„ν•΄) font νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ λ°›μ•„ ν”„λ‘œμ νŠΈμ— resources/fonts/ 디렉토리λ₯Ό λ§Œλ“€μ–΄ μΆ”κ°€ν•˜μ˜€λ‹€.

λͺ¨λ˜ 파일 포맷 μ‚¬μš©

μ›Ήν°νŠΈ ν™•μž₯자 μ’…λ₯˜

  • EOT: IE8 μ΄ν•˜μΌ 경우 μ‚¬μš©
  • TTF: κ΅¬ν˜• μ•ˆλ“œλ‘œμ΄λ“œ 버전(4.4)λ₯Ό μ§€μ›ν•˜λŠ” κ²½μš°μ— μ‚¬μš©
  • WOFF: λŒ€λΆ€λΆ„μ˜ λͺ¨λ˜ λΈŒλΌμš°μ €μ—μ„œ 지원
  • WOFF2: WOFF보닀 μ••μΆ•λ₯ μ΄ 30% 정도 더 μ’‹λ‹€.

λŒ€ν‘œμ μΈ IE 의 Font Support

 

font-display (FOIT/FOUT)μ‚¬μš©

FOIT(Flash of Invisible Text)

λΈŒλΌμš°μ €κ°€ 폰트λ₯Ό λ‹€μš΄λ‘œλ“œ ν•˜κΈ° 전에 ν°νŠΈκ°€ 보이지 μ•Šλ„λ‘ μ„€μ •

FOUT(Flash of Unstyled Text)

λΈŒλΌμš°μ €κ°€ 폰트λ₯Ό λ‹€μš΄λ‘œλ“œ ν•˜κΈ° 전에 ν°νŠΈκ°€ μ μš©λ˜μ§€ μ•Šμ€ κΈ€μžκ°€ 보이도둝 μ„€μ •

ν•΄κ²°

1. 일단 λΆˆν•„μš”ν•œ λ¦¬μ†ŒμŠ€ 호좜 제거 - @font-face 의 cdn μ™ΈλΆ€ν˜ΈμΆœμ„  local ν™”

2. ν™•μž₯자λ₯Ό ν•˜λ‚˜λ‘œ 쀄여 Fail μΌ€μ΄μŠ€λ₯Ό κ°•μ œ - IE11 지원을 λ°°μ œν•˜λŠ” κ²ƒμœΌλ‘œ 'woff2' λ§Œμ„ μ‚¬μš©ν•˜κΈ°λ‘œ Rule μ„€μ •

3. FOUT 으둜 무쑰건 κΈ€μžκ°€ 보이게 μ„€μ • (λ‘œλ”©μ΄λΌλ„ 보이지 μ•ŠλŠ” 것은 말이 μ•ˆλœλ‹€κ³  μƒκ°λ˜μ–΄ μ„€μ •)

4. css의 min 처리 - νŽΌμ³μ§„ CSSλ₯Ό 1row둜 쀄여, 퍼포먼슀 ν–₯상을 μ§„ν–‰ν–ˆλ‹€.

5. Local CSS function μ‚¬μš© - src 에 local function 을 λͺ…μ‹œν•˜λ©΄, λ¦¬μ†ŒμŠ€λ₯Ό λ”°λ‘œ μš”μ²­ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

/* fonts.gstatic.com/~~ 경둜λ₯Ό 둜컬둜 μˆ˜μ •*/
@font-face {
  font-family: 'Noto Sans KR';
  font-style: normal;
  font-weight: 100;
  src: local('Noto Sans KR'), url(/font/NotoSansKR-Thin.woff2) format('woff2'),
  url(/font/NotoSansKR-Thin.otf) format('opentype');
  font-display: swap;
}

@font-face {
  font-family: 'Noto Sans KR';
  font-style: normal;
  font-weight: 300;
  src: local('Noto Sans KR'),url(/font/NotoSansKR-Light.woff2) format('woff2'),
  url(/font/NotoSansKR-Light.otf) format('opentype');
  font-display: swap;
}

@font-face {
  font-family: 'Noto Sans KR';
  font-style: normal;
  font-weight: 400;
  src: local('Noto Sans KR'),url(/font/NotoSansKR-Regular.woff2) format('woff2'),
  url(/font/NotoSansKR-Regular.otf) format('opentype');
  font-display: swap;
}

@font-face {
  font-family: 'Noto Sans KR';
  font-style: normal;
  font-weight: 500;
  src: local('Noto Sans KR'),url(/font/NotoSansKR-Medium.woff2);
  font-display: swap;
}

@font-face {
  font-family: 'Noto Sans KR';
  font-style: normal;
  font-weight: 700;
  src: local('Noto Sans KR'),url(/font/NotoSansKR-Bold.woff2) format('woff2'),
  url(/font/NotoSansKR-Bold.otf) format('opentype');
  font-display: swap;
}

@font-face {
  font-family: 'Noto Sans KR';
  font-style: normal;
  font-weight: 900;
  src: local('Noto Sans KR'),url(/font/NotoSansKR-Black.woff2) format('woff2'),
  url(/font/NotoSansKR-Black.otf) format('opentype');
  font-display: swap;
}

 

 

λ°˜μ‘ν˜•