웹공부

Next.js 튜토리얼 따라하기 - 1 (설치, 라우팅, Assets)

syom 2022. 3. 21. 13:08

이 글은 Next.js 공식 튜토리얼을 참고하여 정리한 글입니다.

 

0. 설치

npx create-next-app nextjs-blog --use-npm --example "<https://github.com/vercel/next-learn/tree/master/basics/learn-starter>"

1. 라우팅

  • page 폴더 내 폴더나 파일 생성

ex ) /posts/first-post 경로를 만들고싶다면 pages/posts/first-post.js 이런식으로 파일 생성하면 자동으로 라우팅이 된다.

import Link from 'next/link';
// ..
<Link href="/">이동하기</Link>

⇒ 위와 같은 예제로 링크 라우팅이 가능

Link 를 이용하면 client-side Navigation 이 가능하다.

  • 브라우저 내 개발자도구로 style 을 변경한 후 페이지 이동하고 돌아와도 바꾼 스타일이 그대로 적용되어있음!
  • a 태그를 쓴다면 브라우저가 전체 새로고침을 하기 때문에 리셋됨

Code splitting, prefetching

  • next.js 는 코드 분할을 자동으로 수행하므로 페이지는 해당 페이지에 필요한것만 로드한다.
    • 다른페이지의 코드는 제공되지 않음
  • 따라서 수백개의 페이지가 있는 경우에도 홈페이지는 빠르게 로드된다.
  • 특정페이지에 오류가 있어도 나머지 페이지는 제대로 작동함!
  • Link 구성요소가 브라우저의 뷰포트에 나타날때마다 Next.js 는 백그라운드에서 연결된 페이지에 대한 코드를 자동으로 미리 가져옴
    • 따라서 링크를 클릭할 때 쯤에는 그 페이지의 코드가 이미 백그라운드에서 로드되어 페이지 전환이 빠름!

2. Assets, Metadata, CSS

  • Next.js 에는 CSS 및 Sass 가 내장되어있음

Assets

이미지 불러오기

<img src="/images/profile.jpg" alt="Your Name" />
  • 일반 HTML 을 통해서도 이미지를 불러올 수 있다.
    • 하지만 이렇게 사용하면 수동으로 처리해야하는 부분이 생김
      • 이미지가 다양한 화면 크기에서 반응하는지 확인
      • 서드파티 라이브버리로 이미지 최적화
      • 뷰포트에 들어갈 때만 이미지 로드
  • 따라서 Image 라는 구성요소를 이용하여 이미지를 불러온다!
import Image from 'next/image';

<Image src="/images/profile.jpg" height={144} width={144} alt="profile" />
  • 이미지 최적화 지원 (WebP 와 같은 최신형식의 이미지 크기 조정, 최적화 기능)
  • 빌드시 이미지를 최적화
  • 뷰포트 외부의 이미지는 페이지속도에 영향을 끼치지 않음
    • 이미지는 뷰포트로 스크롤될 때 로드된다.

메타데이터

  • Head 를 이용
import Head from 'next/head'; 
// ...
<Head> 
	<title>Create Next App</title> 
</Head>

Third-party JS

  • Head 내에 script 태그로 불러오기
  • next/script 의 Script 를 이용하여 가져오기
import Script from 'next/script';
//...
<Head>
  <title>First Post</title>
</Head>
<Script
  src="https://connect.facebook.net/en_US/sdk.js"
  strategy="lazyOnload"
  onLoad={() =>
    console.log(`script loaded correctly, window.FB has been populated`)
  }
/>
  • stratege : 스크립트를 로드하는 시간을 조정한다. ‘lazyOnload’는 브라우저가 쉬는동안에는 특정 스크립트를 느리게 로드하도록 지시한다.
  • onLoad : 스크립트 로드가 완료된 직후 JS 코드를 실행하는데 사용된다. (예제에서는 스크립트가 올바르게 로드되었는지를 체크)

 

CSS 스타일링

styled-jsx

<style jsx>{`
  …
`}</style>
  • CSS-in-JS 라이브러리
  • 다른 컴포넌트에 영향을 받지 않음

CSS 모듈

  • someComponents.module.css 라는 파일을 생성 (CSS 모듈은 파일 끝이 .module.css 여야함)
  • js 파일에 import 한다
import styles from "./layout.module.css";
/* ./layout.module.css */
.container {
  max-width: 36rem;
  padding: 0 1rem;
  margin: 3rem auto 6rem;
}
  • className을 styles.container 로 지정해야함
  • 위와 같이 적용하고 개발자도구를 보면 고유한 클래스네임으로 바뀌어있다. (충돌 걱정 X)

전역 스타일

전역 CSS 파일을 로드하려면 pages 폴더 내에 _app.js 파일을 생성하여 적용시켜야한다.

export default function App({ Component, pageProps }) {
  return <Component {...pageProps} />
}
  • App 은 다른 모든 페이지에서 공통적으로 사용되는 최상위 구성요소이다.
  • App 생성후에는 서버 재시작 필요
  • 최상위 루트에 styles 폴더 생성 후 그 안에 global.css 파일을 생성하고 _app.js 에 import 한다
import '../styles/global.css' 

export default function App({ Component, pageProps }) { 
	return <Component {...pageProps} /> 
}

스타일링 팁

  • classnames
    • 클래스 이름을 쉽게 토글할 수 있는 라이브러리
  • postCSS
  • Sass