Next.js는 React 기반의 서버 사이드 렌더링(SSR) 프레임워크로,
SEO 최적화와 빠른 로딩 속도를 제공하며,
코드 스플리팅, Hot Module Replacemen(HMR)등의 기능을 내장하여 개발자의 생산성을 높입니다.
또한 정적 사이트 생성 기능을 제공하여 빌드 시점에 페이지를 미리 렌더링 하여 성능 향상을 도모한다.
폴더와 파일 이름을 기반으로 경로가 연결된다.
예를 들어 pages/posts/first-post.js의 경우 http://localhost:3000/posts/first-post 와 연결된다.
import Link from 'next/link'
<Link href="/">Back to home</Link>
Link를 사용하여 페이지간 이동이 가능한데, 이는 동일한 Next.js 앱에서 두 페이지간 클라이언트 측 nevigate을 가능하게 한다.
이미지 최적화로 더 작은 viewport에 큰 이미지가 전달 되는 것을 방지한다.
이미지 형식을 자동으로 채택하므로 빌드 시간이 늘어나는 것을 방지한다.
// example
import Image from 'next/image';
const YourComponent = () => (
<Image
src="/images/profile.jpg"
alt="Your Name"
/>
);
Assets 및 Next.js & tailwind 예제
pages/posts/[id].js의 형태로 동적 경로를 설정한다.
getStaticProps를 사용하면 반드시 getStaticPaths를 통해 빌드 타임 때 정적으로 렌더링할 경로를 지정해야 한다.
정의하지 않은 하위 경로는 접근해도 화면이 뜨지 않는다.
getStaticPaths 구현
// 파일 경로
export function getAllPostIds() {
const fileNames = fs.readdirSync(postsDirectory);
// returned list는 문자열이 아닌 객체 배열이여야 한다.
// 각 object는 params key 가 있어야 하며
// 파일 이름에 id를 사용하므로 id 키를 가진다.
// [
// {
// params: {
// id: 'ssg-ssr'
// }
// },
// {
// params: {
// id: 'pre-rendering'
// }
// }
// ]
return fileNames.map((fileName) => {
return {
params: {
id: fileName.replace(/\.md$/, ''),
},
};
});
}
수정 해야 함
getStaticProps 구현
주어진 id로 게시물을 렌더링하기 위해 필요한 data를 가져온다.
// lib/posts.js
export function getPostData(id) {
const fullPath = path.join(postsDirectory, `${id}.md`);
const fileContents = fs.readFileSync(fullPath, 'utf8');
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents);
// Combine the data with the id
return {
id,
...matterResult.da
};
}
// pages/posts/[id].js
import { getAllPostIds, getPostData } from '../../lib/posts';
export default function Post({ postData }) {
return (
<Layout>
{postData.title}
<br />
{postData.id}
<br />
{postData.date}
</Layout>
);
}
export async function getStaticProps({ params }) {
const postData = getPostData(params.id);
return {
props: {
postData,
},
};
}
export default function handler(req, res) {
const email = req.body.email;
// Then save email to your database, etc...
}