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