본문 바로가기
Dev/Next JS

[공식문서] NextJS - Assets, Metadata, and CSS #7

by ZEROGOON 2023. 8. 16.

레이아웃 컴포넌트 만들기

먼저, 모든 페이지에서 공유될 Layout 컴포넌트를 만들어보겠습니다.

  • 먼저 components라는 최상위 디렉토리를 생성하세요.
  • components 디렉토리 내부에 layout.js라는 파일을 다음 내용으로 생성하세요:
export default function Layout({ children }) {
  return <div>{children}</div>;
}

 

그런 다음, pages/posts/first-post.js 파일을 열고 Layout 컴포넌트를 가져오고 가장 바깥쪽 컴포넌트로 사용하세요:

import Head from 'next/head';
import Link from 'next/link';
import Layout from '../../components/layout';

export default function FirstPost() {
  return (
    <Layout>
      <Head>
        <title>First Post</title>
      </Head>
      <h1>First Post</h1>
      <h2>
        <Link href="/">← Back to home</Link>
      </h2>
    </Layout>
  );
}

 

CSS 추가하기

이제 Layout 컴포넌트에 스타일을 추가해보겠습니다. 이를 위해 React 컴포넌트 내에서 CSS 파일을 가져올 수 있는 CSS Modules을 사용할 것입니다.

먼저, components/layout.module.css라는 파일을 다음 내용으로 생성하세요:

.container {
  max-width: 36rem;
  padding: 0 1rem;
  margin: 3rem auto 6rem;
}
중요: CSS Modules을 사용하려면 CSS 파일 이름은 .module.css로 끝나야 합니다.

이제 components/layout.js 내에서 이 컨테이너 클래스를 사용하려면 다음을 수행해야 합니다:

  • CSS 파일을 가져오고 styles와 같은 이름을 할당하세요.
  • styles.container를 className으로 사용하세요.

 

components/layout.js 파일을 열고 다음 내용으로 바꿔주세요:

import styles from './layout.module.css';

export default function Layout({ children }) {
  return <div className={styles.container}>{children}</div>;
}

 

이제 http://localhost:3000/posts/first-post에 접속하면 텍스트가 중앙에 위치한 컨테이너 내부에 있는 것을 확인할 수 있습니다.

Next.js 공식문서 - CSS 적용된 모습

 

자동으로 고유한 클래스 이름 생성하기

이제 브라우저의 개발자 도구에서 렌더링된 div의 클래스 이름을 살펴보면 layout_container__...와 같은 클래스 이름이 생성된 것을 볼 수 있습니다.

Next.js 공식문서 - 클래스 이름 확인


이것이 CSS Modules의 동작 원리입니다. CSS Modules를 사용하는 한 클래스 이름 충돌에 대해 걱정할 필요가 없습니다.

뿐만 아니라 Next.js의 코드 분할 기능은 CSS Modules에서도 작동합니다. 각 페이지마다 최소한의 CSS만 로드되도록 보장하며 이로 인해 번들 크기가 줄어듭니다.

CSS Modules는 빌드 시점에 JavaScript 번들에서 추출되어 자동으로 .css 파일을 생성하며, 이 파일은 Next.js에 의해 자동으로 로드됩니다.