Skip to content

Commit

Permalink
docs: 38.7 ~ 38.9 정리
Browse files Browse the repository at this point in the history
  • Loading branch information
e6d1fe committed Jan 12, 2024
1 parent f668249 commit 13104b2
Showing 1 changed file with 57 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,60 @@ CSS νŒŒμ‹± κ³Όμ •κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ Œλ”λ§ 엔진은 HTML을 ν•œ 쀄씩 순
- ν† ν¬λ‚˜μ΄μ§•: λ‹¨μˆœν•œ λ¬Έμžμ—΄μΈ μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€μ½”λ“œλ₯Ό μ–΄νœ˜ λΆ„μ„ν•˜μ—¬ 문법적 의미λ₯Ό κ°–λŠ” μ½”λ“œμ˜ μ΅œμ†Œ λ‹¨μœ„μΈ ν† ν°λ“€λ‘œ λΆ„ν•΄ν•œλ‹€.
- νŒŒμ‹±: ν† ν°λ“€μ˜ 집합을 ꡬ문 λΆ„μ„ν•˜μ—¬ ASTλ₯Ό μƒμ„±ν•œλ‹€.
- λ°”μ΄νŠΈμ½”λ“œ 생성과 μ‹€ν–‰: νŒŒμ‹±μ˜ κ²°κ³Όλ¬Όλ‘œμ„œ μƒμ„±λœ ASTλŠ” 인터프리터가 μ‹€ν–‰ν•  수 μžˆλŠ” 쀑간 μ½”λ“œμΈ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜λ˜κ³  인터프리터에 μ˜ν•΄ μ‹€ν–‰λœλ‹€. 참고둜 V8 μ—”μ§„μ˜ 경우, 자주 μ‚¬μš©λ˜λŠ” μ½”λ“œλŠ” ν„°λ³΄νŒ¬μ΄λΌ λΆˆλ¦¬λŠ” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ΅œμ ν™”λœ λ¨Έμ‹  μ½”λ“œλ‘œ μ»΄νŒŒμΌλ˜μ–΄ μ„±λŠ₯을 μ΅œμ ν™”ν•œλ‹€. μ‚¬μš© λΉˆλ„κ°€ 적어지면 λ‹€μ‹œ λ””μ˜΅ν‹°λ§ˆμ΄μ§•ν•˜κΈ°λ„ ν•œλ‹€.

### πŸ“ 38.7: λ¦¬ν”Œλ‘œμš°μ™€ 리페인트

λ§Œμ•½ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ— DOMμ΄λ‚˜ CSSOM을 λ³€κ²½ν•˜λŠ” DOM APIκ°€ μ‚¬μš©λœ 경우 DOMμ΄λ‚˜ CSSOM이 λ³€κ²½λœλ‹€.
μ΄λ•Œ λ³€κ²½λœ DOMκ³Ό CSSOM은 λ‹€μ‹œ λ Œλ” 트리둜 κ²°ν•©λ˜κ³  λ³€κ²½λœ λ Œλ” 트리λ₯Ό 기반으둜 λ ˆμ΄μ•„μ›ƒκ³Ό 페인트 과정을 거쳐 λΈŒλΌμš°μ €μ˜ 화면에 λ‹€μ‹œ λ Œλ”λ§ν•œλ‹€.
이λ₯Ό **λ¦¬ν”Œλ‘œμš°**, **리페인트**라 ν•œλ‹€.
λ¦¬ν”Œλ‘œμš°λŠ” λ ˆμ΄μ•„μ›ƒ 계산을 λ‹€μ‹œ ν•˜λŠ” 것을 λ§ν•˜λ©°, λ…Έλ“œ μΆ”κ°€/μ‚­μ œ, μš”μ†Œμ˜ 크기/μœ„μΉ˜ λ³€κ²½, μœˆλ„μš° 리사이징 λ“± λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£ΌλŠ” 변경이 λ°œμƒν•œ κ²½μš°μ— ν•œν•˜μ—¬ μ‹€ν–‰λœλ‹€.
λ¦¬νŽ˜μΈνŠΈλŠ” μž¬κ²°ν•©λœ λ Œλ” 트리λ₯Ό 기반으둜 λ‹€μ‹œ νŽ˜μΈνŠΈν•˜λŠ” 것을 λ§ν•œλ‹€.
이 두 κ°€μ§€λŠ” 항상 같이 μ‹€ν–‰λ˜λŠ” 것은 μ•„λ‹ˆλ©°, λ ˆμ΄μ•„μ›ƒμ— 영ν–₯이 μ—†λŠ” λ³€κ²½μ˜ 경우 λ¦¬ν”Œλ‘œμš° 없이 리페인트만 μ‹€ν–‰λœλ‹€.

### πŸ“ 38.8: μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±μ— μ˜ν•œ HTML νŒŒμ‹± 쀑단

