๐ช๋ฉ์ธํ์ด์ง ์ต์ ํํ๊ธฐ
ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ ๋ฉ์ธํ์ด์ง ์์ ์ ํ๊ณ ๋์ ์ฑ๋ฅ ๊ฒ์ฌ๋ฅผ ํ๋ ์ด๋ฏธ์ง๊ฐ ๋ง์์ ๊ทธ๋ฐ์ง ์ข์ง ์์ ์ ์๋ฅผ ๋ฐ๊ณ ์์๋ค.

LCP์์ ์ข์ง ์์ ์ ์๋ฅผ ๋ฐ๊ณ ์์๊ณ , TBT์ SI ์ญ์ ๋น ๋ฅธ ์๋๋ ์๋์๋ค. ์ด์ ๋ํด ๊ฐ์ ์ ์ํ ์ต์ ํ ์์ ์ ์งํํด ๋ณด์๋ค.
lighthouse ์ธก์ ํญ๋ชฉ
FCP(First Contentful Paint): ๋ธ๋ผ์ฐ์ ๊ฐ ์ฒซ ๋ฒ์งธ DOM์ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋ง ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ.
LCP(Largest Contenful Paint): ๋ทฐํฌํธ์์ ๊ฐ์ฅ ํฐ ์ฝํ ์ธ ์์๊ฐ ํ๋ฉด์ ๋ ๋๋ง ๋ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ
TBT(Total Blocking Time): ์น ํ์ด์ง๊ฐ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์๋ตํ์ง ๋ชปํ๋๋ก ์ฐจ๋จ๋ ์๊ฐ
SI(Speed Index): ์ฝํ ์ธ ๊ฐ ์๊ฐ์ ์ผ๋ก ํ์๋๋ ๋ฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ
Cumulative Layout Shift: ๋๋ฆฐ ๋ก๋ฉ, ๋น๋๊ธฐ ๋์, ๋์ DOM ๋ณ๊ฒฝ ๋ฑ์ผ๋ก ๋ ์ด์์์ด ๋ณํ๋ ์๊ฐ
1. Dynamic import ์ ์ฉํ๊ธฐ
์ ์ฒด ํ์ด์ง์ ์ํฅ์ ๋ฏธ์น๋ _app.tsx๋ถํฐ ์ต์ ํ๋ฅผ ์งํํ์๋ค.
ํ์ฌ _app์์๋ ๋ฏธ๋ก๊ทธ์ธ ์ ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ด๋ฆฌ๋ ๋ก๊ทธ์ธ ๋ชจ๋ฌ ์ปดํฌ๋ํธ์ ๋ก๋ฉ ์ ๋ํ๋๋ ๋ก๋ฉ ์ปดํฌ๋ํธ๋ฅผ import ํ๊ณ ์๋ ์ํ์๋ค. ํด๋น ์ปดํฌ๋ํธ๋ค์ ์ฒซ ๋ ๋๋ง์ ํ์ํ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ dynamic import๋ฅผ ์ ์ฉํ์๋ค.
Dynamic Import๋?
ES2020์ ๋ฌธ๋ฒ์ผ๋ก ๋ชจ๋์ ๋น๋ ํ์์ด ์๋ ๋ฐํ์์ ๋ถ๋ฌ์ค๋๋ก ํ๋ค. ๋ฐ๋ผ์ ๋ฒ๋ค ํ์ผ์ ๋ถ๋ฆฌํ๋ฉด์ ์ฒซ ๋ ๋๋ง์ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค. ๊ทธ๋์ ๋ณดํต ์ฒซ ๋ ๋๋ง์ ๋ณด์ฌ์ง์ง ์๋ ์ปดํฌ๋ํธ(๋ชจ๋ฌ ๋ฑ)์ ์ ์ฉํ ์ ์๋ค.
๊ธฐ์กด์๋ promise๋ฅผ ์ฌ์ฉํ์ฌ ์ฒด์ด๋์ ํตํด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ง๋ง next์์๋ dynamic import๋ฅผ ์ํ next/dynamic ๋ชจ๋์ ์ง์ํ์ฌ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- dynamic import ์ ์ฉ ์
//์ด์
import LoginModal from '@/components/auth/LoginModal';
import { LoadingSpinner } from '@/components/common/LoadingSpinner';
- dynamic import ์ ์ฉ ํ
//์ดํ
import dynamic from 'next/dynamic';
const LoginModal = dynamic(() => import('@/components/auth/LoginModal'));
const LoadingSpinner = dynamic(
() => import('@/components/common/LoadingSpinner'),
);
๋ํ ๋ฉ์ธํ์ด์ง์ ํด๋นํ๋ page/index.tsx์์ ํ๋จ์ ์์นํ์ฌ ๋ทฐํฌํธ์ ๋ฐ๋ก ๋ค์ด์ค์ง ์๋ ์ปดํฌ๋ํธ๋ฅผ dynamic import ํ์๋ค.
const RecordFeedList = dynamic(
() => import('@/components/main/mainRecordFeed/RecordFeedList'),
);
์ด๋ฌํ ์์ ์ ํตํด ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ์ค์ผ ์ ์์๋ค!
๋ฉ์ธ ํ์ด์ง๋ ์ฉ๋์ด ์ ๋ฐ์ผ๋ก ์ค์๊ณ _app๊ณผ ๋ค๋ฅธ ํ์ด์ง๋ค์ ๊ฒฝ์ฐ First Load JS ์๊ฐ์ด ๊ฐ์ ๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.


