따라하며 배우는 리액트 A-Z
[프론트엔드, 웹 개발] 강의입니다.
이 강의를 통해 리액트 기초부터 중급까지 배우게 됩니다. 하나의 강의로 개념도 익히고 실습도 하며, 리액트를 위해 필요한 대부분의 지식을 한번에 습득할 수 있도록 만들었습니다.
✍️
이런 걸
배워요!
리액트
NextJS
타입스크립트
정적 사이트 자동 배포
도커
강의: https://www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%8A%94-%EB%A6%AC%EC%95%A1%ED%8A%B8#
강의 자료 : https://github.com/braverokmc79/DiagramPDF
소스 :
https://github.com/braverokmc79/react-button-app
[7]. Next.js와 TypeScript
76.TNext.js 란
강의:

$ npx create-next-app@latest ./ --typescript √ Would you like to use ESLint with this project? ... No / Yes √ Would you like to use `src/` directory with this project? ... No / Yes √ Would you like to use experimental `app/` directory with this project? ... No / Yes √ What import alias would you like configured? ... @/* Creating a new Next.js app in F:\Study\React\nextjs-app. Using npm. Installing dependencies: - react - react-dom - next - @next/font - typescript - @types/react - @types/node - @types/react-dom - eslint - eslint-config-next
77.Next.js 기본 파일 구조
강의 :
https://www.inflearn.com/course/따라하는-리액트/unit/119923?tab=curriculum

78.Pre-rendering
강의:
https://www.inflearn.com/course/따라하는-리액트/unit/119924?tab=curriculum

79.Data Fetching
강의 :
https://www.inflearn.com/course/따라하는-리액트/unit/119925?tab=curriculum

80.TypeScript 란?
강의 :
https://www.inflearn.com/course/따라하는-리액트/unit/119926?tab=curriculum

81.Next.js와 TypeScript 만들 앱 소개
강의 :
https://www.inflearn.com/course/따라하는-리액트/unit/119927?tab=curriculum

82.메인 페이지 UI 만들기(마크다운 파일 생성)
강의 :
https://www.inflearn.com/course/따라하는-리액트/unit/119928?tab=curriculum

index.tsx
import Head from 'next/head'
import Image from 'next/image'
import { Inter } from '@next/font/google'
import homeStyles from '@/styles/Home.module.css'
const inter = Inter({ subsets: ['latin'] })
export default function Home() {
return (
<>
<Head>
<title>JUNHO CHOI</title>
<meta name="description" content="Generated by create next app" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
</Head>
<section className={homeStyles.headingMd}>
<p>[John Ahn Introduction]</p>
</section>
<section className={`${homeStyles.headingMd} ${homeStyles.padding1px}`}>
<h2 className={homeStyles.headingLg}>Blog</h2>
<ul className={homeStyles.list}>
</ul>
</section>
</>
)
}
styles/Home.module.css
.headingMd{
font-size: 1.2rem;
line-height: 1.5;
}
.padding1px{
padding-top: 1px;
}
.headingLg{
font-size: 1.5rem;
line-height: 1.4;
margin:1rem 0;
}
.list{
list-style:none;
padding:0 ;
margin: 0;
}
posts/pre-rendering.md
--- 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.
posts/ssg-ssr.md
--- title: "When to Use Static Generation v.s. Server-side Rendering" date: "2020-01-02" --- We recommend using **Static Generation** (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request. You can use Static Generation for many types of pages, including: - Marketing pages - Blog posts - E-commerce product listings - Help and documentation You should ask yourself: "Can I pre-render this page **ahead** of a user's request?" If the answer is yes, then you should choose Static Generation. On the other hand, Static Generation is **not** a good idea if you cannot pre-render a page ahead of a user's request. Maybe your page shows frequently updated data, and the page content changes on every request. In that case, you can use **Server-Side Rendering**. It will be slower, but the pre-rendered page will always be up-to-date. Or you can skip pre-rendering and use client-side JavaScript to populate data.
83.마크다운 파일을 데이터로 추출하기
강의 :
https://www.inflearn.com/course/따라하는-리액트/unit/119929?tab=curriculum

lib/getSortedPostedData
import fs from 'fs'
import path from 'path'
import matter from 'gray-matter'
const postsDirectory =path.join(process.cwd(), 'posts');
export function getSortedPostsData(){
console.log( " getSortedPostsData ");
// posts 파일 이름을 잡아주기
const fileNames =fs.readdirSync(postsDirectory);
//['pre-redndering.md' , ...]
const allPostsData =fileNames.map(fileName => {
const id=fileName.replace(/\.md$/, "");
const fullPath =path.join(postsDirectory, fileName);
const fileContents =fs.readFileSync(fullPath, 'utf-8');
const matterResult =matter(fileContents);
return{
id,
...(matterResult.data as {data :string; title:string})
}
})
console.log(allPostsData);
return allPostsData.sort((a, b) =>{
if(a.date <b.date){
return 1;
}else{
return -1;
}
});
}
pages/index.tsx
import Head from 'next/head'
import { Inter } from '@next/font/google'
import homeStyles from '@/styles/Home.module.css'
import { GetStaticProps } from 'next'
import {getSortedPostsData} from "../../lib/post";
const inter = Inter({ subsets: ['latin'] })
export default function Home({ allPostsData }: {
allPostsData: {
date: string
title: string
id: string
}[]
}) {
console.log( " postValue 내용: " , allPostsData);
return (
<>
<Head>
<title>JUNHO CHOI</title>
<meta name="description" content="Generated by create next app" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
</Head>
<section className={homeStyles.headingMd}>
<p>[Macaronics Introduction]</p>
</section>
<section className={`${homeStyles.headingMd} ${homeStyles.padding1px}`}>
<h2 className={homeStyles.headingLg}>Blog</h2>
<ul className={homeStyles.list}>
</ul>
</section>
</>
)
}
export const getStaticProps: GetStaticProps = async () => {
console.log("getStaticProps ");
const allPostsData = getSortedPostsData()
return {
props: {
allPostsData
}
}
}














댓글 ( 4)
댓글 남기기