loding.js (์ง์ฐ)
1. ์ ์
2. ์ฐธ๊ณ ์์
3. ํ์ผ์ ์์น
4. suspense & streamed Response๋ฅผ ์ด์ฉํ ์ธ๋ถํ ๋ก๋ฉ์ํ ๊ด๋ฆฌ
์์ธ
1. ์ ์
: loading.js ํ์ผ์ Suspense ๊ธฐ๋ฐ์ ์ฆ๊ฐ์ ์ธ ๋ก๋ฉ ์ํ๋ฅผ ์์ฑํ ์ ์์.
- ๊ธฐ๋ณธ์ ์ผ๋ก Server side ์ด์ง๋ง 'use client'; ๋ฅผ ์ฃผ๋ฉฐ client side ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
=> Data๋ฅผ ํธ์ถํ๋ ํ์ด์ง์์ ํ์ด์ง์ ์๋ก๊ณ ์นจ์ ํ ๋ ์ง์ฐ(loading.js)์๊ฐ์ ๋๊ฒ ๋๋ฉด, ํ์ด์ง๊ฐ ๊น๋นก์ด๋ฉฐ ๋ํ๋๊ฒ ๋๋ค.
=> ๊ทธ๋ฌ๋, ์๋ก ๋ค๋ฅธ ํ์ด์ง๊ฐ์ ์ด๋์์๋ ๊น๋นก์์์ด ํ์ด์ง๊ฐ ์ ํ์ด ์ด๋ค์ง๋ค.
>> โ
๊ทธ ์ด์ ๋, NEXT๋ ์์ฃผ ๊ฐ๋ ฅํ ์บ์ฑ์ ํ๋๋ฐ, ํ์ด์ง์ ์ฒซ ์ ์ ๋์ ํ๋ฉด๊ตฌ์ฑ์ด๋ฉฐ ๋ฐ์ดํฐ ๋ฑ ๋ชจ๋ ๊ฒ์ ์บ์ฑํ๋ค.
2. ์ฐธ๊ณ ์์
// loading.js
export default function Loading() {
// Or a custom loading skeleton component
return <p>Loading...</p>
}
- ํ์ผ๋ช ์ ํ์ผ๊ท์น์ loading.js ๋ก ๊ณ ์ !
3. ํ์ผ์ ์์น
case1) project/app/loading.js
=> ๋ชจ๋ ํ์ด์ง์ ๋ ์ด์์์ ์ ์ฉ๋์ด ๋ฒ๋ฆผ
case2) project/app/ํน์ ์ปดํฌ๋ํธ/loading.js
=> ํน์ ์ปดํฌ๋ํธ ํ์ด์ง์ ๋ ์ด์์์๋ง ์ ์ฉ๋จ
4. suspense & streamed Response๋ฅผ ์ด์ฉํ ์ธ๋ถํ ๋ก๋ฉ์ํ ๊ด๋ฆฌ
๋ชฉ์ : Data๋ฅผ ๊ฐ์ ธ์ค๋ ๋ถ๋ถ์ ๋ถ๋ฆฌ๋ ์ปดํฌ๋ํธ๋ก ์์์์ฑ
- 1) ๋ถ๋ฆฌ์ํจ ์ปดํฌ๋ํธ๋ฅผ React์ ๋ด์ฅ๋ ์ปดํฌ๋ํธ <Suspense>๋ก ๋ํ(wrapping) ํ ์ ์๋ค.
<Suspense> : react ์์ ์ ๊ณตํด์ฃผ๋ ์ปดํฌ๋ํธ, ์ผ๋ถ ๋ฐ์ดํฐ or ๋ฆฌ์์ค๊ฐ ๋ถ๋ ค์ง ๋๊น์ง ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋์ฒด ์ปจํ ์ธ ๋ฅผ ํ์.
// data ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ๋ฅผ ์๋ก ์์ฑํด์ค๋ค
โผ๏ธ async function Meals() { // ๊ธฐ๋ณธ์ ์ผ๋ก server ์ปดํฌ๋ํธ์ด๊ธฐ์ async ์ฌ์ฉ
โผ๏ธ const meals = await getMeals(); // ๊ทธ๋ฆฌ๊ณ data๋ฅผ ๋ฐ์ ์ค๋น
โผ๏ธ return <MealsGrid meals={meals}/> // meals-item์ grid์ map์ผ๋ก ๊ทธ๋ฆฌ๊ณ grid๋ฅผ page์ ํ์ํ ๊ฑด๋ฐ, ํ์ฌ๋ ๋น๋ฐฐ์ด
โผ๏ธ }
==> ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ Promise๋ฅผ ๋ฐํํด์ค๋ค.
==> ์๊ฐ์ ์ปดํฌ๋ํธ๊ฐ suspense๋ฅผ ์ ๋ํด์ ๋ก๋ฉ์ด ๋๋ ๋๊น์ง ๋๋จธ์ง ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ํ๊ทธ๋ด์ ๋ด๊ธด ์ปดํฌ๋ํธ(loading ๊ด๋ จ)๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๋ค.
==> โผ๏ธ ์์ฑ : fallback={} ์ ์ฃผ๋ฉด ๋๊ณ , ๊ทธ ์ฌ์ด์ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด์ค๋ค.
export default async function MealsPage() {
return (
<>
<header className={classes.header}>
<h1>
Delicious meals, created <span className={classes.highlight}>by you</span>
</h1>
<p>Choose your favorite recipe and cook it yourself. It is easy and fun</p>
<p className={classes.cta}>
<Link href="/meals/share">
Share Your Favorite Recipe
</Link>
</p>
</header>
<main className={classes.main}>
โผ๏ธ <Suspense fallback={<p className={classes.loading}>Fetching meals...</p>}>
<Meals/>
โผ๏ธ </Suspense>
</main>
</>
);
}
'๐ป DEV > NextJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NEXT.js 14] 4. Font ๋ฐ๊พธ๊ธฐ (0) | 2024.06.17 |
---|---|
[NEXT.js 14] 3. CSS ์ฌ์ฉ 2๊ฐ์ง ๋ฐฉ๋ฒ (css module ์์ / global.css : tailwind css) (0) | 2024.06.14 |
[NEXT.js 14] 1. Image ํ๊ทธ ๊ด๋ จ <Image> (0) | 2024.06.11 |
[Next.js 13] ์ปดํฌ๋ํธ ์์ฑ ํ, page์์ ์ปดํฌ๋ํธ์ <HTML> ํ๊ทธ, ์์ฑ๊ฐ ์ฌ์ฉ๋ฒ (0) | 2023.09.27 |
[Next.js 13] tailwind css Plugin ์์ฑ & ์ ์ฉ (0) | 2023.09.27 |
๋๊ธ