2. ์ด๋ฏธ์ง lazy loading
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ทฐํฌํธ์ ๋ค์ด์ค๋ ์ด๋ฏธ์ง๋ง ๋ถ๋ฌ์ฌ ์ ์๋๋ก lazy loading์ ์ค์ ํ ์ ์๋ค.
img ํ๊ทธ์์ lazy loading ์์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ next/Image์์๋ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋ฐ๋ก loading ์ค์ ์ ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก lazy๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์์๋ค.
๋ฐ๋๋ก ๋ทฐํฌํธ์ ๋ฐ๋ก ๋ค์ด์ค๋ ๋ฉ์ธ ์ด๋ฏธ์ง์ธ ๊ฒฝ์ฐ lazy loading์ ํ๋ฉด ์ค์บ๋์์ ์ด๋ฏธ์ง๋ฅผ ์จ๊ธฐ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ฆ๊ฒ ์์ฒญํ๊ธฐ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด LCP๊ฐ ๋ฆ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ทฐํฌํธ์์ ๋ฐ๋ก ๋ณด์ด๋ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ next/Image์ priority ์ค์ ์ ํตํด lazy loading์ ํด์ ํ๊ณ ์ฐ์ ์์๋ฅผ ๋์ผ ์ ์๋ค.
์ฐธ๊ณ )
next/Image์ priority
true์ธ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๊ฐ ๋์ ์ฐ์ ์์๋ก ๊ฐ์ฃผ๋์ด ๋ฏธ๋ฆฌ ๋ก๋ฉ๋๋ฉฐ ์ง์ฐ๋ก๋ฉ์ด ์๋์ผ๋ก ๋นํ์ฑํ๋๋ค. ๋ทฐํฌํธ ์ฌ์ด์ฆ์ ๋ฐ๋ผ LCP์ ํด๋นํ๋ ์ด๋ฏธ์ง๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์ด๋ฏธ์ง์ ์ ์ฉํ ์ ์๋๋ก ๊ณ ๋ ค๋์ด์ผ ํ๋ค.
<Image
src='/images/main/main-banner.svg'
width={390}
height={274}
alt='๋ฉ์ธ ์๋ด ๋ฐฐ๋'
className='w-full'
priority
/>
3. ์ฌ์ฉํ์ง ์๋ ํฐํธ ์ ๊ฑฐํ๊ธฐ
๊ธฐ๋ณธ ํฐํธ๋ Noto_Sans_KR๋ก next/font/google์์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ๋ค๋ฅธ ํน์ ํฐํธ๋ next/font/local์์ ๊ฐ์ ธ์์ผ ํ๋ค. ๊ทธ๋ฌ๋ ํด๋น ํฐํธ๋ฅผ woff2 ํ์ผ๋ก ์ฌ์ฉํ์์๋ ๋ถ๊ตฌํ๊ณ ์ฉ๋์ด ์๊ฐ๋ณด๋ค ์ปค์ ๋ฐ์์ค๋ ์๊ฐ์ด ๊ธธ์๋ค. ํ์ง๋ง ์ฌ์ฉํ๋ ํ์ด์ง๋ ๋ง์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ _app์์ ์ ์ญ์ผ๋ก import ํ๋ ํฐํธ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์ import ํ๋๋ก ์์ ํ์๋ค.

