Optimization μ΅μ ν
π₯Ά μ΅μ ν, optimization
- μ£Όμ΄μ§ μν©μμ μνλ κ°μ₯ μλ§μ κ²°κ³Όλ₯Ό μ»μ μ μλλ‘ μ²λ¦¬νλ κ³Όμ .
- μ΅μ νλ νμ©λ μμμ νκ³ λ΄μμ μ£Όμ΄μ§ μꡬμ¬νμ λ§μ‘±μν€λ©΄μ μ΅μ μ κ²°κ³Όλ₯Ό μ»λ κ³Όμ μ΄λ€.
μ»΄ν¨ν° 곡νμμμ μ΅μ ν :
μ΅μνμ 리μμ€λ₯Ό μλͺ¨νλ©΄μ κ°λ₯ν ν λΉ λ₯΄κ² μνλ κ²°κ³Όλ₯Ό μ»μ μ μλλ‘ νλ κ²μ μλ―Έ!
μ΅μ νμ νμμ± λ° ν¨κ³Ό
1. μ΄νλ₯ κ°μ
2. μ νμ¨ μ¦κ°
3. μμ΅ μ¦λ
4. μ¬μ©μ κ²½ν(UX) ν₯μ
πHTML, CSS μ½λ μ΅μ ννκΈ°
1. HTML μ΅μ ν λ°©λ²
(1) DOM νΈλ¦¬ κ°λ³κ² λ§λ€κΈ°
(2) μΈλΌμΈ μ€νμΌ μ¬μ©νμ§ μκΈ°
2. CSS μ΅μ ν λ°©λ²
(1) μ¬μ©νμ§ μλ CSS μ κ±°νκΈ°
(2) κ°κ²°ν μ λ ν° μ¬μ©νκΈ°
π리μμ€ λ‘λ© μ΅μ ννκΈ°
1. CSS νμΌ λΆλ¬μ€κΈ° → CSSOM νΈλ¦¬λ₯Ό κ°λ₯ν λΉ λ₯΄κ² ꡬμ±ν μ μλλ‘ HTML λ¬Έμ μ΅μλ¨μ λ°°μΉ
2. JavaScript νμΌ λΆλ¬μ€κΈ° → μ€ν¬λ¦½νΈ μμ±μ΄ λλ λκΉμ§ DOMνΈλ¦¬ μμ±μ΄ μ€λ¨λμ΄ λ λλ§μ΄ λλ €μ Έμ DOMνΈλ¦¬ μμ± νμ μ€ν¬λ¦½νΈλ₯Ό λΆλ¬μ¬ μ μλλ‘ μ΅νλ¨μ μμΉνλλ‘ νλ€.
πλΈλΌμ°μ μ΄λ―Έμ§ μ΅μ ννκΈ°
1. μ΄λ―Έμ§ μ€νλΌμ΄νΈ
- μ΄λ―Έμ§ μ€νλΌμ΄νΈ κΈ°λ²μ μ¬λ¬ κ°μ μ΄λ―Έμ§λ₯Ό λͺ¨μ νλμ μ€νλΌμ΄νΈ μ΄λ―Έμ§λ‘ λ§λ€κ³ CSSμ background-positionμμ±μ μ¬μ©ν΄ μ΄λ―Έμ§μ μΌμ λΆλΆλ§ ν΄λμ€ λ±μΌλ‘ ꡬλΆνμ¬ μ¬μ©νλ λ°©λ²
- νλμ μ΄λ―Έμ§λ₯Ό λ°°κ²½ μ΄λ―Έμ§λ‘ μ¬μ©νλ, νμνκ³ μΆμ λΆλΆμ λ§μΆ° width, height, background-position μμ±μ μ£Όμ΄ μμ΄μ½μ λ§λλλ€
2. μμ΄μ½ ν°νΈ μ¬μ©νκΈ°
(1) CDNμΌλ‘ μ¬μ©νκΈ°
(2) Font Awesome λͺ¨λ μ€μΉνκΈ°
(3) WebP λλ AVIF μ΄λ―Έμ§ ν¬λ§· μ¬μ©νκΈ° → μ©λκ°μ, λ¨ νΈνλ¬Έμ λ°μ
μ΄λ―Έμ§ μ΅μ νλ₯Ό μν΄ μ ν΅μ μΌλ‘ μ¬μ©νλ JPEG λλ PNG νμμ΄ μλ μλ‘κ² λ±μ₯ν μ΄λ―Έμ§ ν¬λ§·μΈ WebP λλ AVIFλ₯Ό μ¬μ©νμ¬ μ©λμ λμ± κ°μμν¬ μ μμ΅λλ€. WebPλ PNGμ λΉκ΅ν΄ 26% μ©λμ΄ κ°μλλ©° JPEGμ λΉκ΅νμ λ 25-35% λ κ°μλ©λλ€. AVIFλ JPEGμ λΉκ΅νμ λ λ¬΄λ € μ©λμ 50%κ° κ°μλλ©° WebPμ λΉκ΅νμ λ 20% κ°μλ©λλ€.
πCDN μ¬μ©νκΈ°
- CDNμ μ μ κ° κ°κΉμ΄ κ³³μ μμΉν λ°μ΄ν° μΌν°(μλ²)μ λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€. κ·Έλ¬λ―λ‘ λ°μ΄ν°κ° μ λ¬λκΈ° μν΄ κ±°μ³μΌνλ μλ²μ κ°―μκ° ν¬κ² μ€κΈ° λλ¬Έμ λ‘λ© μλκ° λΉ¨λΌμ§λλ€.
μΊμ μ¬μ©νκΈ°
μΊμ(Cache)λ λ€μ΄λ‘λ λ°μ λ°μ΄ν°λ κ°μ 미리 볡μ¬ν΄ λλ μμ μ₯μλ₯Ό λ»ν¨
- μλ²μμ μλ΅μ 보λ΄μ€ λ μ΄λ―Έμ§ νμΌκ³Ό ν¨κ» ν€λμ Cache-Controlμ μμ±ν΄μ 보λΈλ€.
- λλ²μ§Έ μμ²λΆν°λ μΊμλ₯Ό μ°μ μ‘°ννλ€. μ΄λ μΊμκ° μ ν¨νλ€λ©΄ μΊμμμ ν΄λΉνλ λ°μ΄ν°λ₯Ό κ°μ Έμμ μ¬μ©νλ€.
- μΊμκ° μ ν¨νμ§ μλ€λ©΄ μλ²μμ λ€μ μ΄λ―Έμ§λ₯Ό λ°μμ€κ² λλ€.
- μ΄λ μ ν¨ μκ°μ μ§λ¬μ§λ§ μΊμμ μ μ₯λμ΄μλ μ΄λ―Έμ§μ λ°μμμΌ νλ μ΄λ―Έμ§κ° κ°λ€λ©΄ μΊμ κ²μ¦ ν€λμ μ‘°κ±΄λΆ μμ² ν€λλ₯Ό μ¬μ©ν μ μλ€.
μ΄λ κ² λΈλΌμ°μ μΊμλ₯Ό νμ©νμ λμ ν¨κ³Ό
- μΊμκ° μ ν¨ν μκ° λμ λ€νΈμν¬ λ¦¬μμ€λ₯Ό μλ μ μμ
- νμΌμ λ€μ λ°μμ¬ νμκ° μκΈ° λλ¬Έμ λΈλΌμ°μ λ‘λ©μ΄ λΉ¨λΌμ§
- λ‘λ©μ΄ λΉ¨λΌμ§ λ§νΌ λΉ λ₯Έ μ¬μ©μ κ²½ν μ 곡 κ°λ₯
μΊμ κ²μ¦ ν€λ
μΊμμ μ μ₯λ λ°μ΄ν°μ μλ²μ λ°μ΄ν°κ° λμΌνμ§ νμΈνκΈ° μν μ 보λ₯Ό λ΄μ μλ΅ ν€λ
- Last-Modified : λ°μ΄ν°κ° λ§μ§λ§μΌλ‘ μμ λ μμ μ μλ―Ένλ μλ΅ ν€λλ‘, μ‘°κ±΄λΆ μμ² ν€λμΈ If-Modified-Since μ λ¬Άμ΄μ μ¬μ©ν©λλ€.
- Etag : λ°μ΄ν°μ λ²μ μ μλ―Ένλ μλ΅ ν€λλ‘, μ‘°κ±΄λΆ μμ² ν€λμΈ If-None-Match μ λ¬Άμ΄μ μ¬μ©ν©λλ€.
μ‘°κ±΄λΆ μμ² ν€λ
μΊμμ λ°μ΄ν°μ μλ²μ λ°μ΄ν°κ° λμΌνλ€λ©΄ μ¬μ¬μ©νκ² ν΄λ¬λΌλ μλ―Έμ μμ² ν€λ
- If-Modified-Since : μΊμλ 리μμ€μ Last-Modified κ° μ΄νμ μλ² λ¦¬μμ€κ° μμ λμλμ§ νμΈνκ³ , μμ λμ§ μμλ€λ©΄ μΊμλ 리μμ€λ₯Ό μ¬μ©ν©λλ€.
- If-None-Match : μΊμλ 리μμ€μ ETag κ°κ³Ό νμ¬ μλ² λ¦¬μμ€μ ETag κ°μ΄ κ°μμ§ νμΈνκ³ , κ°μΌλ©΄ μΊμλ 리μμ€λ₯Ό μ¬μ©ν©λλ€.
1. 첫λ²μ§Έ μμ²μμ μΊμ μ ν¨μκ°μ΄ 60μ΄μΈ μ΄λ―Έμ§ νμΌμ κ°μ΄ λ°μμ΄. μ΄λ Last-Modified ν€λμ λ΄κΈ΄ λ΄μ©λ μΊμμ ν¨κ» μ μ₯ (μλ²μ νμΌ λ²μ μ μλ―Ένλ Etagν€λμ λ΄κΈ΄ λ΄μ©λ μΊμμ ν¨κ» μ μ₯)
2. μΊμ μ ν¨μκ°μ μ§λ ν λλ²μ§Έ μμ²μμ
- If-Modified-Sinceλ₯Ό μμ±ν΄ μ μ₯ν΄λ Last-Modified κ°κ³Ό ν¨κ» μμ²μ 보λΈλ€. μ΄ κ°μ μ΄μ©ν΄ μλ²λ°μ΄ν°μ μ΅μ’ μμ μΌκ³Ό μΊμμ μ μ₯λ λ°μ΄ν°μ μμ μΌμ΄ κ°μμ§ νμΈνλ€. (If-None-Matchλ₯Ό μμ±νκ³ μΊμμ ν¨κ» μ μ₯ν΄λμλ Etag κ°μ λ΄μ μμ²μ 보λ΄μ΄ μ΄ κ°μ μ΄μ©ν΄ μλ² λ°μ΄ν°μ Etagμ μΊμμ μ μ₯λ λ°μ΄ν°μ Etagλ₯Ό λΉκ΅ν©λλ€. λ λ°μ΄ν°κ° λμΌν λ°μ΄ν°λΌλ©΄ λ Etagκ°μ΄ κ°μμΌ ν©λλ€.)
3. λ°μ΄ν°κ° μμ λμ§ μμμ κ²½μ° 304 Not Modified μλ΅.μΊμ λ°μ΄ν°μ μ ν¨μκ°μ΄ κ°±μ λμ΄ μ¬μ¬μ©ν μ μκ² λλ€.
νΈλ¦¬μμ΄νΉ(Tree Shaking)μ΄λ?
λ§ κ·Έλλ‘ λ무λ₯Ό νλ€μ΄ μκ°μ§λ₯Ό νΈμ΄λ΄λ― λΆνμν μ½λλ₯Ό μ κ±°νλ κ²
1. JavaScript νμΌμ ν¬κΈ° μ¦κ°
- HTTP μμ² μ λν λ°μ€ν¬νμμ 155.6%, λͺ¨λ°μΌμμ 425.0% μ¦κ°ν¨. ν¬κΈ°κ° ν¨μ¬ μ»€μ§ JavaScript νμΌμ΄ λμ΄λ μμ² νμλ§νΌ λ μ€κ°λ κ²μ΄λ, λ€νΈμν¬ λ¦¬μμ€ μλͺ¨κ° κ·Έλ§νΌ 컀μ‘λ€.
2. JavaScript νμΌμ μ€ν μκ° μ¦κ°
JavaScript νΈλ¦¬μμ΄νΉ
1. νμν λͺ¨λλ§ import νκΈ°
import { useState, useEffect } from 'react'
λΆλ¬μ€μ§ μμ μ½λλ λΉλν λ μ μΈλλ―λ‘ μ½λμ ν¬κΈ°λ₯Ό μ€μΌ μ μκ² λ©λλ€.
2. Babelrc νμΌ μ€μ νκΈ°
{
“presets”: [
[
“@babel/preset-env”,
{
"modules": false
}
]
]
}
Babel : μλ°μ€ν¬λ¦½νΈ λ¬Έλ²μ΄ ꡬν λΈλΌμ°μ μλ νΈν κ°λ₯νλλ‘ ES5 λ¬Έλ²μΌλ‘ λ³ν.
es5λ importλ₯Ό μ§μνμ§ μμ commonJSλ¬Έλ²μ requireλ‘ λ³κ²½μν¨λ€.
requireμ exportλλ λͺ¨λ λͺ¨λμ λΆλ¬μ€κΈ° λλ¬Έμ νμνμ§ μμ λͺ¨λκΉμ§ λͺ¨λ λΆλ¬μ€κ² λλ€.
μ΄λ₯Ό λ°©μ§νκΈ° μν μ½λ!!
modulesκ°μ trueλ‘ μ€μ νλ©΄ νμ ES5 λ¬Έλ²μΌλ‘ λ³ν
3. sideEffects μ€μ νκΈ°
const crews = ['kimcoding', 'parkhacker']
const addCrew = function (name) {
crews.push(name)
}
addCrewν¨μλ ν¨μ μΈλΆμ μλ λ°°μ΄μΈ crewsλ₯Ό λ³κ²½μν€λ ν¨μμ λλ€.
ν΄λΉ ν¨μλ μΈλΆμ μν₯μ μ£Όμ§λ λ°μ§λ μλ ν¨μ, μμ ν¨μκ° μλκΈ° λλ¬Έμ νΈλ¦¬μμ΄νΉμ ν΅ν΄ μ μΈνλ κ²½μ° λ¬Έμ κ° μκΈΈ μλ μλ€κ³ νλ¨ν΄ μΉν©μ μ΄ μ½λλ₯Ό μ μΈμν€μ§ μλλ€.
μ΄λ΄ λ package.json νμΌμμ sideEffectsλ₯Ό μ€μ νμ¬ μ¬μ΄λ μ΄ννΈκ° μκΈ°μ§ μμ κ²μ΄λ―λ‘ μ½λλ₯Ό μ μΈμμΌλ λ¨μ μΉν©μκ² μλ €μ€ μ μμ΅λλ€.
λ€μκ³Ό κ°μ΄ μμ±νλ©΄ μ ν리μΌμ΄μ μ 체μμ μ¬μ΄λ μ΄ννΈκ° λ°μνμ§ μμ κ²μ΄λ€.
{
"name": "tree-shaking",
"version": "1.0.0",
"sideEffects": false
}
νΉμ μλμ κ°μ΄ μμ±νμ¬ νΉμ νμΌμμλ λ°μνμ§ μμ κ²μ΄λ€.
{
"name": "tree-shaking",
"version": "1.0.0",
"sideEffects": ["./src/components/NoSideEffect.js"]
}
4. ES6 λ¬Έλ²μ μ¬μ©νλ λͺ¨λ μ¬μ©νκΈ°
ES5 λ¬Έλ²μ μ¬μ©νλ λͺ¨λμ ν΅μ§Έλ‘ μ¬μ©νλ μν©μ΄λΌλ©΄ μκ΄X
ES5 μΌλΆλ§ μ¬μ©νλ κ²½μ°, ν΄λΉ λͺ¨λμ λ체ν μ μμΌλ©΄μ ES6λ₯Ό μ§μνλ λ€λ₯Έ λͺ¨λμ μ¬μ©νλ κ²μ΄ μ’λ€.
ES6 λ¬Έλ²μ μ¬μ©νλ λͺ¨λμ μ¬μ©νλ©΄ ν΄λΉ λͺ¨λμμλ νμν λΆλΆλ§ import ν΄μ μ¬μ©νμ§ μλ μ½λλ λΉλν λ μ μΈλκΈ° λλ¬Έ!
Lighthouse
μ¬μ΄νΈλ₯Ό κ²μ¬ν΄ μ±λ₯ μΈ‘μ μ ν μ μλ λꡬμ±λ₯κ²μ¬ + κ°μ μ± λ μ 곡
- ν¬λ‘¬μμ κ²μ¬νκ³ μΆμ νμ΄μ§μ urlμ μ λ ₯
- κ°λ°μ λꡬ > Lighthouse
- Generate reportλ₯Ό ν΄λ¦ν©λλ€. Categoriesμμ νΉμ ν μ§νλ§ μ ννμ¬ κ²μ¬ν μλ μμ΅λλ€.
- λλ΅ 30-60μ΄κ° κ²μ¬κ° μ€νλ©λλ€. κ·Έ ν μλμ κ°μ΄ 리ν¬νΈκ° ν΄λΉ νμ΄μ§μ κ°λ°μ λꡬλ΄μ μμ±λ©λλ€.