์นํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์ด๋ฏธ์ง๊ฐ ์ง์ง ๋ง๋ค.
ํนํ ๋ฐ์ํ ์น, ์ธ๋ค์ผ ๋ฆฌ์คํธ, ๊ฒ์๊ธ ๋ชฉ๋ก ๋ฑ์์๋ ์์ญ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ํ ๋ฒ์ ๋ก๋ฉํ ์๋ ์๋ค.
๊ทธ๋์ ์ด๋ฏธ์ง ์ต์ ํ๋ ํ์ด์ง ๋ก๋ฉ ์๋์ UX์ ์ง์ ์ ์ธ ์ํฅ์ ์ค๋ค.
์ฌ์ฉ์๊ฐ ์คํฌ๋กค๋ก ํด๋น ์์น์ ๋๋ฌํ์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์
<img src="thumbnail.jpg" loading="lazy" alt="์ธ๋ค์ผ" />
LCP
๊ฐ์ ํจ๊ณผloading="lazy"
๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด์ง๋ง,
๋ ์ปค์คํฐ๋ง์ด์ง์ด ํ์ํ๋ค๋ฉด IntersectionObserver
๋ฅผ ์ฐ๋ฉด ์ข๋ค.
useEffect(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
}
});
});
const imgs = document.querySelectorAll('img[data-src]');
imgs.forEach(img => observer.observe(img));
}, []);
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก next/image
์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ค.
import Image from 'next/image';
<Image
src="/thumbnail.jpg"
alt="์ธ๋ค์ผ"
width={400}
height={300}
priority={false}
loading="lazy"
/>
blurDataURL
๋ก ํ๋ฆฌ๋ก๋ฉ ํจ๊ณผ ๊ฐ๋ฅ<picture>
ํ๊ทธ๋ก ๋ธ๋ผ์ฐ์ ๋ณ ํฌ๋งท ์ต์ ํ ์ ๊ณต<picture>
<source srcset="image.webp" type="image/webp" />
<source srcset="image.jpg" type="image/jpeg" />
<img src="image.jpg" alt="์ด๋ฏธ์ง ์ค๋ช
" />
</picture>
๊ฐ๋ฐํ ๋๋ โ์ด๋ฏธ์ง ๋ฃ๋ ๊ฑฐ ์ด๋ ต์ง ์์งโ๋ผ๊ณ ์๊ฐํ๋๋ฐ,
๋ชจ๋ฐ์ผ ํ๊ฒฝ, ๋๋ฆฐ ๋คํธ์ํฌ, SEO๊น์ง ๊ณ ๋ คํ๋ฉด ๋จ์ํ img
ํ๋์๋ ์ ๋ต์ด ํ์ํ๋ค๋ ๊ฑธ ๋๊ผ๋ค.
ํนํ next/image
๋ฅผ ์ฐ๋ฉด์ ์ผ๋ง๋ ๋ง์ ์ต์ ํ๊ฐ ์๋์ผ๋ก ๋๋์ง ๋ณด๊ณ ๊ฐํํจ...
๐ท โ์ด๋ฏธ์ง๋ ๋ณด์ด๋ ๊ฒ ์ด์์ผ๋ก, ํ์ด์ง ์๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฒฐ์ ์ง๋๋ค.โ