โ ๏ธ ์ ๋ฆฌํ ๋ด์ฉ์ ์คํ๋ ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค. ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ค์ด๊ฐ๊ธฐ ์ ์ next/image ์ ์ฉํ๊ธฐ ์ ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋๋ก ํ์.
๋ฉ์ธ ํ์ด์ง์ ์ํ ์ฌ์ง๋ค์ ์ ์ฉ๋ ์ฝ๋์ด๋ค. ์๋์ ๊ฐ์ด chakra-ui ๋ฅผ ์ฌ์ฉํ๋ฉด์ Image ํ๊ทธ๋ฅผ ์ ์ฉํ ๋ชจ์ต์ด๋ค.
import { Image } from '@chakra-ui/react';
const CardProductImage = ({ alt, src }: CardProductImageProps) => {
return (
<Image alt={alt} src={src} />
);
};
๋ค๋ง, ์ด๋ ๊ฒ ์ ์ฉํ์์ ๋ ๋ฉ์ธํ์ด์ง์ ์ฌ์ง๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ํ๋์ฉ ๋๋ฆฌ๊ฒ ๋ก๋ฉ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ํ, lighthouse์ ํผํฌ๋จผ์ค ์ง์๊ฐ ๋ฎ์ ์ด์ ๋ ์ดํด๋ณด๋ ํ์ผ ์ฉ๋์ด ํฌ๊ณ ํด์๋๊ฐ ๋งค์ฐ ๋์ ์ด๋ฏธ์ง๋ค์ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด์๋ค.
์ํ ์นด๋ ์ด๋ฏธ์ง๋ง ํด๋ ๋ฉ์ธ ํ์ด์ง, ๊ฒ์, ๋ด๊ฐ ํ๋งคํ ์ํ, ์ฐํ ์ํ, ๋์ฐฐ๋ ์ํ ํ์ด์ง ๋ฑ ๋ง์ ๊ณณ์ ์ ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ด ํ์ํ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก next/image์ loading
์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ lazy
์ด๋ค.
์ฌ์ฉ์๊ฐ ์ก ํ์ด์ง๋ฅผ ์ด๋ฉด ์ ์ฒด ํ์ด์ง์ ๋ด์ฉ์ด ๋ค์ด๋ก๋ ๋์ด ๋จ์ผ ์ด๋์ผ๋ก ๋ ๋๋ง์ด ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฌดํ ์คํฌ๋กค์ ๊ตฌํํ์์ ๋ ๋ชจ๋ ์คํฌ๋กค์ ๋ด์ฉ์ ํ ์คํฌ๋ฆฐ ์์ ๋ณผ ์ ์๋ค. ๋ฐ๋ผ์ ํ์ด์ง์ ์ ๊ทผํ ๋ ์ฌ์ฉ์๊ฐ ํ์ํ ํ์ด์ง์ ์ผ๋ถ๋ง ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ๋ ๊ฒ์ด๋ค.
-> ์ฒ์ ์์๋๋ฐ lazy loading๋ ๊ฒ์ ์์ง ์์์ ์ํฅ์ ๋ฏธ์น๋ค๊ณ ํ๋ค. ์น ํ์ด์ง์ ์ ์ฒด ๊ตฌ์ฑ ์์๋ฅผ ๋๋ฆฌ๊ฒ ๋ก๋ํ๋ฉด ๊ฒ์ ์์ง์ด ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ์ฐํํ์ฌ ์ฝํ ์ธ ๊ฐ ์ธ๋ฑ์ฑ ๋์ง ์์ ์์ง ๊ฒฐ๊ณผ๊ฐ ์ค์ด๋ค ์ ์๋ค.
์ด๋ฌํ lazy loading์ ๋จ์ํ Next/Image๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
layout="intrinsic"
์ด๋ฏธ์ง๋ ๋ ์์ ๋ทฐํฌํธ์ ๊ฒฝ์ฐ ํฌ๊ธฐ๋ฅผ ์ถ์ํ์ง๋ง ๋ ํฐ ๋ทฐํฌํธ์ ๊ฒฝ์ฐ ์๋ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ค.
layout="fixed"
๋ทฐํฌํธ์ ์๊ด ์์ด ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ width, height ์์ฑ์ผ๋ก ๊ณ ์ ํ๋ค.
layout="responsive"
์ด๋ฏธ์ง๋ ๋ ์์ ๋ทฐํฌํธ์ ๊ฒฝ์ฐ ํฌ๊ธฐ๋ฅผ ์ถ์ํ์ง๋ง ๋ ํฐ ๋ทฐํฌํธ์ ๊ฒฝ์ฐ ํฌ๊ธฐ๊ฐ ๋์ด๋๋ค. ์ฆ, ์ด๋ฏธ์ง ๋น์จ์ด ์ ์ง๋๋ค.
layout="fill"
relative position์ ๊ฐ์ง ์กฐ์์ width, height์ ๋์ผํ๊ฒ์กฐ์ ๋๋ค.
์ด ์์ฑ๋ค์ ์ ์ฉํ๊ฒ ๋๋ฉด width์ height๋ layout ์์ฑ์ ๋ง๊ฒ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
์์ ๋ ์์ฑ์ ์ฌ์ฉํด์ ์๋์ฒ๋ผ ์ ์ฉํ์๋ค.
import Image from 'next/image';
const CardProductImage = ({ alt, src }: CardProductImageProps) => {
return <Image
layout="fixed"
objectFit="cover"
width={114}
height={114}
alt={alt}
src={src}
/>
};
๊ธฐ๋ณธ Image ํ๊ทธ
๊ธฐ๋ณธ chakra-ui์ Imageํ๊ทธ ์ฆ, ๊ธฐ๋ณธ img ํ๊ทธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด 722ms ~1000ms ๊น์ง ์ฝ 300ms ์ ๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
next/image ์ ์ฉ
40ms์ ๋๋ก ๋ฌด๋ ค 260ms์ ๋๋ ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ธฐ๋ณธ Image ํ๊ทธ
next/image ์ ์ฉ
๋ค์๊ณผ ์ด๋ฏธ์ง ์ฌ์ด์ฆ์ ์์ฒญ ์๊ฐ์ด ์ค์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค! ๋ํ webpํฌ๋งท์ ์ฌ์ฉ๋ ๊ฒ๋ ํ์ธํ ์ ์๋ค.
๋ฉ์ธํ์ด์ง์ ์ฌ์ง๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ํ๋์ฉ ๋๋ฆฌ๊ฒ ๋ก๋ฉ๋์๋ ๋ถ๋ถ์ด ๋ค์๊ณผ ๊ฐ์ด ๋นจ๋ผ์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
๋จ์ง image๋ฅผ next/imageํ๊ทธ๋ก ๋ณ๊ฒฝํด์ ์ ์ฉํ์ ๋ฟ์ธ๋ฐ ์ด๋ฏธ์ง๊ฐ ์ผ๋ง ์์์๋ ๋ถ๊ตฌํ๊ณ 300ms๋ ๊ฐ์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์๊ณ ์ฑ๋ฅ์ด ๋งค์ฐ ํฅ์๋ ๊ฒ์ ์ง์ ํ์ธํ ์ ์์ด์ ๋๋ฌด ์ข์๋ค. ๋ด ์์ผ๋ก ํผํฌ๋จผ์ค ์์น๋ฅผ ์ด๋ ๊ฒ ์ฌ๋ ค๋ณธ ์ ์ด ์ฒ์์ด๋ผ ๋งค์ฐ ์ง๋ฆฟํ๋ค.