๊ทธ๋ฌ๋ ์ปดํฌ๋ํธ๋ง๋ค ํฐํธ ์ค์ ํ๋ฉด ์ค๋ณต ์ฝ๋๊ฐ ์๊ธฐ๊ณ ์ดํ์ ์ ์ง๋ณด์๋ ์ด๋ ค์ธ ๊ฒ ๊ฐ์์ ํ๋์ layout ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๊ธฐ๋ก ํ์๋ค.
- ๋ ์ด์์ ์ปดํฌ๋ํธ ์์ฑ
import localFont from 'next/font/local';
import { ReactNode } from 'react';
const prettyNight = localFont({
src: '../../public/fonts/Cafe24Oneprettynight-v2.0.woff2',
weight: '400',
variable: '--prettyNight',
});
function PrettyNightFontLayout({ children }: { children: ReactNode }) {
return <div className={`${prettyNight.variable} h-full`}>{children}</div>;
}
export default PrettyNightFontLayout;
- ๋ ์ด์์ ์ปดํฌ๋ํธ ์ ์ฉ
OnboardingPage.getLayout = function getLayout(page: ReactElement) {
return <PrettyNightFontLayout>{page}</PrettyNightFontLayout>;
};
์ด ์์ ์ ํตํด ํด๋น ํฐํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ์ด์ง์์๋ ๋ก๋ํ์ง ์์์ผ๋ก์จ LCP ์๋๋ฅผ ๊ฐ์ ํ ์ ์์๋ค.
์ต์ ํ ํ ์ฑ๋ฅ ๊ฒ์ฌ


TBT์ SI๊ฐ ๋น ๋ฆ์ผ๋ก ์ฑ๋ฅ์ด ํฅ์๋์๊ณ LCP๋ ์ต์ ์ ์๋์ง๋ง ์ฝ 5์ด ์ ๋ ์ค์ผ ์ ์์๋ค!!
100์ ๊น์ง ์๋์ง๋ง ์ ์๋ฅผ ์ด๋ ์ ๋ ์์ ์ ์ธ ๋ฒ์๊น์ง ์ฌ๋ฆด ์ ์์ด์ ๋งค์ฐ ๊ธฐ์๋ค!! ๐๐
๊ณ์ํด์ ๋ ์ต์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณต๋ถํด ๋ด์ผ๊ฒ ๋ค๐ช
'๊ฐ๋ฐ ๊ณต๋ถ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[nextJS] hydration ์๋ฌ (0) | 2023.08.13 |
---|---|
react slick ํน์ ์ฌ๋ผ์ด๋์์ dots ์์ ๊ธฐ (0) | 2023.07.31 |
[nextJS]์ผ์ ์๊ฐ ์ด์ ๊ฑธ๋ฆฌ๋ ํ์ด์ง ์ด๋๋ง ๋ก๋ฉ ์ฒ๋ฆฌ (0) | 2023.07.23 |
[next + tanstack query] ๋๊ด์ ์ ๋ฐ์ดํธ ์ ์ฉํ๊ธฐ (0) | 2023.07.22 |
๋ฌดํ์คํฌ๋กค ์คํฌ๋กค ์์น ๊ธฐ์ตํ๊ธฐ (0) | 2023.07.10 |
๐ช๋ฉ์ธํ์ด์ง ์ต์ ํํ๊ธฐ
ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ ๋ฉ์ธํ์ด์ง ์์ ์ ํ๊ณ ๋์ ์ฑ๋ฅ ๊ฒ์ฌ๋ฅผ ํ๋ ์ด๋ฏธ์ง๊ฐ ๋ง์์ ๊ทธ๋ฐ์ง ์ข์ง ์์ ์ ์๋ฅผ ๋ฐ๊ณ ์์๋ค.

