: Pages 폴더의 구조를 기반으로 페이지 라우팅을 제공
일반 경로
동적 경로
npx create-next-app@14
import "@/styles/globals.css";
import type { AppProps } from "next/app";
import Link from "next/link";
import { useRouter } from "next/router";
import { useEffect } from "react";
export default function App({ Component, pageProps }: AppProps) {
const router = useRouter();
const onClickButton = () => {
router.push("/test");
};
useEffect(() => {
router.prefetch("/test");
}, []);
return (
<>
<header>
<Link href={"/"}>index</Link>
<Link href={"/search"} prefetch={false}>
search
</Link>
<Link href={"/book/1"}>book/1</Link>
<div>
<button onClick={onClickButton}>/test 페이지로 이동</button>
</div>
</header>
<Component {...pageProps} />
</>
);
}
next/link의 Link를 import하여 href에 해당 경로를 적어주기만 하면 된다.
import Link from "next/link";
...
<Link href={"/book"}>book</Link>
신세계다!! 아래 기존 React-Router 방식에서 아주 편리한 기능을 보여준다.
import { createBrowserRouter, RouterProvider } from "react-router-dom";
const router = createBrowserRouter([
{
path: "/book",
element: <book />,
},
]);
function App() {
return <RouterProvider router={router} />;
}
Next.js의 index.tsx에서 아래 getServerSideProps 함수를 설정하면 자동으로 SSR이 설정된다. 즉, localstorage:3000을 접속 시 getServerSideProps가 실행되고 return 문의 객체로 묶어준 data를 Home Component의 props로 전달된다.
export const getServerSideProps = () => {
// component보다 먼저 실행되어, 필요한 데이터를 불러오는 함수
// 서버측에서 실행되는 함수
const data = "hello";
return {
props: {
data,
},
};
};
export default function Home({ data }: any) {
console.log(data);
export const getStaticProps = () => {
// component보다 먼저 실행되어, 필요한 데이터를 불러오는 함수
// 서버측에서 실행되는 함수
const data = "hello";
return {
props: {
data,
},
};
};
export default function Home({ data }: any) {
console.log(data);
book/[id].tsx
- id: 1
- id: 2
- id: 3
일 떄 GetStaticPaths를 통해 3개의 경로를 설정
export const getStaticPaths = () => {
return {
paths: [
{ params: { id: "1" } },
{ params: { id: "2" } },
{ params: { id: "3" } },
],
// 위 id 경로외 다른 경로가 올 떄 대비책 => false 시 404NotFound
fallback: false,
};
};
//2. SSG 동작
export const getStaticProps = async () => {
// component보다 먼저 실행되어, 필요한 데이터를 불러오는 함수
console.log("인덱스 페이지");
// 동시에 병렬로 호출
const [allBooks, recoBooks] = await Promise.all([
fetchBooks(),
fetchRandomBooks(),
]);
return {
props: { allBooks, recoBooks },
revalidate: 3, // 재검증 3초
};
};
revalidate: 3, // 재검증 3초
기존 SSG방식인 getStaticProps에서 revalidate 속성을 추가해주면 3초 후 새 페이지를 렌더링 한다.
Next.js에서는 ISR방식으로 사용하는 걸 추천한다!!
하지만, ISR 방식을 사용할 떄 문제가 발생할 수 있다.
예를 들어, 시간을 기반으로한 요청이 아닌 행동을 기반으로 한 페이지를 렌더링 할 때,
즉, 사용자가 어떤 이벤트를 발생 시키고 페이지가 새로 렌더링되어야 할 때는
On-Demand ISR(요청을 받을 떄 마다 페이지를 다시 생성하는 ISR)을 사용한다.
import type { NextApiRequest, NextApiResponse } from "next";
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
try {
await res.revalidate("/"); //index 페이지를 재생성
return res.json({ revalidate: true });
} catch (err) {
if (err) return res.status(500).send("Revalidation Failed");
}
}
기존에 revalidate: 3, // 재검증 3초 <<을 지우고, api 라우터를 새로 만들어
localhost:3000/api/revalidate 경로로 요청을 보내면 index 페이지를 재생성하게 된다.
출처: 한 입 크기로 잘라먹는 Next.js
npm install -g vercel
vercel login