명령어 (yarn)
설치
자바스크립트로 설치
yarn create next-app
타입스크립트로 설치
yarn create next-app --typescript
개발환경 실행
yarn run dev
배포 파일 생성
→ build된 파일은 .next 폴더 안에 위치
yarn run build
Production Mode로 실행
build한 프로젝트 실행
yarn start
문법
1. 기본 폴더 구성
- .next: 빌드된 파일이 .next 폴더 안으로 들어간다
- node_modules
- pages: pages 폴더 안에 있는 파일은 자동으로 라우팅이 되서 url로 접근이 가능하다
- _app.js
- index.js
- public
- styles: css module 방식을 기본적으로 사용
- global.css
- Home.module.css
- next.config.js
2. 컴포넌트 만들기
- pages 폴더 안에 있는 파일은 소문자, components 폴더 안에 있는 파일은 대문자로 시작한다
- 컴포넌트 이름은 반드시 대문자 사용 (소문자 사용시 useRouter 사용 불가)
JavaScript로 만든 컴포넌트
const Home = () => {
return {/* code */}
}
export default Home
TypeScriprt로 만든 컴포넌트
- 타입스크립트로 만든 컴포넌트는 return 값이 필요하다
- 리턴할 코드가 없으면 return null 또는 return <></>를 해준다
참고링크
https://nextjs.org/learn/excel/typescript/setup
What does NextPage in Next.js do?
import type { NextPage } from 'next'
const Home: NextPage = () => {
return {/* code */}
}
export default Home
3. 라우터 설정
- pages 폴더 안에 있는 파일은 자동으로 라우팅이 되서 url로 접근이 가능하다


