ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ Next.js์์ Lazy Loading ๊ตฌํ ๊ฐ์ด๋
Next.js๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ปดํฌ๋ํธ, ์ด๋ฏธ์ง, ์ธ๋ถ ์คํฌ๋ฆฝํธ ๋ฑ์ ์ง์ฐ ๋ก๋ฉ(Lazy Loading) ํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ด ๊ฐ์ด๋๋ App Router ํ๊ฒฝ์์ Lazy Loading์ ์ ์ฉํ๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
โ 1. next/dynamic์ ํ์ฉํ ์ปดํฌ๋ํธ Lazy Loading
Next.js์ next/dynamic ํจ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
'use client';
import dynamic from 'next/dynamic';
const LazyComponent = dynamic(() => import('./components/LazyComponent'), {
loading: () => <p>๋ก๋ฉ ์ค...</p>,
ssr: false, // ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๋นํ์ฑํ
});
export default function Page() {
return (
<div>
<h1>๋ฉ์ธ ํ์ด์ง</h1>
<LazyComponent />
</div>
);
}
์ต์ ์ค๋ช
loading | ๋ก๋ฉ ์ค ๋ณด์ฌ์ค ์ปดํฌ๋ํธ |
ssr: false | ํด๋ผ์ด์ธํธ์์๋ง ๋ก๋ฉํ๋๋ก ์ค์ |
โ 2. React.lazy + Suspense
React์ ๊ณต์ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ํ์ฉํ ์ ์์ผ๋ฉฐ, Suspense๋ฅผ ํตํด ๋ก๋ฉ ์ค UI๋ฅผ ํ์ํฉ๋๋ค.
'use client';
import { lazy, Suspense } from 'react';
const LazyComponent = lazy(() => import('./components/LazyComponent'));
export default function Page() {
return (
<Suspense fallback={<p>๋ก๋ฉ ์ค...</p>}>
<LazyComponent />
</Suspense>
);
}
App Router์์๋ ๋๋ถ๋ถ next/dynamic์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ถ์ฅ๋ฉ๋๋ค.
โ 3. ์ด๋ฏธ์ง Lazy Loading
Next.js์ next/image ์ปดํฌ๋ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Lazy Loading์ด ์ ์ฉ๋์ด ์์ต๋๋ค.
import Image from 'next/image';
export default function Page() {
return (
<Image
src="/images/banner.jpg"
alt="Banner"
width={800}
height={500}
/>
);
}
์ค์ํ ์ด๋ฏธ์ง์๋ priority ์์ฑ์ ์ถ๊ฐํ์ฌ ์ฆ์ ๋ก๋ฉ๋๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
<Image src="/hero.jpg" alt="Hero" width={1200} height={700} priority />
โ 4. Intersection Observer ๊ธฐ๋ฐ Lazy Loading
๋ธ๋ผ์ฐ์ ์ IntersectionObserver API๋ฅผ ํ์ฉํ๋ฉด ๋ทฐํฌํธ์ ๋ค์ด์์ ๋๋ง ๋ก๋ฉํ๋ ๋ฐฉ์๋ ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
'use client';
import { useEffect, useRef, useState } from 'react';
import dynamic from 'next/dynamic';
const LazyComponent = dynamic(() => import('./components/LazyComponent'), { ssr: false });
export default function Page() {
const ref = useRef(null);
const [show, setShow] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
setShow(true);
observer.disconnect();
}
});
if (ref.current) {
observer.observe(ref.current);
}
return () => observer.disconnect();
}, []);
return (
<div>
<h1>Intersection Observer ์์ </h1>
<div ref={ref}>{show && <LazyComponent />}</div>
</div>
);
}
โ 5. ๋ผ์ฐํธ ๊ธฐ๋ฐ Lazy Loading
Next.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ํ์ด์ง๋ง๋ค ์ฝ๋ ์คํ๋ฆฌํ
์ด ์ ์ฉ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํ์ด์ง ์ ํ ์, ํด๋น ํ์ด์ง์ ์ฝ๋๋ง ๋ก๋๋ฉ๋๋ค.
import Link from 'next/link';
<Link href="/about">About ํ์ด์ง ์ด๋</Link>
๊ธฐ๋ฅ ์ค๋ช
๊ธฐ๋ณธ prefetch | ํ์ด์ง ์ง์ ์ ์ ์ฝ๋ ๋ฏธ๋ฆฌ ๋ก๋ฉ๋จ |
๋นํ์ฑํ | <Link prefetch={false} /> |
โ 6. ์ธ๋ถ ์คํฌ๋ฆฝํธ Lazy Loading
next/script ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ฐ ๋ก๋ฉํ ์ ์์ต๋๋ค.
import Script from 'next/script';
strategy ์ค๋ช
beforeInteractive | Next.js ์ฝ๋๋ณด๋ค ๋จผ์ ๋ก๋ฉ |
afterInteractive | ๊ธฐ๋ณธ๊ฐ, ๋ ๋ ์ดํ ๋ก๋ฉ |
lazyOnload | ๋ธ๋ผ์ฐ์ ์ ํด ์ํ์์ ๋ก๋ฉ |
โ ์์ฝ
ํญ๋ชฉ ์ ์ฉ ๋ฐฉ๋ฒ
์ปดํฌ๋ํธ Lazy Loading | next/dynamic, React.lazy + Suspense |
์ด๋ฏธ์ง Lazy Loading | next/image (๊ธฐ๋ณธ ์ ์ฉ๋จ) |
Intersection Observer ํ์ฉ | ํน์ ๋ทฐํฌํธ ์ง์ ์ ๋ก๋ฉ |
๋ผ์ฐํธ ๊ธฐ๋ฐ Lazy Loading | ์๋ ์ฝ๋ ์คํ๋ฆฌํ ์ ์ฉ |
์ธ๋ถ ์คํฌ๋ฆฝํธ Lazy Loading | next/script์ strategy ์์ฑ ์ฌ์ฉ |
Next.js, Lazy Loading, ์ฝ๋ ์คํ๋ฆฌํ , ํผํฌ๋จผ์ค ์ต์ ํ, ์ด๋ฏธ์ง ์ต์ ํ, React Suspense, next/dynamic, Intersection Observer, Script Lazy Load, SEO ์ต์ ํ, App Router
'framework > NextJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ Next.js์์ MDX ์ฌ์ฉ ๊ฐ์ด๋ (0) | 2025.05.26 |
---|---|
๐งช Next.js ๋ก์ปฌ ๊ฐ๋ฐ(Local Development) ๊ฐ์ด๋ (0) | 2025.05.23 |
๐ Next.js์์ JSON-LD ์ฌ์ฉ ๊ฐ์ด๋ (0) | 2025.05.21 |
๐ Next.js Instrumentation ๊ฐ์ด๋: ์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ ๊ด์ธก์ฑ ์ค์ (0) | 2025.05.20 |
๐ Next.js ํ๊ฒฝ ๋ณ์ ์ค์ ๊ฐ์ด๋ (0) | 2025.05.19 |
- Total
- Today
- Yesterday
- kotlin
- fastapi
- SEO ์ต์ ํ
- Docker
- Prisma
- ๋ฅ๋ฌ๋
- Next.js
- SEO์ต์ ํ
- Python
- nodejs
- ๋ฐฑ์๋๊ฐ๋ฐ
- ํ๋ก ํธ์๋
- PostgreSQL
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- CI/CD
- REACT
- nextJS
- ํ๋ก ํธ์๋๋ฉด์
- ์น๊ฐ๋ฐ
- seo ์ต์ ํ 10๊ฐ
- Webpack
- JAX
- AI์ฑ๋ด
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- Ktor
- gatsbyjs
- App Router
- llm
- NestJS
- rag
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |