이정환 강사님의 한 입 크기로 잘라먹는 Next.js강의를 들으며 정리한 내용.
npx create-next-app@14
/pages
index.tsx = ~/
search.tsx = ~/search
book
index.tsx = ~/book
[id].tsx = ~/book/1 (dynamic routes)
[...id].tsx = ~/book/1, ~/book/1/2 (catch all segment)
[[...id]].tsx = ~/book, ~/book/1 (optional catch all segment)
// src/pages/_app.tsx
export default function App({
Component,
pageProps,
}: AppProps & {
Component: NextPageWithLayout;
}) {
const getLayout =
Component.getLayout ?? ((page: ReactNode) => page);
return (
<GlobalLayout>
{getLayout(<Component {...pageProps} />)}
</GlobalLayout>
);
}
// src/pages/search/index.tsx
...
Page.getLayout = (page: ReactNode) => {
return <SearchableLayout>{page}</SearchableLayout>;
};
데이터 페칭이 페이지 컴포넌트에 집중.
getServerSideProps
getStaticProps
export const getServerSideProps = async (
context: GetServerSidePropsContext
) => {
// ssr로 동작하도록 자동으로 설정(getServerSideProps)
const q = context.query.q;
const books = await fetchBooks(q as string);
return {
props: { books },
};
// 반드시 객체타입의 props가 들어있어야만 함.
};
export default function Page({
books,
}: InferGetStaticPropsType<typeof getServerSideProps>) {
return (
);
}
export const getStaticPaths = () => {
return {
paths: [
{ params: { id: '1' } },
{ params: { id: '2' } },
{ params: { id: '3' } },
],
// fallback: false, // 1,2,3 을 제외한 경로는 404 경로로 지정(not found)
// blocking : 즉시 생성(SSR) , true : 즉시 생성 + 페이지만 미리 반환
fallback: false,
};
};
export const getStaticProps = async (context: GetStaticPropsContext) => {
// ssr로 동작하도록 자동으로 설정(getServerSideProps)
if (!book) {
return {
notFound: true,
};
}
return {
props: { book },
};
};
불 필요한 컴포넌트들도 JS Bundle에 포함.