[Observer API νν€μΉκΈ°] 5. PerformanceObserver
β° 2024-06-27 (λͺ©) 11:27:14
PerformanceObserver
PerformanceObserver
λ μ±λ₯ μ΄λ²€νΈλ₯Ό κ΄μΈ‘νλ μ΅μ λ² APIλ€. F12λ₯Ό λλ₯΄λ©΄ λμ€λ κ°λ°μλꡬμ μ±λ₯ νκ³Ό μ°κ΄λλ€.
TYPESCRIPT
1 2 3
const po = new PerformanceObserver(callback); po.observer(options);
νμ΄μ§ μ±λ₯κ³Ό κ΄λ ¨λ μ΅μ λ²λΌλ νΉμ§μΌλ‘μΈν΄, ν μ΅μ λ²μ λ¬λ¦¬ νκ·Έλ₯Ό λ±λ‘νλ κ³Όμ μ΄ μλ€.
options
μ΅μ λ² λ±λ‘ μ options
λ₯Ό μ λ¬νμ¬ μΈλΆ μ΅μ
μ μ‘°μ ν μ μλ€. PerformanceObserverInit
νμ
μ κ°μ§λ€.
κ΄μ°° λμ (type)
μ΅μ λ²κ° κ΄μ°°ν μ±λ₯ μμλ₯Ό μ§μ νλ€. κ° μμλ μλμ κ°λ€.
navigation
- νμ΄μ§ λ‘λμ μ°κ΄λ μ±λ₯ μ§ν. νμ΄μ§ 첫 λ‘λ μμ νμ΄λ° μ 보 λ±μ μμ§ν μ μλ€.resource
- νμ΄μ§μ λ‘λλ 리μμ€μ μ°κ΄λ μ±λ₯ μ§ν. μ΄λ―Έμ§,js
,css
λ±μ΄ λμμ ν΄λΉλλ€.mark
- κ°λ°μκ° μ§μ ν μμμ νμ΄λ° μ 보.measure
- μ§μ ν λmark
μ¬μ΄μ μκ° μΈ‘μ .paint
- νμ΄μ§μ λ λλ§ λ° νμΈνΈμ κ΄λ ¨λ μ±λ₯ μ§ν. 첫 νμ΄μ§ νμΈν (FP), μ΅μ΄μ μ μλ―Έν νμΈν (FMP) λ±μ΄ ν΄λΉνλ€.longtask
- 50ms μ΄μμ κΈ΄ νλ‘μΈμ€ μλ³element
- DOM μμ λ λλ§κ³Ό μ°κ΄λ μ±λ₯ μ§ν.frame
- μ λλ©μ΄μ νλ μκ³Ό λ ¨κ΄λ μ±λ₯ μ§ν. μ λλ©μ΄μ λ° μ€ν¬λ‘€ μ±λ₯ λΆμκ³Ό κ΄λ ¨λ μ 보λ₯Ό μ 곡νλ€.event
- μ΄λ²€νΈ λ°μκ³Ό μ°κ΄λ μ±λ₯ μ§ν.first-input
- μ¬μ©μμ μ‘μ κ³Ό κ΄λ ¨λ μ±λ₯ μ§ν.largest-contentful-paint
- λμ©λ μμμ λ λλ§ μ±λ₯ μ§ν.layout-shift
- νμ΄μ§μ μμ μ΄λ μ±λ₯ μ§ν.
type
μ νμ ν entryTypes
μ λ³ννμ¬ μ¬μ©ν μ μλ€.
κ΄μ°° λμ λͺ©λ‘ (entryTypes)
μ΅μ λ²κ° κ΄μ°°ν μ±λ₯ μμλ₯Ό λ°°μ΄λ‘ μ§μ νλ€. μ¬λ¬ μ±λ₯ μ§νλ₯Ό μΈ‘μ ν λ μ©μ΄νλ€.
κΈ°μ‘΄ μ±λ₯ νλͺ© ν¬ν¨ μ¬λΆ (buffered)
κΈ°μ‘΄ μ±λ₯ μ§ν ν¬ν¨ μ¬λΆλ₯Ό μ§μ νλ μ΅μ
μ΄λ€. κΈ°λ³Έμ μΌλ‘ false
λ‘ μ μΈλμ΄μλ€.
callback
μ½λ°± λ©μλλ₯Ό ν΅ν΄ μ±λ₯ κ΄λ ¨ μ§νλ₯Ό λ€λ£° μ μλ€. PerformanceObserverCallback
νμ
μ κ°μ§λ€.
entries
μ±λ₯ μ§ν κ°μ²΄ PerformanceObserverEntryList
λ₯Ό λ°ννλ€. getEntries
, getEntriesByName
, getEntriesByType
λ©μλλ₯Ό ν΅ν΄ μνλ λͺ©λ‘μ λ½μλΌ μ μλ€.
κ° μμλ type
νΉμ entryTypes
μ μ§μ ν μμμ λ°λ₯Έ μ±λ₯ κ°μ²΄λ€. μΈ‘μ λ μ±λ₯ μμμ λ°λΌ μμ΄ν κ°μ²΄λ₯Ό κ°μ§κ³ μλ€.
observer
PerformanceObserver
κ°μ²΄λ₯Ό λ°νν΄μ€λ€. μ΄λ₯Ό ν΅ν΄ μ½λ°± λ©μλ λ΄μμλ PerformanceObserver
λ₯Ό μ°μμ μΌλ‘ λ€λ£° μ μλ€.
Reactμμ 컀μ€ν
ν
μΌλ‘ κ°νΈνκ² μ¬μ©νκΈ°
PerformanceObserver
λ₯Ό 컀μ€ν
ν
μ ν΅ν΄ κ°νΈνκ² μ¬μ©ν΄λ³΄μ.
TYPESCRIPT
1 2 3 4
export function usePerformanceObserver(): void { // }
μμ κ°μ΄ usePerformanceObserver
λ©μλλ₯Ό μ μνλ€.
useMutationObserver
λ₯Ό μ¬μ©νκΈ° μν΄μ μλμ λ μμκ° νμνλ€.
- μ½λ°± λ©μλ
- μ΅μ
μ§κΈκΉμ§μ μ΅μ λ²μ λ¬λ¦¬ DOMμ΄ νμνμ§ μλ€.
TYPESCRIPT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
import { useEffect } from "react"; export type UsePerformanceObserverCallback = (entry: PerformanceEntry) => void; /** * PerformanceObserver μ μ© ν λ©μλ * * @param {UsePerformanceObserverCallback} callback: μ½λ°± λ©μλ * @param {PerformanceObserverInit} options: μ΅μ */ export function usePerformanceObserver( callback: UsePerformanceObserverCallback, options?: PerformanceObserverInit ): void { useEffect(() => { const po = new PerformanceObserver((entries) => { entries.getEntries().forEach(callback); }); }, [callback, options]); }
PerformanceObserver
λ₯Ό μ΄κΈ°ννμ¬ po
λ³μλ‘ ν λΉνλ€.
po.observe()
λ©μλλ₯Ό ν΅ν΄ νκ·Έλ₯Ό λ±λ‘ν μ μλ€.
TYPESCRIPT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
import { useEffect } from "react"; export type UsePerformanceObserverCallback = (entry: PerformanceEntry) => void; /** * PerformanceObserver μ μ© ν λ©μλ * * @param {UsePerformanceObserverCallback} callback: μ½λ°± λ©μλ * @param {PerformanceObserverInit} options: μ΅μ */ export function usePerformanceObserver( callback: UsePerformanceObserverCallback, options?: PerformanceObserverInit ): void { useEffect(() => { const po = new PerformanceObserver((entries) => { entries.getEntries().forEach(callback); }); po.observe(options); }, [callback, options]); }
λ§μ§λ§μΌλ‘, μ»΄ν¬λνΈκ° λ λλ§ λ λλ§λ€ PerformanceObserver
μ λ±λ‘μ΄ μ€μ²©λμ§ μλλ‘, μ΄κΈ°ν μ½λλ₯Ό λ£μ΄μ€λ€.
po.disconnect()
λ©μλλ₯Ό ν΅ν΄ PerformanceObserver
λ₯Ό μ κ±°ν μ μλ€.
μ 체 μ½λ
TYPESCRIPT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
import { useEffect } from "react"; export type UsePerformanceObserverCallback = (entry: PerformanceEntry) => void; /** * PerformanceObserver μ μ© ν λ©μλ * * @param {UsePerformanceObserverCallback} callback: μ½λ°± λ©μλ * @param {PerformanceObserverInit} options: μ΅μ */ export function usePerformanceObserver( callback: UsePerformanceObserverCallback, options?: PerformanceObserverInit ): void { useEffect(() => { const po = new PerformanceObserver((entries) => { entries.getEntries().forEach(callback); }); po.observe(options); return () => { po.disconnect(); }; }, [callback, options]); }
μ 체 μ½λλ μμ κ°λ€.
CodeSandboxλ‘ ν΅ν μμ
CodeSandboxλ‘ κ°λ¨ν μμλ₯Ό ꡬννλ€.
λ§μΉλ©°
PerformanceObserver
λ₯Ό ν΅ν΄ νμ΄μ§μ μ±λ₯ μ§νλ₯Ό μΈ‘μ ν μ μλ€. μ΄λ₯Ό μ μ ν ꡬμ±νλ©΄ Lighthouseμ κ°μ μΉ μ±λ₯ μΈ‘μ μλΉμ€λ₯Ό μ μ¬νκ² κ΅¬νν μ μμ κ²μ΄λ€.
νμ§λ§ μ΄λ―Έ λΉμ·νκ±°λ, λ μ°μν κΈ°λ₯μ μ 곡νλ μ¬λ¬ μ€ν/μμ© λꡬλ€μ΄ λ§μ κ²μ΄ νμ€μ΄λ€. λν μμ λ€λ£¬ μΈ μ΅μ λ²μ λ¬λ¦¬, κΈ°λ₯ κ°λ°μ μμ΄ λ²μ©μ±μ΄ λ§μ΄ λ¨μ΄μ§λ νμ, κ΄λ ¨ μ λ³΄κ° λ§μ΄ μλ€λ κ²μ΄ λ¨μ μ΄λ€.
λ§μ§λ§μΌλ‘ λ€λ£° μ΅μ λ²λ ReportingObserver
λ€.
π·οΈ νκ·Έ
μ½μ΄μ£Όμ μ κ³ λ§μμ!
λμμ΄ λμ ¨λ€λ©΄, 곡κ°μ΄λ λκΈμ λ¬μμ£Όμλ 건 μ΄λ€κ°μ?
λΈλ‘κ·Έ μ΄μμ ν° νμ΄ λ©λλ€.