웹 개발자에게 필요한 다양한 기능을 제공해주는 리액트 프레임워크이다.
- 파일 기반 라우팅을 이용하여 페이지를 만들 수 있다.
- 개발 환경 설정이 쉽고 간단하다.
- SEO(Search Engine Optimization)을 위한 SSR(Server-Side rendering)을 지원한다.
- 초기 로딕 속도 개선을 위한 자동 code splitting(코드 분할)을 지원한다.
create-next-app
설치// package.json
...
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
...
dev
- yarn dev
개발 모드로 프로젝트 실행build
- yarn build
제품 배포 용도로 프로젝트 빌드start
- yarn start
build
를 통해 만들어진 프로젝트를 실행하는 명령어. 실제 운영 서버에서 배포되는 환경과 동일// App.jsx
import '../styles/globals.css'
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
Next.js에는 html 파일이 없다!!!!
create-react-app
으로 만들어진 프로젝트와 다르게, next.js는 눈에 보이는 html 파일이 따로 존재하지 않는 100% 자바스크립트로 이루어진 프로젝트이다.
그렇기 때문에, 기존 head 태그에 스크립트나 메타 태그 추가하기 위해서는, next에서 제공하는<head>
컴포넌트를 사용해야 된다.
// pages/about.js (1)
export default function About() {
return <div>About Page</div>
}
// pages/about/index.js (2)
export default function About() {
return <div>About Page</div>
}
// pages/index.js (3)
export default function Index() {
return <div>Index Page</div>
}
// pages/post/[id]
import { useRouter } from 'next/router'
const Post = () => {
const router = useRouter()
const { id } = router.query
return <p>Post: {id}</p>
}
export default Post
Next.js는 풀스택 프레임워크이다. api 라우터 기능이 내장되어 있다.
Node 서버 없이 api를 만들어 배포할 수 있도록 만들어주는 기능이 있다.
pages/api/*
아래에 api를 만들 수 있다.
만약에 파일들이 백개가 되고 백줄이 되면 사이즈가 커진다 하더라도
pages/api
아래 파일들은yarn build
를 통해 빌드가 될 때 클라이언트 번들에 포함되지 않는다.
Next.js가 파일 용량을 자동으로 최적화해주는 멋진 부분이 있다.
MPA
, SPA
, CSR
, SSR
이 이번 강의때 도움이 되었다.Javascript를 이용해서 HTML 코드를 만드는 행위이다.
Client에 HTML에 이미 로드가 된 이후가 아닌, 이전에 Javascript를 이용해 HTML을 만드는 것을 말한다.
언제 HTML을 만드냐에 따라, SSR(Server-Side Rendering)과 SSG(Static-Site generation)으로 나뉜다.
runtime이란?
애플리케이션이 빌드 및 배포된 후 사용자의 요청에 대한 응답으로 애플리케이션이 실행되는 시점을 말한다.
SSR
이다.getServerSIdeProps
함수는 Server
에서만 실행된다. Browser에서는 실행되지 않는다.getServerSIdeProps
함수는 runtime
에서만 실행된다.getServerSideProps
에서는 context 객체를 통해, Post Page에서는 next router
를 통해 Url Query 파라미터에 접근 가능
합니다.getServerSideProps
의 return 값은 Post page의 props로 전달됩니다.// pages/ssr/[id].js
import { useRouter } from "next/router";
const Post = ({ post }) => {
const router = useRouter();
const { id } = router.query;
console.log('props',props)
return (
<div>
Post: {id}
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
);
};
export default Post;
export async function getServerSideProps(context) {
const { params } = context;
const { id } = params;
const response = await fetch(
`https://jsonplaceholder.typicode.com/posts/${id}`
);
const post = await response.json();
return {
props: {
post,
}, // will be passed to the page component as props
};
}
props
의 콘솔로그가 잘 뜬다.post
의 객체의 title
과 body
가 잘 찍히는것을 확인할 수 있다!!!!!!!!!!!SSG(Server-Side Rendering)이란?
위에 살짝 언급했지만 Build할때 rendering이 된다라고 설명했다.
즉, 페이지를 요청할 때마다 서버에서 렌더링을 한다. 정적인 페이지를 제공하려고 할 때는 그럴 필요없이 빌드할 때 렌더링하고 페이지를 요청할때 이미 렌더링 된 페이지를 반환한다.
ISR(Incremental Static Regeneration)이란?
SSG의 단점은, 컨텐츠가 업데이트 되면 제대로 된 정보를 보여줄 수 없다는것이다. 이를 보완하기 위해서 일정 주기머더 페이지를 빌드시켜주는 ISR이라는 방식이 있다.
CSR | SSR | SSG | ISR | |
---|---|---|---|---|
빌드 시간 | 짧다 | 짧다 | 길다 | 길다 |
SEO | 나쁨 | 좋음 | 좋음 | 좋음 |
페이지 요청에 따른 응답 시간 | 보통 | 길다 | 짧다 | 짧다 |
최신 정보인가? | 맞음 | 맞음 | 아님 | 아닐수 있음 |
만약
getStaticProps
,getStaticPaths
을 설정하지 않는다면 Next.js는 프로젝트 빌드 할때 페이지를 Static Generation 하려고 한다.
getStaticProps
함수는 Server
에서만 실행됩니다. Browser에서는 실행되지 않는다.getStaticProps
함수는 build 하는 그 순간만 실행된다.getStaticProps
에서는 getServerSideProps
에서 context를 통해 쉽게 query에 접근한 것과는 다르게 dynamic routing을 지원하려면 특별한 방법이 필요하다.getStaticProps
의 return 값은 Post page의 props로 전달된다.paths
를 Static Site Generation
할 지 정해두는 역할을 한다.// pages/posts/[id].js
// Generates `/posts/1` and `/posts/2`
import { useRouter } from 'next/router';
const Post = ({ post }) => {
const router = useRouter();
if (router.isFallback) {
return <div>Loading...</div>;
}
return (
<div>
Post: {router.asPath}
<h2>{post.title}</h2>
<p>{post.body}</p>
</div>
);
};
export async function getStaticPaths() {
return {
paths: [
{ params: { id: '1' } },
{ params: { id: '2' } },
{ params: { id: '3' } },
],
// fallback: false, //제공하지 않은 새로운 값으로 접근하면 404를 띄우라는 의미
// fallback: true, // true이면 Loading...이 뜨고 해당 값을 출력해준다
fallback: 'blocking', // 요청에 따른 응답에 블록킹 했다가 서버에서 생성이 된 이후에 보여준다
};
}
// `getStaticPaths` requires using `getStaticProps`
export async function getStaticProps(context) {
const { id } = context.params;
const response = await fetch(
`https://jsonplaceholder.typicode.com/posts/${id}`
);
const post = await response.json();
return {
props: {
post,
}, // will be passed to the page component as props
};
}
getStaticPaths
에서는 getStaticProps
가 있어야 실행되고, getStaticPaths
의 return
값은 getStaticProps
의 props
로 전달됩니다.false
-> getStaticPaths
에서 제공하지 않은 새로운 값으로 접근하면 모두 404를 띄우라는 의미true
-> getStaticPaths
에서 제공하지 않는 페이지를 요청하면, fallback 페이지를 보여주고, 해당 페이지를 서버에서 생성한다. 위에는 if문으로 Loding이 뜨게끔 코드를 짰다blocking
-> getStaticPaths
에서 제공하지 않는 페이지를 요청에 응답을 블록킹했다가 서버에서 생성을 한 이후 보여준다.SSG
로 표시가 되어있다.SSG
의 단점은 컨텐츠가 업데이트 되면 제대로 된 정보를 보여줄 수 없기 때문이다.ISR
의 사용 방법은 간단하다. revalidate
속성에 숫자를 적어주면 5초 이후에 최신으로 업데이트 해준다.