본문 바로가기

Computer Programming/Next

Next.js - File Convention :not-found, layout(+Link tag), loading,

1. not-found.tsx

 

최상위 또는 해당 폴더에서 라우트를 찾을 수 없다면 notFound() 함수가 호출되고 이에 따라 해당하는 위치에서 not-found.tsx가 실행됨.

따라서 [...post] 를 하지 않은 상태에서 products/s/s 이렇게 두번 더 연결하면 최상위 폴더의 not-found로 연결됨.

 

export default function PostPage({ params }: Props) {
  if (params.post === "nothing") {
    notFound();
  }
  return <div>{params.post} Post</div>;
}

또는 특정한 상황에서 notFound()를 직접 호출해도 됨

 

=> 페이지별로 다른 not found UI를 보여줄 수 있음

 

 

2. layout.js

- header, navbar, menu, sidebar 등

 

 

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <header className={styles.header}>
          <h2>Demo Note App</h2>{" "}
          <nav className={styles.nav}>
            <a href="/contact">Contact</a>
            <a href="/about">About</a>
          </nav>
        </header>
        {children}
      </body>
    </html>
  );
}

 

/app 폴더의 layout.tsx 파일에서 골격이 보여짐 -> 이후 라우팅되는 contact, about 페이지에서도 동일하게 보여짐

 

 

 

3. Link로 최적화

Link태그가 사용자에게 보여지는 정적인 페이지가 있다면 

해당 페이지에 필요한 데이터를 pre-fetching한다.

 

이렇게 nav bar에서 Link 태그를 3개 사용하고 있다면, 이 메인 페이지를 로드할 때

 

 

Link 태그를 사용하는 products, contact, about 페이지를 미리 패칭한다. 

 

그래서 이후에 About이나 Contact를 클릭했을 때 별도의 요청을 하지 않고도 페이지가 화면에 보여진다.

 

 

 

 

+ docs에서  추가

 

 

그리고 Link 태그의 기능 중 props => Scroll 이 포함되어있다.

Scroll to the top of the page after a navigation. Defaults to true

 

 

4.  Loading 

In the same folder, loading.js will be nested inside layout.js. It will automatically wrap the page.js file and any children below in a <Suspense> boundary.

 

 

+ Suspense와 Streaming

https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming

 

 

 

- streaming : 서버에서 데이터 전체를 fetch 할 때 까지 기다렸다가 HTML을 보여주면 TTV도 느려짐 -> 그래서 split해서 모든 데이터가 페치될 때 까지 다 기다리지 않고 일부분만 먼저 보냄.

 

따라서 Hydration까지의 시간을 줄일 수 있다.

 

suspense 사용의 이점!

By using Suspense, you get the benefits of

 

1. Streaming Server Rendering - Progressively rendering HTML from the server to the client.
2. Selective Hydration - React prioritizes what components to make interactive first based on user interaction that doesn't rely on data (ex. layout).