따라하며 배우는 리액트 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)
댓글 남기기