Nextjsλ₯Ό μ¬μ©ν΄μ μ½λ©μ ν λ <img />λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ warningμ΄ λ¨λκ²μ λ³Ό μ μλ€.
κ·ΈλΌ μ¬μ©ν΄μ€μΌνμ§ μκ² λκ°? μ΄λ² ν¬μ€ν
μμλ λ€μν κΈ°λ₯κ³Ό μ¬μ©μ κ²½νμ ν₯μμν¬ μ μλ next/image μ»΄ν¬λνΈμ λν΄μ μμλ³΄λ €κ³ νλ€.
Nextjsμμ μ 곡νλ Image componentλ version 10 λΆν° λ±μ₯νμΌλ©° κ·Έ κΈ°λ₯μ μμ½νμλ©΄ λ€μκ³Ό κ°λ€.
- μ΅μ
image formatμΌλ‘ μ¬λ¬deviceλ₯Ό λμνμ¬ μ μ νimage sizeμ 곡 layout shiftλ°©μ§imageκ°viewportμ λ€μ΄κ°λλ§loadλλλ‘νλ©°placeholderλ₯Ό μ 곡imageλ₯Όwebpμ κ°μ μ©λμ΄ μμ ν¬λ§·μΌλ‘ λ³νμ 곡
How to use
next/imageμ μ¬μ©λ²μ μλμ κ°λ€
import Image from 'next/image';
const Photo = () => {
return (
<Image
src={'https://imageurl.com'}
alt="photo-of-you"
/>
)
}next/imageλ μ μ μ΄λ―Έμ§μ κ²½μ° width, height, blurDataURLμ΄ μλμΌλ‘ μμ±λλ€. μ격μ μ₯μμ μ μ₯λμ΄ μλ μ΄λ―Έμ§λ₯Ό μ¬μ©ν κ²½μ° width, heightλ₯Ό νμμ μΌλ‘ μ
λ ₯ν΄μ£Όμ΄μΌ νλ€. μ μ μ΄λ―Έμ§μ κ²½μ° buildμ width, heightλ₯Ό κ³μ°ν μ μμΌλ κ·Έλ μ§ μλ κ²½μ°λ λΆκ°λ₯νκΈ° λλ¬Έμ΄λ€.
Props
Required props
β£ src
γ
€β’ μ μ μ΄λ―Έμ§ μμΉ μ
λ ₯
γ
€β’ μΈλΆ url (보μμ μν΄ next.config.jsμ domain μ€μ νμ)
β£ width & height
γ
€β’ layoutμ΄ fill λλ μ μ μ΄λ―Έμ§κ° μλ κ²½μ°λ₯Ό μ μΈνκ³ λ λͺ¨λ νμλ‘ λͺ
μν΄μ£Όμ΄μΌ νλ€
β£ alt
γ
€β’ μΉ μ κ·Όμ±(screen reader)μ μν΄μ λͺ
μ νμ
Optional props
β£ loader
γ
€β’ src, width, quality λ±μ parameterλ₯Ό νμ©ν΄μ image URLμ λ°μμ€λλ‘ customize ν μ μλ€
const imageLoader = ({ src, width, quality }) => {
return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
export default function Page() {
return (
<Image
loader={imageLoader}
src="me.png"
alt="Picture of the author"
width={500}
height={500}
/>
)
}β£ placeholder
γ
€β’ imageκ° λ‘λ©λκΈ° μ μ νμ΄μ§μμ κ·Έλ§νΌμ μ리λ₯Ό μ΄λ»κ² displayν μ§μ κ΄ν μμ±μ΄λ€.
γ
€β’ blur, emptyλ‘ μ§μ ν μ μμΌλ©°, blurλ‘ μ§μ νλ©΄ imageκ° λ‘λλκΈ° μ μ blurμ²λ¦¬ν νλ©΄μ΄ λ³΄μ΄κ³ , μμ ν λ‘λλλ©΄ imageκ° λνλλ€. μ μ μ΄λ―Έμ§μ κ²½μ° μλμΌλ‘ blurDataURL(λΈλ¬μ΄λ―Έμ§)μ μμ±ν΄ μ€λ€.

β£ priority
γ
€β’ imageλ₯Ό 미리 λ λλ§ λλλ‘ νλ μ΅μ
μ΄λ€. κ°μ₯ μ²μ λ
ΈμΆλλ imageμλ μ΄ μμ±μ trueλ‘ μ€μ νμ¬ λ―Έλ¦¬ λ λλ§ νλκ²μ΄ μ 리νλ€. (lazy loadingμ΄ λΉνμ±ν λλ―λ‘ LCP μμλ‘ μΈ‘μ λ imageμλ μ¬μ©ν΄μ£Όλκ²μ΄ web vital scoreμ λμμ΄ λ κ²μ΄λ€.)
β£ quailty
γ
€β’ 1μμ 100κΉμ§ μ«μλ‘ μ§μ νλ©° 100μ΄ μ΅κ³ νμ§μ΄λ€. κΈ°λ³Έκ°μ 75
β£ sizes
γ
€β’ CLS(Cummulative layout shift) νμμ λ°©μ§νκΈ° μν΄μλ image sizeλ₯Ό viewportμ λ§κ² loadν΄μΌνλ€. μ΄λ μ¬μ©λλ μ΅μ
μ΄κ³ , λΈλΌμ°μ κ° page loadμμ layoutμ λν΄ ν΄μΉμ§ μλ μ μμ loadλ₯Ό μ€ννκ² λλ€.
γ
€β· μ°Έκ³ λ‘ next/imageμμλ srcset(viewport widthsμ λ°λΌ loadλ image ν보λ€μ μ€μ νλ CSS μμ±) attributeλ₯Ό μλμΌλ‘ μ€μ ν΄ loadλ image ν보λ€μ€ μλ§μ viewport widthμ imageλ₯Ό λ‘λνλ€. μ΄λ next.config.js λ΄λΆμ μ€μ λ deviceSizes(device breakpoint), imageSizes(image width)λ₯Ό μ¬μ©νκ² λλ€.
Cache
default loaderμ κ²½μ° imageκ° νλ² loading λλ©΄ κ·Έ μ΄νμλ optimizeλ imageκ° <distDir>/cache/imagesμ caching λλ€. expiration timeμ cache-controlλ‘ μ μ΄λλ€
(default loaderκ° μλ 3rd party cloudμ λν Image loaderλ₯Ό μ¬μ©ν κ²½μ°μλ ν΄λΉ loaderμμ μ§μνλ λ°©μμ μ¬μ©ν΄μΌ νλ€)
nextλ λ§μ μ
λ°μ΄νΈκ° μ΄λ£¨μ΄ μ§λ©΄μ λ€μν κΈ°λ₯μ μ 곡νκ³ μλ€. νΉν imageλ₯Ό μ΅μ ν νλκ²μ νλ‘ νΈμλ κ°λ°μμ κ°μ₯ ν° μμ κ° μλμλ μΆλ€. λ€μν propsλ₯Ό κ°μ§κ³ λ€μν κΈ°λ₯μ μ 곡νλ λ§νΌ, μλΉμ€μ μ΄μνκ²½μ λ§κ² μλ§μ μ΅μ ν λ°©λ²μ μ μ ν μ°Ύμμ μ μ©νλ©΄ μ’μκ² κ°λ€.
μ‘°λ§κ° νμ
μμ λλ©νμ΄μ§λ₯Ό μ μν μΌμ΄ μμ΄ μ§μ€νꡬ ν μ¬μ©ν κ² μ΄λ€. κ·Έ μ΄ν λ λλμ μ 곡μ ν΄λ³΄λλ‘ νκ² λ€.
- https://nextjs.org/docs/pages/api-reference/components/image
- https://nextjs.org/docs/pages/building-your-application/optimizing/images
- https://web.dev/cls
- https://ahrefs.com/seo/glossary/srcset