λ Œλ”λ§ 엔진과 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 λ³‘λ ¬μ μœΌλ‘œ νŒŒμ‹±μ„ μ‹€ν–‰ν•˜μ§€ μ•Šκ³  직렬적으둜 μˆ˜ν–‰ν•œλ‹€.
λΈŒλΌμš°μ €λŠ” λ™κΈ°μ μœΌλ‘œ, 즉 μœ„μ—μ„œ μ•„λž˜ λ°©ν–₯으둜 순차적으둜 HTML, CSS, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό νŒŒμ‹±ν•˜κ³  μ‹€ν–‰ν•œλ‹€.
**이것은 `script` νƒœκ·Έμ˜ μœ„μΉ˜μ— 따라 HTML νŒŒμ‹±μ΄ λΈ”λ‘œν‚Ήλ˜μ–΄ DOM 생성이 지연될 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.**

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
<script src="app.js"></script>
</head>
<body>
<ul>
<li id="apple">apple</li>
<li id-"orange">orange</li>
</ul>
</body>
</html>
```

μœ„ 예제의 경우 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ(`app.js`)μ—μ„œ DOMμ΄λ‚˜ CSSOM을 λ³€κ²½ν•˜λŠ” DOM APIλ₯Ό μ‚¬μš©ν•  경우, DOMμ΄λ‚˜ CSSOM이 이미 μƒμ„±λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.
μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ `body` μš”μ†Œμ˜ κ°€μž₯ μ•„λž˜μ— μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μœ„μΉ˜μ‹œν‚€λŠ” 것이 쒋은 아이디어이닀.

- DOM이 μ™„μ„±λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ DOM을 μ‘°μž‘ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  수 μžˆλ‹€.
- μžλ°”μŠ€ν¬λ¦½νŠΈ λ‘œλ”©/νŒŒμ‹±/μ‹€ν–‰μœΌλ‘œ 인해 HTML μš”μ†Œλ“€μ˜ λ Œλ”λ§μ— 지μž₯λ°›λŠ” 일이 λ°œμƒν•˜μ§€ μ•Šμ•„ νŽ˜μ΄μ§€ λ‘œλ”© μ‹œκ°„μ΄ λ‹¨μΆ•λœλ‹€.

### πŸ“ 38.9: `script` νƒœκ·Έμ˜ `async`/`defer` μ–΄νŠΈλ¦¬λ·°νŠΈ

38.8μ—μ„œ λ³Έ 문제λ₯Ό 근본적으둜 ν•΄κ±Έν•˜κΈ° μœ„ν•΄ HTML5λΆ€ν„° `script` νƒœκ·Έμ— `async`와 `defer` μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.
`async`와 `defer` μ–΄νŠΈλ¦¬λ·°νŠΈλŠ” `src` μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό 톡해 μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•  수 있고, μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μ—†λŠ” 인라인 μžλ°”μŠ€ν¬λ¦½νŠΈμ—λŠ” μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ‹€.

ν•΄λ‹Ή μ–΄νŠΈλ¦¬λ·°νŠΈλ“€μ„ μ‚¬μš©ν•˜λ©΄ HTML νŒŒμ‹±κ³Ό μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ λ™μ‹œμ— μ§„ν–‰λ˜λŠ”λ°, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ‹€ν–‰ μ‹œμ μ— 차이가 μžˆλ‹€.

#### `async`

HTML νŒŒμ‹±κ³Ό μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ λ™μ‹œμ— μ§„ν–‰λœλ‹€.
**단, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŒŒμ‹±κ³Ό 싀행은 μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ μ™„λ£Œλœ 직후 μ§„ν–‰λ˜λ©°, μ΄λ•Œ HTML νŒŒμ‹±μ΄ μ€‘λ‹¨λœλ‹€.**
μ—¬λŸ¬ 개의 `script` νƒœκ·Έμ— `async` μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μ§€μ •ν•˜λ©΄ νƒœκ·Έμ˜ μˆœμ„œμ™€λŠ” 상관없이 λ‘œλ“œκ°€ μ™„λ£Œλœ μžλ°”μŠ€ν¬λ¦½νŠΈλΆ€ν„° λ¨Όμ € μ‹€ν–‰λ˜λ―€λ‘œ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

#### `defer`

HTML νŒŒμ‹±κ³Ό μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ λ™μ‹œμ— μ§„ν–‰λœλ‹€.
**단, μž¦λ°”μŠ€ν¬λ¦½νŠΈμ˜ νŒŒμ‹±κ³Ό 싀행은 HTML νŒŒμ‹±μ΄ μ™„λ£Œλœ 직후, 즉 DOM 생성이 μ™„λ£Œλœ 직후(μ΄λ•Œ `DOMContentLoaded` 이벀트 λ°œμƒ)에 μ§„ν–‰λœλ‹€.**
λ”°λΌμ„œ DOM 생성이 μ™„λ£Œλœ 이후 μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μžλ°”μŠ€ν¬λ¦½νŠΈμ— μœ μš©ν•˜λ‹€.

0 comments on commit 13104b2

Please sign in to comment.