4. 동적 파라미터 가져오기
- pages > sub > [id].jsx 파일을 만들면 해당 페이지를 pages/sub/id이름 으로 접근할 수 있다
- Next.js에 라우터 기능이 내장되어 있으므로 next/router에서 useRouter 함수를 import해 사용한다
- 동적 파라미터는 useRouter에서 리턴한 router.query.동적파라미터로 접근이 가능하다
- id에는 파라미터 값이 문자열로 담긴다
import { useRouter } from 'next/router'
const AboutDetail = () => {
const router = useRouter()
const id = Number(router.query.id)
return {/* code */}
}
export default AboutDetail
5. 환경변수 설정하기
https://nextjs.org/docs/basic-features/environment-variables
- 환경변수 설정 후 개발 환경 껐다가 다시 켜야만 작동이 시작된다
- 브라우저에서 접근이 가능한 환경변수를 만드려면 변수명 앞에 NEXT_PUBLIC 을 추가해준다
.env
가장 최상위 폴더에 해당 파일을 생성한다
API_URL=http://localhost:3000/
접근: process.env.변수명
useEffect(() => {
fetch(process.env.API_URL + 'api/hello')
})
6. HTML <head> 태그 안에 들어가는 태그(title, meta 등)를 Head 컴포넌트 안에 작성해준다
HTML
<head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" /
</head>
Next.js
import Head from 'next/head'
export default function Home() {
return (
<>
<Head>
<title>Create Next App</title>
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
</>
)
}
7. 페이지 head을 커스터마이즈 해주기
- Next.js에서는 페이지마다 하나의 HTML 파일을 가진다
- 여러 페이지의 head 안에 정보를 컴포넌트화 해서 관리해준다
HeadInfo 컴포넌트
import Head from 'next/head'
export default function HeadInfo({ title, keyword, contents }) {
return (
<Head>
<title>{title}</title>
<meta keyword={keyword} />
<meta contents={contents} />
</Head>
)
}
HeadInfo.defaultProps = {
title: 'My Blog',
keyword: 'Blog powered by Next js',
contents: 'practice Next js',
}
photo 페이지
각 페이지에서 head를 만들때 HeadIfo에 필요한 props를 넘겨주며 head를 생성해준다
import Image from 'next/image'
import HeadInfo from '../components/HeadInfo'
export default function photo({ photos }) {
return (
<div>
<HeadInfo title='My Blog Photos' />
</div>
)
}
8. Nav 만들기
components > Layout.js, Nav.js 생성
Layout
import Nav from './Nav'
export default function Layout({ children }) {
return (
<>
<Nav />
{/* pages 폴더 안에 있는 모든 페이지 컴포넌트가 출력될 수 있도록 만든다 */}
<div>{children}</div>
</>
)
}
Nav
import Link from 'next/link'
export default function Nav() {
return (
<nav>
<ul>
<li>
<Link href='/'></Link>
</li>
<li>
<Link href='/photos'>photos</Link>
</li>
</ul>
</nav>
)
}
_app.js
import Layout from '../components/Layout'
function MyApp({ Component, pageProps }) {
return (
// Layout으로 Component를 감싸준다
<Layout>
{/* 실질적인 컨텐츠 */}
<Component {...pageProps} />
</Layout>
)
}
export default MyApp
9. 스타일 적용
- Next.js는 CSS in JS 기법을 기본적으로 지원한다
- 컴포넌트마다 스타일 파일을 만들어 관리해준다
- 글로벌 스타일: styles > global.css
- 컴포넌트 스타일: styles > Home.module.css 컴포넌트명.module.css
import Link from 'next/link'
import navStyles from '../styles/Nav.module.css'
export default function Nav() {
return (
<nav className={navStyles.nav}>
{/* code */}
</nav>
)
}
10. img 태그 대신 Image 컴포넌트 사용
https://nextjs.org/docs/basic-features/image-optimization
import Image from 'next/image'
import profilePic from '../public/me.png'
function Home() {
return (
<>
<Image
src={profilePic}
alt="Picture of the author"
width={500}
height={500}
/>
</>
)
}
11. 페이지 이동 링크 생성시 Link href에 주소 입력
- 일반 라우터는 to에 주소를 입력하지만 Next.js에서는 href에 주소를 입력한다
- a태그 없이 Link 컴포넌트만 단독사용이 가능하다
import Link from 'next/link'
function Home() {
return (
<ul>
<li>
<Link href="/">
<a>Home</a>
</Link>
</li>
<li>
<Link href="/about">
<a>About Us</a>
</Link>
</li>
<li>
<Link href="/blog/hello-world">
<a>Blog Post</a>
</Link>
</li>
</ul>
)
}
export default Home
12. 외부 url 사용시 next.config.js에 해당 주소 등록
추가할 코드
images: {
domains: ["사용할 주소"]
}
next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
images: {
domains: ["사용할 주소"]
}
}
module.exports = nextConfig
13. getServerSidePropsSSR) vs getStaticProps(SSG)
SSR: Server Side Rendering
SSG: Static Site Generation
SSR SSG 공통점
→ 서버에서 HTML을 보내준다
SSR SSG 차이점
→ 언제 HTML을 만들어주는가
- SSR: 클라이언트 요청시 서버에 있는 데이터를 가져와 HTML을 만든다
- SSG: 빌드시 서버에 있는 데이터를 가져와 HTML을 만든다
SSR
- 서버에서 데이터가 업데이트되면 업데이트된 데이터가 사이트에 바로 반영된다
- 클라이언트(웹브라우저) 요청시 서버에서 즉시 데이터를 포함한 HTML을 만들어서 전송한다
- 응답 데이터가 자주 바뀌어서 미리 만들어두기 어려운 페이지에 적합하다
SSG
- 서버에서 데이터가 업데이트되어도 업데이트된 데이터가 사이트에 바로 반영되지 않는다
- 프로젝트 빌드시에 (엔드 프로덕트를 만들때) 서버에 있는 데이터를 가져와 페이지를 구성한다
- 페이지를 서버에 미리 만들어둔 뒤에 요청시에 해당 페이지를 응답한다
- 미리 다 만들어 두니깐 바뀔일이 거의 없는 페이지에 적합하다
Home
export default function Home({ posts }) {
return (
<div>
<h1>Welcome to My Blog</h1>
<Image
src='https://via.placeholder.com/300.png/09f/fff'
width={100}
height={100}
alt='test'
/>
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
)
}
getServerSideProps
export const getServerSideProps = async () => {
const res = await fetch(
https://jsonplaceholder.typicode.com/posts?_start=0&_end=10`
)
const posts = await res.json()
// Home 컴포넌트에 fetch한 데이터 props 형태로 전달해주기
// Home({ posts })...
return {
props: {
posts // posts: posts 생략
}
}
}
getStaticProps
export const getStaticProps = async () => {
const res = await fetch(
`https://jsonplaceholder.typicode.com/posts?_start=0&_end=10`
)
const posts = await res.json()
// Home 컴포넌트에 fetch한 데이터 props 형태로 전달해주기
// Home({ posts })...
return {
props: {
posts
}
// revalidate: 시간(초)
// SSG 방식을 사용하고도 서버에 있는 데이터가 업데이트되었을때 연동이 가능하도록 만들어주는 방법
// 처음 접속이 일어난 후에 지정한 시간 뒤에 언제든 접속이 일어나면 새롭게 서버에서 데이터를 받아와 사이트를 업데이트해준다
revalidate: 20
}
}
14. SSG dynamic parameter 사용시 주의점
https://nextjs.org/docs/messages/invalid-getstaticpaths-value
// SSG 사용해서 서버에서 데이터 가져오기
export const getStaticProps = async () => {
const res = await fetch(
`https://jsonplaceholder.typicode.com/photos?_start=0&_end=10`
)
const photo = await res.json()
return {
props: {
photo,
},
}
}
// 사용할 dynamic parameter 등록해주기
export const getStaticPaths = async () => {
return {
paths: [
{
params: { id: '1' },
},
{
params: { id: '2' },
},
{
params: { id: '3' },
},
],
fallback: false,
}
}
15. 배포
- 깃허브에 연동된 프로젝트를 선택해 배포
- 넷리파이와 유사
- 프로젝트명 (프로젝트의 폴더명)이 도메인이름으로 지정되므로 처음에 세팅할때 유의할것
- 내프로젝트명.vercel.app
'Next.js' 카테고리의 다른 글
| [Next.js] Next.js란? (리액트 단점, CSR, SSR 설명) (0) | 2022.09.14 |
|---|
댓글