LCP์์ ์ข์ง ์์ ์ ์๋ฅผ ๋ฐ๊ณ ์์๊ณ , TBT์ SI ์ญ์ ๋น ๋ฅธ ์๋๋ ์๋์๋ค. ์ด์ ๋ํด ๊ฐ์ ์ ์ํ ์ต์ ํ ์์ ์ ์งํํด ๋ณด์๋ค.
lighthouse ์ธก์ ํญ๋ชฉ
FCP(First Contentful Paint): ๋ธ๋ผ์ฐ์ ๊ฐ ์ฒซ ๋ฒ์งธ DOM์ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋ง ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ.
LCP(Largest Contenful Paint): ๋ทฐํฌํธ์์ ๊ฐ์ฅ ํฐ ์ฝํ ์ธ ์์๊ฐ ํ๋ฉด์ ๋ ๋๋ง ๋ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ
TBT(Total Blocking Time): ์น ํ์ด์ง๊ฐ ์ฌ์ฉ์์ ์ ๋ ฅ์ ์๋ตํ์ง ๋ชปํ๋๋ก ์ฐจ๋จ๋ ์๊ฐ
SI(Speed Index): ์ฝํ ์ธ ๊ฐ ์๊ฐ์ ์ผ๋ก ํ์๋๋ ๋ฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ
Cumulative Layout Shift: ๋๋ฆฐ ๋ก๋ฉ, ๋น๋๊ธฐ ๋์, ๋์ DOM ๋ณ๊ฒฝ ๋ฑ์ผ๋ก ๋ ์ด์์์ด ๋ณํ๋ ์๊ฐ
1. Dynamic import ์ ์ฉํ๊ธฐ
์ ์ฒด ํ์ด์ง์ ์ํฅ์ ๋ฏธ์น๋ _app.tsx๋ถํฐ ์ต์ ํ๋ฅผ ์งํํ์๋ค.
ํ์ฌ _app์์๋ ๋ฏธ๋ก๊ทธ์ธ ์ ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ด๋ฆฌ๋ ๋ก๊ทธ์ธ ๋ชจ๋ฌ ์ปดํฌ๋ํธ์ ๋ก๋ฉ ์ ๋ํ๋๋ ๋ก๋ฉ ์ปดํฌ๋ํธ๋ฅผ import ํ๊ณ ์๋ ์ํ์๋ค. ํด๋น ์ปดํฌ๋ํธ๋ค์ ์ฒซ ๋ ๋๋ง์ ํ์ํ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ dynamic import๋ฅผ ์ ์ฉํ์๋ค.
Dynamic Import๋?
ES2020์ ๋ฌธ๋ฒ์ผ๋ก ๋ชจ๋์ ๋น๋ ํ์์ด ์๋ ๋ฐํ์์ ๋ถ๋ฌ์ค๋๋ก ํ๋ค. ๋ฐ๋ผ์ ๋ฒ๋ค ํ์ผ์ ๋ถ๋ฆฌํ๋ฉด์ ์ฒซ ๋ ๋๋ง์ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค. ๊ทธ๋์ ๋ณดํต ์ฒซ ๋ ๋๋ง์ ๋ณด์ฌ์ง์ง ์๋ ์ปดํฌ๋ํธ(๋ชจ๋ฌ ๋ฑ)์ ์ ์ฉํ ์ ์๋ค.
๊ธฐ์กด์๋ promise๋ฅผ ์ฌ์ฉํ์ฌ ์ฒด์ด๋์ ํตํด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ง๋ง next์์๋ dynamic import๋ฅผ ์ํ next/dynamic ๋ชจ๋์ ์ง์ํ์ฌ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- dynamic import ์ ์ฉ ์
//์ด์
import LoginModal from '@/components/auth/LoginModal';
import { LoadingSpinner } from '@/components/common/LoadingSpinner';
- dynamic import ์ ์ฉ ํ
//์ดํ
import dynamic from 'next/dynamic';
const LoginModal = dynamic(() => import('@/components/auth/LoginModal'));
const LoadingSpinner = dynamic(
() => import('@/components/common/LoadingSpinner'),
);
๋ํ ๋ฉ์ธํ์ด์ง์ ํด๋นํ๋ page/index.tsx์์ ํ๋จ์ ์์นํ์ฌ ๋ทฐํฌํธ์ ๋ฐ๋ก ๋ค์ด์ค์ง ์๋ ์ปดํฌ๋ํธ๋ฅผ dynamic import ํ์๋ค.
const RecordFeedList = dynamic(
() => import('@/components/main/mainRecordFeed/RecordFeedList'),
);
์ด๋ฌํ ์์ ์ ํตํด ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ์ค์ผ ์ ์์๋ค!
๋ฉ์ธ ํ์ด์ง๋ ์ฉ๋์ด ์ ๋ฐ์ผ๋ก ์ค์๊ณ _app๊ณผ ๋ค๋ฅธ ํ์ด์ง๋ค์ ๊ฒฝ์ฐ First Load JS ์๊ฐ์ด ๊ฐ์ ๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.


