url과 1:1 매칭됨
pages/index.js => /
pages/ssg.js => /ssg
pages/products/[slug].js => /products/*
(js, jsx, ts, tsx)
Next.js는 모든 페이지를 기본적으로 pre-render
모든 페이지 → 미리 그려 놓음
검색 엔진 최적화
기능
다양한 검색엔진들이 해당 사이트를 더 잘 읽어갈 수 있게 함 → 상위 노출 가능 하게 함
SEO와의 상관관계
CSR만 제공 시 | Pre-render해둘 시 | |
---|---|---|
동작하지 않는 검색엔진(ex. Client(브라우저))에게 데이터 제공 가능 여부 | X | O |
Pre-render가 필요한 이유
JS를 실행 가능한 엔진만 content 읽기 가능
JS가 동작하지 않거나 해석불가한 엔진은 읽어갈 것 없음.
대안
SSR렌더를 하면 → JS를 실행하지 못하는 엔진도 이런 형태(initial Load
)의 contents를 볼 수 있음.
→ SEO를 위해서는 Pre-render와 SSR
or SSG
필요
SSG
(recommended) &SSR
SSG
vs SSR
SSG
2가지 상황 & 해결법
외부 데이터에 의존적인 상황
여러 Page들의 공통 처리
Layout
사용 시
components/Layout.js
- 컴포넌트 하나를
pages/_app.js
에서 활용하면 됨
Layout
사용특징
ssr 불가
컴포넌트 o, 페이지 x
공통으로 사용하는 부분들만 남겨둠
예시 코드
import Head from "next/head";
export default function Layout({ children }) {
return (
<div className="container">
<Head>
생략
</Head>
<main>{children}</main>
<footer>
<a>
생략
</a>
</footer>
<style jsx>{`
생략
`}</style>
<style jsx global>{`
생략
`}</style>
</div>
);
}
모든 페이지를 품을 수 있는 구조 (
Nextjs
에서 제공)
코드
// 우리가 만든 Layout으로 감싼 Component를 return. pageProps도 저장
import Layout from "../components/Layout";
export default function App({ Component, pageProps }) {
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
실행 방법
yarn dev
Component
, pageProps
Nextjs에서 제공하는 api
특징
index.js
_app.js
로 감싸짐
보여주고 싶은 컴포넌트의 내용만 신경쓰면 됨
그 외의 구조(style
, header
, footer
, main
으로 감싸기 등)는 Layout
에 옮김
Layouts
활용 시components/SubLayout.js
import Link from "next/link";
export default function SubLayout({ children }) {
return (
<div>
<h1>
<Link href="/">HOME 으로</Link>
{children}
</h1>
</div>
);
}
Page.getLayout
에 getLayout
함수를 제공예시 코드
CSR.getLayout에 getLayout 함수를 제공 (/pages/csr.js
)
import { useEffect, useState } from "react";
import Layout from "../components/Layout";
import SubLayout from "../components/SubLayout";
export default function CSR() {
const [time, setTime] = useState();
useEffect(() => {
console.log("client");
setTime(new Date().toISOString());
}, []);
return (
<>
<h1 className="title">{time}</h1>
</>
);
}
// 👇
CSR.getLayout = function getLayout(page) {
return (
<Layout>
<SubLayout>{page}</SubLayout>
</Layout>
);
};
조건 주기 (/pages/_app.js
)
import Layout from "../components/Layout";
export default function App({ Component, pageProps }) {
// 👇 Component(페이지)가 getLayout라는 것을 가지고 있다면 그걸로 실행 하겠다
const getLayout = Component.getLayout || ((page) => <Layout>{page}</Layout>);
return getLayout(<Component {...pageProps} />); // 👈 Component가 page로서 들어감
}
Next.js 가 제공하는 최적화 Image Component
다 성능 관련 내용
이미지 파일을 import
를 해서 src
에 기입
lazy load
기능
기본으로 존재
리사이징 (화면에 맞는 적절한 사이즈)
npx create-next-app --example image-component image-app
코드 해석 : image-component
라는 예제가 nextjs
에 있고create-next-app
으로 image-app
제작
yarn build
→ yarn start
pages
폴더에 다양한 페이지가 정의됨
이미지 파일을 import
를 해서 src
에 기입
Image
태그에 src
로 public
폴더에 있는 이미지 사용. 그 파일을 import
를 해서 주입
import Image from 'next/image' // 👈
import ViewSource from '../components/view-source'
import mountains from '../public/mountains.jpg' // 👈
const Responsive = () => (
<div>
<ViewSource pathname="pages/responsive.tsx" />
(...생략)
<Image // 👈
src={mountains} // 👈
(...생략)
/>
</div>
)
export default Responsive
lazy load
기능
viewport
에 들어왔을 때, 그제서야 로드반응형 사이즈 폭에 맞춰 이미지가 꽉 차는 레이아웃 제작됨
→ 이런 리사이징 기능들을 외부 서버 없이 사용 가능하게 함.
ex
(network
탭 > Img
클릭) 15kb 크기의 이미지
→ 모바일 형태일 때, 4.5kb & 화면에 딱 맞는 사이즈로 리사이징된 작은 이미지 로드됨
pre-render
미리 그려놓는 것
그리는 주체 : 서버
빌드 or 요청 시에 할지는 다름
기능
검색엔진이 내 페이지를 읽어가기 용이함
초기 로딩 속도를 당길 수 있는 기능
사용자가 페이지를 받을 때, 주소에 접속 하자마자 이미 그려놓은 페이지를 봄
Layout
페이지의 공통 코드를 하나의 모듈로 합침
pages
/app.js
활용
nested하게 2가지 레이아웃 사용 가능
Images
Nextjs
(최적화된 이미지를 활용)가 제공하는util