[HTML] πŸ“ˆμ΅œμ ν™” ν•˜λŠ” 방법

TATAΒ·2023λ…„ 3μ›” 30일
0

HTML

λͺ©λ‘ 보기
5/6

β–· λΈŒλΌμš°μ € 이미지 μ΅œμ ν™”

πŸŒƒ 이미지 μŠ€ν”„λΌμ΄νŠΈ

μ—¬λŸ¬ 개의 이미지λ₯Ό λͺ¨μ•„ ν•˜λ‚˜μ˜ μŠ€ν”„λΌμ΄νŠΈ μ΄λ―Έμ§€λ‘œ λ§Œλ“€κ³ 
CSS의 background-position 속성을 μ‚¬μš©ν•˜μ—¬ μ΄λ―Έμ§€μ˜
일정 λΆ€λΆ„λ§Œ 클래슀 λ“±μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방법이닀.


πŸŒƒ μ•„μ΄μ½˜ 폰트 μ‚¬μš©

Font Awesome
Font Awesomeμ—μ„œ ν‚€νŠΈλ₯Ό html의 head에 λ„£μ–΄μ£Όκ±°λ‚˜,
Reactμ—μ„œλŠ” 직접 μ„€μΉ˜λ₯Ό ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

뢈러온 μ•„μ΄μ½˜μ€ 클래슀λͺ…을 직접 λΆ™μ΄κ±°λ‚˜
Font Awesome이 μ •ν•΄μ€€ 방법을 μ‚¬μš©ν•˜μ—¬ μŠ€νƒ€μΌλ§ ν•΄μ£Όλ©΄ 됨.

// 핡심 νŒ¨ν‚€μ§€ μ„€μΉ˜
npm i --save @fortawesome/fontawesome-svg-core

// μ•„μ΄μ½˜ νŒ¨ν‚€μ§€ μ„€μΉ˜ (ν•΄λ‹Ή μ½”λ“œλŠ” 무료 μ•„μ΄μ½˜λ“€μž…λ‹ˆλ‹€. 유료 μ•„μ΄μ½˜μ„ μ‚¬μš©ν•  경우 μΆ”κ°€λ‘œ μ„€μΉ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.)
npm i --save @fortawesome/free-solid-svg-icons
npm i --save @fortawesome/free-regular-svg-icons
npm i --save @fortawesome/free-brands-svg-icons

// Font Awesome React ꡬ성 μš”μ†Œ μ„€μΉ˜
npm i --save @fortawesome/react-fontawesome@latest

-------
// κ°€μ Έμ˜€κΈ°
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faReact } from '@fortawesome/free-brands-svg-icons'

const element = <FontAwesomeIcon icon={faReact} />

Boxicons
λ‘œκ·ΈμΈμ„ ν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•  수 μžˆλŠ” Boxicons도 μžˆλ‹€.


πŸŒƒ WebP λ˜λŠ” AVIF 이미지 포맷

// picture: img μš”μ†Œμ˜ 닀쀑 이미지 λ¦¬μ†ŒμŠ€λ₯Ό μœ„ν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
// λ§Œμ•½ μ ‘μ†ν•œ λΈŒλΌμš°μ €μ—μ„œ <source>νƒœκ·Έ λ‚΄μ˜ srcset에 μ •μ˜ν•œ
// WebP 포맷을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•΄λ‹Ή <source> νƒœκ·ΈλŠ” λ¬΄μ‹œλœλ‹€.
<picture>
  <source srcset="logo.webp" type="image/webp">
  <img src="logo.png" alt="logo">
</picture>

β–· CDN μ‚¬μš©

Content Delivery Network

인터넷 μ‚¬μš©μžλ“€μ—κ²Œ μ›Ή μ½˜ν…μΈ λ₯Ό λΉ λ₯΄κ²Œ μ œκ³΅ν•˜κΈ° μœ„ν•œ κΈ°μˆ μ΄λ‹€.
(μ›Ή μ‚¬μ΄νŠΈ 속도와 μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚€κ³ , μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ¨)

CDN은 세계 곳곳에 λΆ„ν¬ν•œ λΆ„μ‚°λœ μ„œλ²„μ— μ½˜ν…μΈ λ₯Ό μ €μž₯ν•˜κ³  μžˆλ‹€.
μœ μ €κ°€ κ°€κΉŒμš΄ 곳에 μœ„μΉ˜ν•œ 데이터 μ„Όν„°(μ„œλ²„)의 데이터λ₯Ό κ°€μ Έμ˜€κΈ°μ—
데이터가 μ „λ‹¬λ˜κΈ° μœ„ν•΄ κ±°μ³μ•Όν•˜λŠ” μ„œλ²„μ˜ 갯수λ₯Ό 크게 쀄여 λ‘œλ”© 속도가 빨라진닀.

λŒ€ν‘œμ μΈ CDN μ„œλΉ„μŠ€λ‘œλŠ” Amazon CloudFront, Akamai, Cloudflare, Fastly 등이 μžˆλ‹€.


β–· μΊμ‹œ

