Next.js

  • React Framework

Static Pre Redering

  • next.js์— ์˜ํ•ด ์ดˆ๊ธฐ์ƒํƒœ๋กœ HTML์ด ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง๋จ

pages

  • file name = url route name

  • index = home page

  • component name์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ

  • 404 page๋ฅผ ์ œ๊ณต

  • homepage/movies = pages/movies/index.js ํด๋” ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๋งตํ•‘

  • ํŽ˜์ด์ง€๊ฐ€ ํ•˜๋‚˜๋ผ๋ฉด ํด๋”๋ฅผ ๋งŒ๋“ค ํ•„์š” ์—†์Œ

routing

routing๊ณต์‹๋ฌธ์„œ router๊ณต์‹๋ฌธ์„œ

  • Link component ์กด์žฌ

  • Link is only for 'href'

  • className, style ... a tag์— ์ž‘์„ฑ

<nav>
  <Link href="/">
    <a>Home</a>
  </Link>
  <Link href="/about">
    <a>About</a>
  </Link>
</nav>

or

const router = useRouter();
const onClick = (id: number) => {
  router.push(`/movies/${id}`);
};

or

const router = useRouter();
const onClick = (id: number, title: string) => {
  router.push(
    {
      pathname: `/movies/${id}`,
      query: {
        title,
      },
    },
    `/movies/${id}`
  );
};

Dynamic routes

๊ณต์‹๋ฌธ์„œ

  • homepage/movies/:id = pages/movies/[id].js

Styled-jsx

๊ณต์‹๋ฌธ์„œ

  • ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ์Šค์ฝ”ํ”„ ๋‚ด๋กœ ์ ์šฉ๋ฒ”์œ„๊ฐ€ ํ•œ์ •๋จ

<style jsx>{`
  nav {
    background-color: tomato;
  }
  a {
    text-decoration: none;
  }
`}</style>

// global๋กœ ์ ์šฉ(ํ•˜์œ„์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ์ ์šฉ)
// but, ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ ์šฉ์•ˆ๋จ
<style jsx global>{`
  nav {
    background-color: tomato;
  }
  a {
    text-decoration: none;
  }
`}</style>

CSS Modules

  • random class name์„ ๋งŒ๋“ค์–ด์คŒ

// 1
import styles from "./NavBar.module.css";

const NavBar = () => {
  const router = useRouter();
  return (
    <nav className={styles.nav}>
...

// ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋„ค์ž„์„ ์ ์šฉํ•  ๋•Œ
// 2
<Link href="/">
  <a
    className={`${styles.link} ${
      router.pathname === "/" ? styles.active : ""
    }`}
  >
    Home
  </a>
</Link>

// 3
<Link href="/">
  <a
    className={[
      styles.link,
      router.pathname === "/" ? styles.active : "",
    ].join(" ")}
  >
    Home
  </a>
</Link>

Custom App

๊ณต์‹๋ฌธ์„œ

  • ์—ฌ๊ธฐ์„œ GlobalStyles๋ฅผ ์ถ”๊ฐ€ํ•ด์ค„์ˆ˜ ์žˆ์Œ

  • custom app์—์„œ๋งŒ css import๊ฐ€ ๊ฐ€๋Šฅ(๋‹ค๋ฅธ ํŽ˜์ด์ง€๋‚˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” module์ด์–ด์•ผํ•จ)

// Component => ๋ Œ๋”๋งํ•˜๊ธธ ์›ํ•˜๋Š” ํŽ˜์ด์ง€
import type { AppProps } from 'next/app'

const App = ({ Component, pageProps }: AppProps) => {
  return (
    <>
      <NavBar />
      <Component {...pageProps} />
    </>
  );
};

Layout

๊ณต์‹๋ฌธ์„œ

  • _app ํŒŒ์ผ์ด ๋ฌด๊ฑฐ์›Œ์ง€์ง€ ์•Š๋„๋ก Layout์„ ํ™œ์šฉ

// components/Layout
import NavBar from "./NavBar";

type LayoutProps = {
  children: React.ReactNode;
};

export default function Layout({ children }: LayoutProps) {
  return (
    <>
      <NavBar />
      <div>{children}</div>
    </>
  );
}

// _app
const App = ({ Component, pageProps }: AppProps) => {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  );
};

Redirects

๊ณต์‹๋ฌธ์„œ

Rewrite

๊ณต์‹๋ฌธ์„œ

Server Side Rendering

๊ณต์‹๋ฌธ์„œ

  • getServerSideProps() : ์„œ๋ฒ„์ธก์—์„œ๋งŒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ

Last updated