Skip to content
sang-gyeong lee edited this page Nov 25, 2020 · 3 revisions

Next.js๋ž€?

๋ฆฌ์•กํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ SPA๋ฅผ ๋น ๋ฅด๊ฒŒ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ.


Next.js์˜ ๋Œ€ํ‘œ์  ํŠน์ง•์ด์ž ์žฅ์ 

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ์ œ๊ณตํ•จ
  • ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์˜ ์žฅ์ 
  • ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”
  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ ๊ฐœ์„ 
  • ๊ทธ๋ƒฅ ๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™” SEO (Search Engine Optimization)
  • ๋”์šฑ ๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ž๋™ํ™”
  • HMR์„ ์ง€์›ํ•˜๋Š” ์›นํŒฉ ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ
  • Express๋‚˜ Node.js์™€ ๊ฐ™์€ http ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • Babel, Webpack ์„ค์ • ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e080380c-d5c9-42e9-9c01-99b73f4558aa/Untitled.png

DataFetch

  • isomorphic-unfetch

getInitialProps โ†’ 9.3๋ฒ„์ „๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ํ•จ์ˆ˜๋“ค

๊ณตํ†ต์  : page ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

  • getStaticProps

    • SSG
    • ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค ๋ณด๋‹ค ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์žฅ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  pre-rendering์„ ์ง„ํ–‰, ๊ทธ๋Ÿฌ๊ธฐ์— ์ข€ ๋” ์ข‹์€ ์„ฑ๋Šฅ
    • request์— ์•ž์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณต์‹์ ์ผ ๋•Œ (ํŠน์ • ์œ ์ €๋ž‘ ๊ด€๊ณ„๋˜๋ฉด ์•ˆ๋Œ)
    • ๋ฐ์ดํ„ฐ๊ฐ€ headless CMS๋กœ ๋ถ€ํ„ฐ ์˜ฌ ๋•Œ,

    ** headless CMS?

    • ๋จธ๋ฆฌ๋Š” ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜๋‹จ, ๋ชธํ†ต์€ ์ปจํ…์ธ ๋ฅผ ์˜๋ฏธ
    • ๋จธ๋ฆฌ(ํ‘œํ˜„ ์ˆ˜๋‹จ)๋ฅผ ์–ธ์ œ๋“  ๋ฐ”๊ฟ” ๋ผ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
    • Headless CMS๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€?
      1. ์ปจํ…์ธ  ํŽธ์ง‘์ž์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค. ์ปจํ…์ธ  ํŽธ์ง‘์ž๋Š” ์ต์ˆ™ํ•œ GUI๋กœ ์ปจํ…์ธ ๋ฅผ ์ถ”๊ฐ€/์ˆ˜์ •/์‚ญ์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • getStaticPaths

    • getStaticProps๋ฅผ ์“ธ ๋•Œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • route๊ฐ€ ๋™์ ์ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. /post/[pId]
    • ๋‹จ, ๊ทธ๋Ÿผ post id๊ฐ€ 20000๊ฐœ ๊ฐ€๋Ÿ‰ ์žˆ์„๋•Œ๋„ ์ด๊ฑธ pre renderํ•  ๊ฒƒ์ด๋ƒ..? โ†’ ์˜ˆ๋ฐฉ๋ฐฉ๋ฒ•์ด ์žˆ๋‹คํ•จ.
  • getServerSideProps

    • SSR
    • ์š”์ฒญ๋งˆ๋‹ค ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ๊ฐ’์ด ๋ณ€ํ™”๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์ด ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ข‹๋‹ค.
    • ๋นŒ๋“œ ์ดํ›„์—๋„ Data ๋ณ€๊ฒฝ๊ฐ€๋Šฅ? ๊ทธ๋Ÿผ SSR์‚ฌ์šฉ

SSG vs SSR

pre-rendering : ๋ฏธ๋ฆฌ html์„ ๋งŒ๋“œ๋Š” ๊ฒƒ.

** ์—ฌ๊ธฐ์„œ ๋นŒ๋“œํƒ€์ž„์ด๋ž€? next-build

Static Generation

HTML์„ ๋นŒ๋“œํƒ€์ž„์— ๋งŒ๋“ค์–ด๊ฐ€์ง€๊ณ , ๊ฐ๊ฐ request ๋ณด๋‚ผ ๋•Œ ์žฌ ์‚ฌ์šฉํ•จ. getStaticProps๋ฅผ exportํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