2. ์ด๋ฏธ์ง lazy loading
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ทฐํฌํธ์ ๋ค์ด์ค๋ ์ด๋ฏธ์ง๋ง ๋ถ๋ฌ์ฌ ์ ์๋๋ก lazy loading์ ์ค์ ํ ์ ์๋ค.
img ํ๊ทธ์์ lazy loading ์์ฑ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ next/Image์์๋ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋ฐ๋ก loading ์ค์ ์ ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก lazy๊ฐ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ง์ ํด์ฃผ์ง ์์๋ค.
๋ฐ๋๋ก ๋ทฐํฌํธ์ ๋ฐ๋ก ๋ค์ด์ค๋ ๋ฉ์ธ ์ด๋ฏธ์ง์ธ ๊ฒฝ์ฐ lazy loading์ ํ๋ฉด ์ค์บ๋์์ ์ด๋ฏธ์ง๋ฅผ ์จ๊ธฐ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ฆ๊ฒ ์์ฒญํ๊ธฐ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด LCP๊ฐ ๋ฆ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ทฐํฌํธ์์ ๋ฐ๋ก ๋ณด์ด๋ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ next/Image์ priority ์ค์ ์ ํตํด lazy loading์ ํด์ ํ๊ณ ์ฐ์ ์์๋ฅผ ๋์ผ ์ ์๋ค.
์ฐธ๊ณ )
next/Image์ priority
true์ธ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๊ฐ ๋์ ์ฐ์ ์์๋ก ๊ฐ์ฃผ๋์ด ๋ฏธ๋ฆฌ ๋ก๋ฉ๋๋ฉฐ ์ง์ฐ๋ก๋ฉ์ด ์๋์ผ๋ก ๋นํ์ฑํ๋๋ค. ๋ทฐํฌํธ ์ฌ์ด์ฆ์ ๋ฐ๋ผ LCP์ ํด๋นํ๋ ์ด๋ฏธ์ง๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ฌ๋ฌ ์ด๋ฏธ์ง์ ์ ์ฉํ ์ ์๋๋ก ๊ณ ๋ ค๋์ด์ผ ํ๋ค.
<Image
src='/images/main/main-banner.svg'
width={390}
height={274}
alt='๋ฉ์ธ ์๋ด ๋ฐฐ๋'
className='w-full'
priority
/>
3. ์ฌ์ฉํ์ง ์๋ ํฐํธ ์ ๊ฑฐํ๊ธฐ
๊ธฐ๋ณธ ํฐํธ๋ Noto_Sans_KR๋ก next/font/google์์ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ๋ค๋ฅธ ํน์ ํฐํธ๋ next/font/local์์ ๊ฐ์ ธ์์ผ ํ๋ค. ๊ทธ๋ฌ๋ ํด๋น ํฐํธ๋ฅผ woff2 ํ์ผ๋ก ์ฌ์ฉํ์์๋ ๋ถ๊ตฌํ๊ณ ์ฉ๋์ด ์๊ฐ๋ณด๋ค ์ปค์ ๋ฐ์์ค๋ ์๊ฐ์ด ๊ธธ์๋ค. ํ์ง๋ง ์ฌ์ฉํ๋ ํ์ด์ง๋ ๋ง์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ _app์์ ์ ์ญ์ผ๋ก import ํ๋ ํฐํธ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์ import ํ๋๋ก ์์ ํ์๋ค.

