App Router
// This request should be cached until manually invalidated.
// Similar to `getStaticProps`.
// `force-cache` is the default and can be omitted.
fetch(URL, { cache: 'force-cache' }); //ssg
// This request should be refetched on every request.
// Similar to `getServerSideProps`.
fetch(URL, { cache: 'no-store' }); //ssr
// This request should be cached with a lifetime of 10 seconds.
// Similar to `getStaticProps` with the `revalidate` option.
fetch(URL, { next: { revalidate: 10 } }); // isr(Incremental Static Regeneration)
// app/page.js
import Image from 'next/image';
export default function Home() {
return (
<>
<h2>Welcome</h2>
Hello, WEB!
</>
);
}
// app/layout.js
import Link from 'next/link';
import './globals.css';
import Image from 'next/image';
export const metadata = {
title: 'Create Next App',
description: 'Generated by create next app',
};
export default function RootLayout({ children }) {
return (
<html>
<body>
<h1>
<Link href='/'>WEB</Link>
</h1>
<ol>
<li>
<Link href='/read/1'>html</Link>
</li>
<li>
<Link href='/read/2'>css</Link>
</li>
</ol>
{children}
<ul>
<li>
<Link href='/create'>Create</Link>
</li>
<li>
<Link href='/update/1'>Update</Link>
</li>
<li>
<input type='button' value='delete' />
</li>
</ul>
</body>
</html>
);
}
코드 스플리팅: 애플리케이션의 자바스크립트 코드를 여러 개의 작은 부분으로 나누어 로딩하는 기술. 초기 로딩 시간을 최적화하고 성능을 향상시킬 수 있는 장점이 있다.
next.js app router는 기본적으로 코드 스플리팅을 제공하지만 이는 페이지 단위의 코드 스플리팅입니다.
코드 분할(Code Splitting)은 싱글 페이지 애플리케이션의 성능을 향상시키는 방법이다. 싱글 페이지 애플리케이션(Single Page Application)은 초기 실행시에 필요한 웹 자원을 모두 다운 받는 특징이 있다. 코드 분할을 활용하게 되면 초기 로딩시에 모든 웹 자원을 다운받지 않고 필요한 시점에 다운 받아 성능 상의 이점이 생긴다.
단점
// pages/index.js
import React, { useState } from 'react';
import dynamic from 'next/dynamic';
// 방식 1: dynamic 함수 사용 (동적 임포트)
const DynamicComponent = dynamic(() => import('../components/SomeComponent'));
// 방식 2: 일반적인 import 문 사용
import SomeComponent from '../components/SomeComponent';
function HomePage() {
const [showDynamicComponent, setShowDynamicComponent] = useState(false);
// 예시: 버튼 클릭 시 동적 컴포넌트 로딩
const loadDynamicComponent = () => {
setShowDynamicComponent(true);
};
return (
<div>
<h1>Hello Next.js</h1>
{/* 방식 1: dynamic 함수 사용 */}
{showDynamicComponent && <DynamicComponent />}
{/* 방식 2: 일반적인 import 문 사용 */}
<SomeComponent />
{/* 버튼 클릭 시 동적 컴포넌트 로딩 */}
<button onClick={loadDynamicComponent}>Load Dynamic Component</button>
</div>
);
}
export default HomePage;
위 코드에서 는 dynamic 함수로 import하였고 버튼을 클릭했을 때만 로딩되도록 하였습니다. dynamic함수를 사용하여 명시적으로 코드 스플리팅을 함으로써 컴포넌트 단위에서 더욱 세밀하게 초기 로딩 속도를 줄일 수 있습니다.
/* app/dashboard/loading.tsx */
export default function Loading() {
// You can add any UI inside Loading, including a Skeleton.
return <LoadingSkeleton />;
}
Next.js는 중첩된 라우트에서 특정 동작을 가진 UI를 생성하기 위해 일련의 특별한 파일을 제공함
import { getUser } from '@/lib/auth'
export default function Layout({
dashboard,
login,
}: {
dashboard: React.ReactNode
login: React.ReactNode
}) {
const isLoggedIn = getUser()
return isLoggedIn ? dashboard : login
}