본문 바로가기
nextjs

nextjs 기타 지원 기능

by spare8433 2023. 2. 2.

12 버전 기준으로 정리한 내용이므로 주의 13 버전은 일부 바뀐 내용이 있습니다. 개념만 참고 추천
nextjs 기본 및 페이지 개념 에서 이어지는 내용


css 관련


css-module, sass, css in js 등등 지원함


Adding a Global Stylesheet


pages/_app.js 에 style 을 적용하면 됨


Import styles from node_modules


v9.5.4 부터 node_modules 에 있는 css 파일 가져와서 적용 가능 ex) bootstrap, antd

import 'bootstrap/dist/css/bootstrap.css'

layout


레이아웃 감싸는 것도 따로 만들어 둠 꽤 편리함


13 버전에는 layout 파일을 생성해서 적용 가능 참고

// components/layout.js
import Navbar from './navbar'
import Footer from './footer'

export default function Layout({ children }) {
  return (
    <>
      <Navbar />
      <main>{children}</main>
      <Footer />
    </>
  )
}

// pages/_app.js
import Layout from '../components/layout'

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

Per-Page Layouts


multiple 한 레이아웃을 원한다면 getLayout 추가하면 된다
Page.getLayout 을 추가하고 Page()export _app.js 에서 Component.getLayout 로 접근 가능


ts 버전


※ 중요 ※
layout 은 페이지가 아니라 컴포넌트에 불과함 그러므로 useEffect , SWR 같은 라이브러리는 사용가능하고 페이지에서 활용하던 getStaticProps , getServerSideProps 같은 메서드는 활용불가하다.

// pages/index.js
import Layout from '../components/layout'
import NestedLayout from '../components/nested-layout'

export default function Page() {
  return {
    /** Your content */
  }
}

Page.getLayout = function getLayout(page) {
  return (
    <Layout>
      <NestedLayout>{page}</NestedLayout>
    </Layout>
  )
}
//pages/_app.js
export default function MyApp({ Component, pageProps }) {
  // 레이아웃 더있으면 그거 쓰고 없으면 그대로
  const getLayout = Component.getLayout || ((page) => page)

  return getLayout(<Component {...pageProps} />)
}

Image Component


이미지 관련 최적화를 위해 이미지 컴포넌트를 제공함 확장한 버전


※ svg 파일도 제한적으로 사용 가능하다.


_사용성에 대해서는 좋은점도 있고 불편한점 도 있는듯 이미지 최적화 생각하면 고려해볼만 한 듯 _

import Image from 'next/image'
import Image from 'next/future/image' // 기존 img 태그와 비슷함

import 해서 쓰는 방식

import Image from 'next/image'
import profilePic from '../public/me.png'

function Home() {
  return (
    <>
      <h1>My Homepage</h1>
      <Image
        src={profilePic}
        alt="Picture of the author"
        // width={500} 자동 제공
        // height={500} 자동 제공
        // blurDataURL="data:..." 자동 제공
        // placeholder="blur" // Optional blur-up while loading
      />
      <p>Welcome to my homepage!</p>
    </>
  )
}

src 에 url 로 줄때 widthheight 꼭 적어줘야함

import Image from 'next/image'

export default function Home() {
  return (
    <>
      <h1>My Homepage</h1>
      <Image
        src="/me.png"
        alt="Picture of the author"
        width={500}
        height={500}
      />
      <p>Welcome to my homepage!</p>
    </>
  )
}

관련 속성 모음 : https://nextjs.org/docs/api-reference/next/image

Script Component


기존 script 태그에서 발전해 로딩 속도 최적화 및 영향을 최소화

import Script from 'next/script'

export default function Home() {
  return (
    <>
      <Script src="https://www.google-analytics.com/analytics.js" />
    </>
  )
}

Font Optimization

_document 에 폰트를 주는게 개별페이지에 주는거보다 좋다

// pages/_document.js

import { Html, Head, Main, NextScript } from 'next/document'

export default function Document() {
  return (
    <Html>
      <Head>
        <link
          href="https://fonts.googleapis.com/css2?family=Inter&display=optional"
          rel="stylesheet"
        />
      </Head>
      <body>
        <Main />
        <NextScript />
      </body>
    </Html>
  )
}

next lint


v11.0.0 부터 ESLint 를 활용할 수 있게 지원해주는 스크립트가 추가됨

"scripts": {
  "lint": "next lint"
}


eslint 관련 설정파일에 따라 실행되고 없으면 설치도 해주는듯 하다


에러를 잡기 위해 원할 때 next lint 사용 할 수 있다.
esLint 가 설정되면 모든 빌드(다음 빌드) 동안 자동으로 실행된다
오류는 빌드에 실패하지만 경고는 실패하지 않는다.

설정 관련: (https://nextjs.org/docs/basic-features/eslint#eslint-config)
플러그인 관련: (https://nextjs.org/docs/basic-features/eslint#eslint-plugin)

shallow Routing

데이터 패치 없이 URL 을 바꾸는 것

router.push('/?counter=10', undefined, { shallow: true })