"매 첫 paint 의 1.8s, 매 TTI 의 3.5s 미만 — 매 user 의 stay 의 결정.". 매 Core Web Vitals (LCP, FID/INP, CLS) 의 Google ranking signal 화 (2021) 이후, 매 initial load 의 SEO + UX dual concern. 매 2026 의 modern stack — RSC streaming, edge SSR, Vite 5, Bun bundler — 의 sub-second TTI 의 가능.
매 핵심
매 측정 지표
FCP (First Contentful Paint): 매 첫 DOM content 의 paint — target < 1.8s.
LCP (Largest Contentful Paint): 매 largest above-fold element 의 render — target < 2.5s.
TTI (Time to Interactive): 매 main thread 의 idle + listener 의 attach — target < 3.5s.
TBT (Total Blocking Time): 매 long task (>50ms) 의 합 — target < 200ms.
INP (Interaction to Next Paint): 매 FID 의 successor (2024 Web Vitals) — target < 200ms.
매 bottleneck 의 source
매 JavaScript bundle 의 크기 (>200KB gzipped 의 red flag).
매 render-blocking CSS / synchronous script.
매 unoptimized image (WebP / AVIF 의 미사용).
매 N+1 API call (waterfall fetch).
매 third-party script (analytics, ads) 의 main thread 점유.
매 응용
E-commerce: 매 100ms 의 latency 의 1% conversion drop (Amazon study).
Media site: 매 LCP 의 SEO ranking 의 직접 영향.
SaaS dashboard: 매 TTI 의 user retention 의 결정.
💻 패턴
Code splitting (Next.js)
// app/dashboard/page.tsx
importdynamicfrom'next/dynamic';constHeavyChart=dynamic(()=>import('@/components/HeavyChart'),{loading:()=><Skeleton/>,ssr: false,// client-only 의 heavy component
});exportdefaultfunctionDashboard() {return(<div><Header/><HeavyChart/></div>);}
React Server Components streaming
// app/page.tsx — RSC 의 streaming
import{Suspense}from'react';exportdefaultfunctionPage() {return(<><Header/>{/* immediate */}<Suspensefallback={<Skeleton/>}><SlowDataFetch/>{/* streamed when ready */}</Suspense></>);}asyncfunctionSlowDataFetch() {constdata=awaitfetch('https://api/slow',{cache:'force-cache'});return<Chartdata={awaitdata.json()}/>;}
/* CSS — FOUT 방지 */@font-face{font-family:'Inter';src:url('/fonts/inter.woff2')format('woff2');font-display:swap;/* 매 fallback 의 즉시 show */}
Bundle 분석 (Vite)
# vite-bundle-visualizer
npx vite-bundle-visualizer
# Next.jsANALYZE=true next build
Critical CSS inline
// Next.js — 매 default 로 critical CSS 의 extract
// Vite — vite-plugin-critical 의 use
import{defineConfig}from'vite';importcriticalfrom'rollup-plugin-critical';exportdefaultdefineConfig({plugins:[critical({criticalBase:'dist/',criticalPages:[{uri:'',template:'index'}]})],});
언제: 매 performance audit 의 explanation, 매 bundle analysis result 의 interpretation, 매 optimization strategy 의 brainstorm.
언제 X: 매 production performance regression 의 진단 — 매 real RUM data + Lighthouse CI 의 use.
❌ 안티패턴
Render-blocking sync script: 매 <script src> 의 head 위치 + async/defer 의 누락.
Unsized image: 매 width/height 의 missing — 매 CLS 의 발생.
Hydration mismatch: 매 SSR HTML 과 client render 의 차이 — 매 re-render 의 cost.
Bundle bloat: 매 lodash 의 entire import (import _ from 'lodash') 의 사용.
Premature optimization: 매 측정 의 없이 의 tweak — 매 RUM data 의 우선.