bundle.js์—๋„ ํฌํ•จ ์•ˆ๋Œ.(?)

Server-Side Rendering

HTML์ด ๊ฐ๊ฐ request๋ฅผ ๋ณด๋‚ผ ๋•Œ ๋งŒ๋“ค์–ด์ง. getServerSideProps๋ฅผ exportํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.


โš™๏ธ NextJs (with Typescript)ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ (CNA๋ฐฉ์‹ X)

Step 1: Set Up Your Next JS Project

https://medium.com/@selvaganesh93/setup-next-js-with-typescript-integration-dece94e43cf5

yarn init -y
npm init --yes

yarn add react react-dom next
npm install react react-dom next

Package.jsonย ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€์„œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

"scripts": {
  "dev": "next",
  "build": "next build",
  "start": "next start"
}

Step 2: Install required @types module

yarn add @zeit/next-typescript @types/next @types/react 

Step 3: Create configureation files

Create aย next.config.jsย in your project

// next.config.js
const withTypescript = require('@zeit/next-typescript')
module.exports = withTypescript()

Create aย .babelrcย in your project

{
  "presets": ["next/babel", "@zeit/next-typescript/babel"]
}

Create aย tsconfig.jsonย in your project

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noEmit": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "preserveConstEnums": true,
    "removeComments": false,
    "skipLibCheck": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext"
  }
}

Optionally you can add your custom Next.js configuration as parameter

// next.config.js
const withTypescript = require('@zeit/next-typescript')
module.exports = withTypescript({
  webpack(config, options) {
    return config
  }
})

The next step in this set up is to add aย scriptsย property to theย package.json
file that was generated in the installation above. The property will
include a script to run a local serverย for development of your project:

{
  ...
  "scripts": {
    "dev": "next"
  }
}

์ค‘๊ฐ„์— ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋“ค์„ ์„ค์น˜ํ•ด์ฃผ์ž!!

npm install --save-dev typescript @types/node @babel/core

TSConfig.json

๋จผ์ € ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ global๋กœ ์„ค์น˜ํ•ฉ์‹œ๋‹ค.

$ yarn global add typescript
$ npm install -g typescript

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉดย tsconfig.jsonย ํŒŒ์ผ์ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

$ tsc --init

tsconfig.json ํŒŒ์ผ์—์„œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ปดํŒŒ์ผ ๋  ๋•Œ ํ•„์š”ํ•œ ์˜ต์…˜์„ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.

  • targetย : ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋  ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ย target์„ย es5๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ์ด๋ฅผ ์ผ๋ฐ˜ functionํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ํ•จ์ˆ˜๋กœ ์ปดํŒŒ์ผ ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด๋ฅผย es6๋กœ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • moduleย : ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋ชจ๋“ˆ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ• ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์„ ๋งŒ์•ฝย common์œผ๋กœ ํ•˜๋ฉดย export default Sampleย ์ฝ”๋“œ๋Š”ย exports.default = Sample๋กœ ๋ณ€ํ™˜๋˜์ง€๋งŒ ๊ฐ’์„ย es2015๋กœ ํ•˜๋ฉดย export default Sample์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • strictย : ๋ชจ๋“œ ํƒ€์ž… ์ฒดํ‚น ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • esModuleInterop :ย commonjs ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ์ด๋ค„์ง„ ํŒŒ์ผ์„ es2015 ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • outDirย : ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ์ด ์–ด๋””์— ์ €์žฅ๋ ์ง€ ๊ฒฝ๋กœ๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • includeย : ์–ด๋–ค ํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•  ๊ฒƒ์ธ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • excludeย : ์–ด๋–ค ํŒŒ์ผ์„ ์ปดํŒŒ์ผ์—์„œ ์ œ์™ธํ• ์ง€ ์ •ํ•ฉ๋‹ˆ๋‹ค.
{
  "compilerOptions": {
    "target": "ES5",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "outDir": "dist"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๊ธ€๋กœ๋ฒŒ๋กœ ์„ค์น˜ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ CLI๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ–ˆ๋Š”๋ฐ
๋งŒ์•ฝ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ ์„ค์น˜ํ•œ typescript ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ์‹œ๋‹ค.
(์‚ฌ์‹ค ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋กœ์ปฌ๋กœ ์„ค์น˜ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.)

$ yarn add typescript // npm install --save typescript

package.json

{
  "name": "ts-practice",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "typescript": "^3.9.6"
  },
  "scripts": {
    "build": "tsc"
  }
}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉดย buildย ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Clone this wiki locally