๊ทธ๋ฌ๋ ์ปดํฌ๋ํธ๋ง๋ค ํฐํธ ์ค์ ํ๋ฉด ์ค๋ณต ์ฝ๋๊ฐ ์๊ธฐ๊ณ ์ดํ์ ์ ์ง๋ณด์๋ ์ด๋ ค์ธ ๊ฒ ๊ฐ์์ ํ๋์ layout ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๊ธฐ๋ก ํ์๋ค.
- ๋ ์ด์์ ์ปดํฌ๋ํธ ์์ฑ
import localFont from 'next/font/local';
import { ReactNode } from 'react';
const prettyNight = localFont({
src: '../../public/fonts/Cafe24Oneprettynight-v2.0.woff2',
weight: '400',
variable: '--prettyNight',
});
function PrettyNightFontLayout({ children }: { children: ReactNode }) {
return <div className={`${prettyNight.variable} h-full`}>{children}</div>;
}
export default PrettyNightFontLayout;
- ๋ ์ด์์ ์ปดํฌ๋ํธ ์ ์ฉ
OnboardingPage.getLayout = function getLayout(page: ReactElement) {
return <PrettyNightFontLayout>{page}</PrettyNightFontLayout>;
};
์ด ์์ ์ ํตํด ํด๋น ํฐํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ์ด์ง์์๋ ๋ก๋ํ์ง ์์์ผ๋ก์จ LCP ์๋๋ฅผ ๊ฐ์ ํ ์ ์์๋ค.
์ต์ ํ ํ ์ฑ๋ฅ ๊ฒ์ฌ


TBT์ SI๊ฐ ๋น ๋ฆ์ผ๋ก ์ฑ๋ฅ์ด ํฅ์๋์๊ณ LCP๋ ์ต์ ์ ์๋์ง๋ง ์ฝ 5์ด ์ ๋ ์ค์ผ ์ ์์๋ค!!
100์ ๊น์ง ์๋์ง๋ง ์ ์๋ฅผ ์ด๋ ์ ๋ ์์ ์ ์ธ ๋ฒ์๊น์ง ์ฌ๋ฆด ์ ์์ด์ ๋งค์ฐ ๊ธฐ์๋ค!! ๐๐
๊ณ์ํด์ ๋ ์ต์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณต๋ถํด ๋ด์ผ๊ฒ ๋ค๐ช
'๊ฐ๋ฐ ๊ณต๋ถ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[nextJS] hydration ์๋ฌ (0) | 2023.08.13 |
---|---|
react slick ํน์ ์ฌ๋ผ์ด๋์์ dots ์์ ๊ธฐ (0) | 2023.07.31 |
[nextJS]์ผ์ ์๊ฐ ์ด์ ๊ฑธ๋ฆฌ๋ ํ์ด์ง ์ด๋๋ง ๋ก๋ฉ ์ฒ๋ฆฌ (0) | 2023.07.23 |
[next + tanstack query] ๋๊ด์ ์ ๋ฐ์ดํธ ์ ์ฉํ๊ธฐ (0) | 2023.07.22 |
๋ฌดํ์คํฌ๋กค ์คํฌ๋กค ์์น ๊ธฐ์ตํ๊ธฐ (0) | 2023.07.10 |