μΊμ‹œ 유효 μ‹œκ°„μ€ μ§€λ‚¬μ§€λ§Œ, μ„œλ²„μ—μ„œ λ‹€μ‹œ 받아와야 ν•˜λŠ” 파일이 μΊμ‹œμ— μ €μž₯λ˜μ–΄ μžˆλŠ” 파일과 μ™„μ „νžˆ λ™μΌν•œ 경우라면? ꡳ이 λ˜‘κ°™μ€ νŒŒμΌμ„ λ‹€μ‹œ λ°›μ•„μ˜¬ ν•„μš” 없이, μ„œλ²„μ˜ 파일과 μΊμ‹œμ˜ 파일이 λ™μΌν•œμ§€ ν™•μΈν•΄μ„œ μž¬μ‚¬μš©ν•  수 μžˆλŠ” HTTP 헀더인 μΊμ‹œ 검증 헀더와 쑰건뢀 μš”μ²­ 헀더가 μ‘΄μž¬ν•œλ‹€.

πŸ’΄ μΊμ‹œ 검증 헀더

μΊμ‹œμ— μ €μž₯된 데이터와 μ„œλ²„μ˜ 데이터가
λ™μΌν•œμ§€ ν™•μΈν•˜κΈ° μœ„ν•œ 정보λ₯Ό 담은 응닡 헀더이닀.

Last-Modified
데이터가 λ§ˆμ§€λ§‰μœΌλ‘œ μˆ˜μ •λœ μ‹œμ μ„ μ˜λ―Έν•˜λŠ” 응닡 ν—€λ”λ‘œ,
쑰건뢀 μš”μ²­ 헀더인 If-Modified-Since 와 λ¬Άμ–΄μ„œ μ‚¬μš©ν•œλ‹€.

Etag
λ°μ΄ν„°μ˜ 버전을 μ˜λ―Έν•˜λŠ” 응닡 ν—€λ”λ‘œ,
쑰건뢀 μš”μ²­ 헀더인 If-None-Match 와 λ¬Άμ–΄μ„œ μ‚¬μš©ν•œλ‹€.

πŸ’΄ 쑰건뢀 μš”μ²­ 헀더

μΊμ‹œμ˜ 데이터와 μ„œλ²„μ˜ 데이터가 λ™μΌν•˜λ‹€λ©΄
μž¬μ‚¬μš©ν•˜κ²Œ ν•΄λ‹¬λΌλŠ” 의미의 μš”μ²­ 헀더이닀.

If-Modified-Since
μΊμ‹œλœ λ¦¬μ†ŒμŠ€μ˜ Last-Modified κ°’ 이후에 μ„œλ²„ λ¦¬μ†ŒμŠ€κ°€
μˆ˜μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³ , μˆ˜μ •λ˜μ§€ μ•Šμ•˜λ‹€λ©΄ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.

If-None-Match
μΊμ‹œλœ λ¦¬μ†ŒμŠ€μ˜ ETag κ°’κ³Ό ν˜„μž¬ μ„œλ²„ λ¦¬μ†ŒμŠ€μ˜
ETag 값이 같은지 ν™•μΈν•˜κ³ , κ°™μœΌλ©΄ μΊμ‹œλœ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.


β–· νŠΈλ¦¬μ‰μ΄ν‚Ή

πŸ₯› import

import React from 'react' κ°€ μ•„λ‹ˆλΌ
import { useState, useEffect } from 'react'둜 ν•„μš”ν•œ κ²ƒλ§Œ 뽑아 μ“°κΈ°

πŸ₯› Babelrc

// Babel은 κ΅¬ν˜• λΈŒλΌμš°μ €μ—μ„œλ„ ν˜Έν™˜μ΄ κ°€λŠ₯ν•˜λ„λ‘ ES5 λ¬Έλ²•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž„.
// ES5문법은 importλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ•„μ„œ require둜 λ³€κ²½μ‹œν‚΄.
// But, requireλŠ” export λ˜λŠ” λͺ¨λ“  λͺ¨λ“ˆμ„ 뢈러옴.
// 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ›ΉνŒ© μ„€μ • μ‹œ μ•„λž˜μ²˜λŸΌ μ„€μ •ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.
{
  β€œpresets”: [[β€œ@babel/preset-env”, { "modules": false }]]
   // 이제 importκ°€ require둜 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.
}

πŸ₯› sideEffects

μ›ΉνŒ©μ€ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μΌμœΌν‚¬ 수 μžˆλŠ” μ½”λ“œμ˜ 경우,
μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλΌλ„ νŠΈλ¦¬μ‰μ΄ν‚Ή λŒ€μƒμ—μ„œ μ œμ™Έ μ‹œν‚¨λ‹€.

μ•„λž˜μ²˜λŸΌ μ„€μ •ν•˜λ©΄ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ‹ˆ
μ½”λ“œλ₯Ό μ œμ™Έν•΄λ„ λœλ‹€λŠ” 것을 μ›ΉνŒ©μ—κ²Œ μ•Œλ €μ€„ 수 μžˆλ‹€.

/* package.json */
{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": false
}

