FirstPost 컴포넌트는 경로가 pages/posts 인데 public 안의 images 경로에 바로 접근 했다 ..
Image 컴포넌트
시매틱 img태그를 사용하면 다양한 화면 크기에서 반응, 뷰포트에 들어갈때만 이미지 로드 등등..을 수동으로 처리 해야 한다
그래서 Next.js에서 Image 컴포넌트를 제공한다 Image 컴포넌트를 사용하면 Next.js가 알아서 최적화를 해준다 Image컴포넌트를 사용하면 빌드할때 이미지를 최적화 하는 대신 사용자가 요청 할때 이미지를 최적화 한단다.. 그래서 빌드할때 이미지를 10개를 하든 1천만개 이미지를 하든 빌드 시간이 증가하지 않는다
NEXT는 브라우저에 렌더링 할 때 기본적으로 pre-rendering을 한다. pre-rendering이란 각 페이지들을 사전에 미리 HTML 문서로 생성하여 가지고 있는 것 그리고 서버로 요청이 들어올 때 알맞은 페이지를 반환해준다. 그 중 두가지 형태의 사전렌더링이 있다 👉 Static-Generation(SSG)
HTML을 빌드 타임에 각 페이지별로 생성하고 해당 페이지에 요청이 올 때 미리 생성된 HTML문서를 반환
서버에서 페이지가 생성이 되는게 아니라 빌드할때 생성된 문서를 보여주는것이므로 속도가 빠르다
공식문서에서는 마케팅페이지/ 블로그게시물/ 도움말 및 문서 등을 페이지로 사용할때 SSG 사용을 권하고있다
👉 Server-side Rendering(SSR)
서버로 요청이 올 때마다 해당하는 HTML 문서를 그때 그때 생성하여 반환
SSR방식은 서버에서 요청을 받을때마다 그에 상응하는 HTML을 생성하여 반환하기 때문에 항상 최신 상태를 유지해야하는 경우가 적합하다 (좋아요 표시라든지)
getStaticProps
블로그에 데이터를 추가하고 불러오기
최상위 경로에 posts directory를 만들고 안에 블로그 게시물을 md문서로 만든다
공식문서에서 제공하는 글을 그대로 썻다
1 2 3 4 5 6 7 8 9 10 11
--- title: 'Two Forms of Pre-rendering' date: '2020-01-01' ---
Next.js has two forms of pre-rendering: **Static Generation** and **Server-side Rendering**. The difference is in **when** it generates the HTML for a page.
-**Static Generation** is the pre-rendering method that generates the HTML at **build time**. The pre-rendered HTML is then _reused_ on each request. -**Server-side Rendering** is the pre-rendering method that generates the HTML on **each request**.
Importantly, Next.js lets you **choose** which pre-rendering form to use for each page. You can create a "hybrid" Next.js app by using Static Generation for most pages and using Server-side Rendering for others.
이 마크다운 문서에서 id(파일이름),title,datet를 불러와 index페이지에 렌더링
먼저 마크다운 파일의 데이터를 분석할수 있는 모듈을 설치
1
$ npm i gray-matter
그리고 파일 시스템에서 데이터를 가져오기 위한 라이브러리를 만들어 준다
최상위 경로에 lib라는 directory를 만들고 안에 posts.js를 만든다음 작성해준다 getSortedPostsData함수를 만들어서 export 해준다
const allPostsData = fileNames.map((fileName) => { // ✅ 파일이름에서 .md 를 정규식으로 제거 해주고 id에 저장 const id = fileName.replace(/\.md$/, '');
// ✅ path.join으로 경로를 만들어준다 postsDirectory는 'posts' 이고 // fileName은 말 그대로 파일명에서 .md를 제거한 이름 둘을 합쳐서 fullPath에 저장 그럼 fullPath = /posts/파일명 이 된다 const fullPath = path.join(postsDirectory, fileName);
// ✅ 이건 컨텐츠 내용을 저장하는거 같은데 파일 경로에서..utf8로 엔코딩 해주고 파일시스템 메소드로 어떻게 저장해주는거 같다.. const fileContents = fs.readFileSync(fullPath, 'utf8');
// ✅ gray-metter 로 컨텐츠를 어떻게 변환해주는 과정 같다 const matterResult = matter(fileContents);
// ✅ id 와 data를 return return { id, ...matterResult.data, }; }); // Sort posts by date return allPostsData.sort(({ date: a }, { date: b }) => { if (a < b) { return1; } elseif (a > b) { return -1; } else { return0; } }); }