-------λ˜λŠ”
// νŠΉμ • νŒŒμΌμ—μ„œλŠ” λ°œμƒν•˜μ§€ μ•Šμ„ κ²ƒμž„μ„ μ•Œλ €μ€„ 수 μžˆλ‹€.
{
  "name": "tree-shaking",
  "version": "1.0.0",
  "sideEffects": ["./src/components/NoSideEffect.js"]
}

β–· Lighthouse

λ‹€μ–‘ν•œ μ§€ν‘œλ₯Ό μ΄μš©ν•΄ μ›ΉνŽ˜μ΄μ§€μ˜
μ„±λŠ₯ 검사λ₯Ό ν•΄μ£Όλ©°, 그에 λŒ€ν•œ κ°œμ„ μ±…λ„ μ œκ³΅ν•΄ μ€€λ‹€.

개발자 λ„κ΅¬μ—μ„œ 확인 ν•  수 있으며,
Node CLIμ—μ„œλ„ 싀행이 κ°€λŠ₯ν•˜λ‹€.

Lighthouse λ…Έλ“œλͺ¨λ“ˆμ„ μ΄μš©ν•΄ λ™μ μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°ν•˜μ—¬
νŽ˜μ΄μ§€ 검사 리포트λ₯Ό 생성할 μˆ˜λ„ μžˆλ‹€. (μ„±λŠ₯ ν…ŒμŠ€νŠΈ μžλ™ν™” κ°€λŠ₯)

// μ „μ—­ λͺ¨λ“ˆλ‘œ μ„€μΉ˜
npm install -g lighthouse

// 검사λ₯Ό μ‹€ν–‰
lighthouse <url>
  
// λͺ¨λ“  μ˜΅μ…˜μ„ λ³Ό 수 μžˆλ‹€.
lighthouse --help 

πŸ” 뢄석 κ²°κ³Ό ν•­λͺ©

Performance - μ›Ή μ„±λŠ₯을 μΈ‘μ •
화면에 μ½˜ν…μΈ κ°€ ν‘œμ‹œλ˜λŠ”λ° μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ κ±Έλ¦¬λŠ”μ§€,
ν‘œμ‹œλœ ν›„ μ‚¬μš©μžμ™€ μƒν˜Έμž‘μš©ν•˜κΈ° κΉŒμ§„ μ–Όλ§ˆλ‚˜ κ±Έλ¦¬λŠ”μ§€,
화면에 λΆˆμ•ˆμ •ν•œ μš”μ†ŒλŠ” μ—†λŠ”μ§€ 등을 ν™•μΈν•œλ‹€.

Accessibility - μ›Ή 접근성을 잘 κ°–μΆ”κ³  μžˆλŠ”μ§€ 확인
λŒ€μ²΄ ν…μŠ€νŠΈλ₯Ό 잘 μž‘μ„±ν–ˆλŠ”μ§€,
배경색과 μ½˜ν…μΈ  μƒ‰μƒμ˜ λŒ€λΉ„κ°€ μΆ©λΆ„ν•œμ§€,
μ μ ˆν•œ WAI-ARIA 속성을 μ‚¬μš©ν–ˆλŠ”μ§€ 등을 ν™•μΈν•œλ‹€.

Best Practices - μ›Ή ν‘œμ€€ λͺ¨λ²” 사둀λ₯Ό 잘 λ”°λ₯΄κ³  μžˆλŠ”μ§€ 확인
HTTPS ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λŠ”μ§€,
μ‚¬μš©μžκ°€ 확인할 ν™•λ₯ μ€ 높지 μ•Šμ§€λ§Œ
μ½˜μ†” 창에 였λ₯˜κ°€ ν‘œμ‹œ λ˜μ§€λŠ” μ•ŠλŠ”μ§€ 등을 확인

SEO - 검색 엔진 μ΅œμ ν™” 확인
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ robots.txtκ°€ μœ νš¨ν•œμ§€,
meta μš”μ†ŒλŠ” 잘 μž‘μ„±λ˜μ–΄ μžˆλŠ”μ§€,
ν…μŠ€νŠΈ 크기가 읽기에 무리가 μ—†λŠ”μ§€ 등을 ν™•μΈν•œλ‹€.

PWA (Progressive Web App) - λͺ¨λ°”일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œμ„œλ„ 잘 μž‘λ™ν•˜λŠ”μ§€ 확인
μ•± μ•„μ΄μ½˜μ„ μ œκ³΅ν•˜λŠ”μ§€, μŠ€ν”Œλž˜μ‹œ 화면이 μžˆλŠ”μ§€,
ν™”λ©΄ 크기에 맞게 μ½˜ν…μΈ λ₯Ό μ μ ˆν•˜κ²Œ λ°°μΉ˜ν–ˆλŠ”μ§€ 등을
μ μˆ˜κ°€ μ•„λ‹Œ 체크리슀트둜 ν™•μΈν•œλ‹€.


πŸ” Performance μΈ‘μ • λ©”νŠΈλ¦­

profile
🐾

0개의 λŒ“κΈ€