Next.js: next.config.ts

์— ๋งŒ๋“  2018๋…„ 09์›” 28์ผ  ยท  20์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vercel/next.js

๊ธฐ๋Šฅ ์š”์ฒญ

next.config.js ๋Œ€์‹  next.config.ts๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
ํ˜„์žฌ ์–ด๋–ค typescript ์˜ˆ์ œ๋„ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ typescript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

@resir014

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

nextJs Core๊ฐ€ typescript๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  20 ๋Œ“๊ธ€

์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ next.config.ts๋ฅผ next.config.js๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ์ž์‹ ์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. next.config.js๋ฅผ ๋ณ€ํ™˜ํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค.

@virzak ์˜ˆ, ๋งŽ์€ ๋…ธ๋ ฅ ์—†์ด๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ts-node ๋Ÿฐํƒ€์ž„ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋ฉฐ Next.js์— ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ // @ts-check ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Flowtype์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ next.config.js $๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nextJs Core๊ฐ€ typescript๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๊ฐ€ ์žฌ๊ณ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? 1๋…„ ์ „์— ๋ฌธ์„ ๋‹ซ์•˜๊ณ  ๊ทธ ์ดํ›„๋กœ ๋งŽ์€ ๊ฒƒ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. TS ์ง€์›์€ ์ด์ œ ํ•ต์‹ฌ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ next.config.ts ์„ ๊ฐ–๊ณ  ์‹ถ์€ ๊ตฌ์ฒด์ ์ธ ์ด์œ ๋Š” publicRuntimeConfig: { appInfo: generateAppInfo() } ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. generateAppInfo() ํ•จ์ˆ˜๋Š” helpers.ts ์— ์žˆ์œผ๋ฉฐ AppInfo ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์œ ํ˜•์ด ๊ฒ€์‚ฌ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ์—๋Š” ํ™œ์„ฑํ™”๋œ ๊ธฐ๋Šฅ ์Šค์œ„์น˜, git commit hash, sentry id ๋ฐ ์‹คํ–‰๋œ ์•ฑ ์ธ์Šคํ„ด์Šค์— ํ•„์š”ํ•œ ๊ธฐํƒ€ ์‚ฌํ•ญ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ generateAppInfo() ํ•จ์ˆ˜๊ฐ€ Jest ๋ชจ์˜์—์„œ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๊ตฌํ˜„์„ ts ํŒŒ์ผ์—์„œ next.config.js ๋กœ ๋ฐ”๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ generateAppInfo() ๋ฅผ ๋ณ„๋„์˜ js ํŒŒ์ผ๋กœ ์ถ”์ถœํ•ด์•ผ ํ•˜๋ฏ€๋กœ AppInfo ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ์†์‹ค๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿค”

์—ฌ์ „ํžˆ https://github.com/zeit/next.js/issues/5318#issuecomment -425398180๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผํ•˜๋ฉด ๋ถ€ํŒ… ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ณ  ์ด์ ์— ๋น„ํ•ด ๊ตฌ์„ฑ ๋กœ๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

์ฃผ์š” ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ์ƒ์‚ฐ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. next.config.ts ๊ฐ€ ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ .next ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ํ”„๋กœ๋•์…˜์—์„œ babel ๋˜๋Š” ts-node ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๋นŒ๋“œ ์‹œ๊ฐ„ ์ตœ์ ํ™”์˜ ๋ฒ”์œ„๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ถ€ํŒ… ์‹œ๊ฐ„์€ ์•ฝ๊ฐ„ ๋” ๋‚ซ์ง€ ์•Š๋”๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ด์ž ์ƒ์‚ฐ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๋‚ด์šฉ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€ํŒ… ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š๋„๋ก ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ์บ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ ์— ๋น„ํ•ด ๋ถ€ํŒ… ์‹œ ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋ฉด ์ถฉ๊ฒฉ์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ „์ฒด ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ ๋ฆฐํŠธ ๋„๊ตฌ ๋˜๋Š” esnext ๊ตฌ๋ฌธ์„ ํฌํ•จํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค.

์ด ํŒŒ์ผ์€ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๋‚ด์šฉ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Œ, ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•œ ๊ฒƒ์ผ๊นŒ์š”? ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ €๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ ์กฐ์ •์ด ํ•„์š”ํ•œ ํฌ๊ณ  ๋ณต์žกํ•œ ์•ฑ์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋Š” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ™•์‹คํžˆ preact.config.js ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋Š๊ผˆ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ˆˆ์— ๋„๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์™œ ๋‹ค๋ฅธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TS๋ฅผ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋งŽ์€ ์ด์ ์„ ์žƒ๋Š” ์ด์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ๋ช…๋ น์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ํŠนํžˆ ์œ ์šฉํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋Š” Ramda ์ž…๋‹ˆ๋‹ค. ์ปค๋งํ•  ๋•Œ ๋™์  ์œ ํ˜• ์ถ”๋ก ์— ๋Œ€ํ•œ ๋ฉ‹์ง„ TS ์ง€์›์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ FP ๋„๊ตฌ ๋ฒจํŠธ์ž…๋‹ˆ๋‹ค.

ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ next.config.ts ์ง€์›์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ์˜ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹จ์ˆœํžˆ ์™„์ „ํ•œ ์œ ํ˜•์˜ ์„œ๋น„์Šค ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์™„์ „ํ•œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  exportPathMap์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋Š” ์œ ํ˜•์ด ์ง€์ •๋˜๊ณ  ํ•˜๋‚˜๋Š” ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์„œ๋น„์Šค๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ผ URL ๋ชฉ๋ก์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ #9524์˜ getStaticPaths ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

nextjs์™€ ํ•จ๊ป˜ typescript๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ 2๊ฐœ์˜ ํŒจํ‚ค์ง€๊ฐ€ ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
@babel/core
@babel/preset-typescript

๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ‰์„์—์„œ typescript ํŒŒ์ผ์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function requireTypescript(path) {
  const fileContent = require('fs').readFileSync(path, 'utf8')
  const compiled = require('@babel/core').transform(
    fileContent,
    {
      filename: path,
      presets: [ '@babel/preset-typescript' ],
    },
  )
  return eval(compiled.code)
}

๊ทธ๋Ÿฐ ๋‹ค์Œ next.config.js ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const myModule = requireTypescript('./path/to/mymodule.ts')

_์ฐธ๊ณ : ts ํŒŒ์ผ์ด next.config.js ์˜ ๋™์ผํ•œ ํด๋”์— ์—†๊ณ  ํ•„์š”ํ•œ ts ํŒŒ์ผ ๋‚ด๋ถ€์— ์ƒ๋Œ€ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ ๊ฒฝ๋กœ ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€์ƒ ts ํŒŒ์ผ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค._

https://github.com/zeit/next.js/issues/5318#issuecomment -575959060์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ

  • next start ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ถ€ํŒ… ์†๋„๊ฐ€ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์ค‘ ๋ถ€ํŒ… ์†๋„ ์ €ํ•˜

๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์ ํŠธ์—์„œ typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์ด๋ฏธ ํ˜•์‹ ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด ์„ฑ๋Šฅ์„ ์–ด๋Š ์ •๋„ ํฌ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ถ€ํŒ…ํ•  ๋•Œ ๊ฐ‘์ž๊ธฐ ๋„ˆ๋ฌด ์ปค์„œ ๊ทน๋ณตํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์กฐ๊ธˆ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์บ์‹œํ•˜๋ฉด ๋ถ€ํŒ…ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐœ์ƒํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ๋Œ€์‹  ๋Š๋ฆฐ ๋ถ€ํŒ…์— ๋Œ€ํ•ด next.js ๋ฅผ ๋น„๋‚œํ•  ๊ฒƒ์ด๋ผ๋Š” ์šฐ๋ ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

> compiled next.config.ts (1700ms)

๊ทธ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์–ด๋–ค ๋„๊ตฌ๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ถ„๋ช…ํžˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Janpot ์€ ์ด ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ Next.js ๋‚ด๋ถ€์— ์บ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ next start ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด next.config.js๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํ”„๋กœ๋•์…˜ ๋ถ€ํŒ…์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. Next.js๋Š” ํ”„๋กœ๋•์…˜ ๋ถ€ํŒ… ์‹œ typescript๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์—๋Š” ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์— ์ด ๊ธฐ๋Šฅ์„ ๊ฐ€์ƒ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์บ์‹œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. next.js์—๋Š” ์ด๋ฏธ typescript๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ”„๋ผ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋•์…˜ ๋ถ€ํŒ…์˜ ๊ฒฝ์šฐ next build ์‹คํ–‰ํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ชจ๋“  ๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” nextjs์—์„œ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— typescript๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  next.config.js๊ฐ€ next.config.ts๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ๋ฉ‹์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” config๊ฐ€ typescript ํŒŒ์ผ์ด ๋  ํ•„์š”๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ๊ทธ๋‹ค์ง€ ์‹ ๊ฒฝ์“ฐ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‚ด next.config.js์—์„œ ts ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. .?). ๊ทธ๋ž˜์„œ ์ด์ œ ๋‚˜๋Š” next.config.js๊ฐ€ ์‹ค์ œ๋กœ next.config.ts์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด ๋‹ค์‹œ ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ts ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ์ง€์›๋˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค...

@lsm ์ด ์ œ์•ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์—ฌ๊ธฐ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋งŒ babel ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์••๋„์ ์ธ ์‚ฌ์šฉ์ž ์ง€์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

babel ๋˜๋Š” ๋ณ„๋„์˜ tsconfig์™€ tsc๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์—์„œ js๋ฅผ ๋‚ด๋ณด๋‚ด๋ฏ€๋กœ ์ด ๋„์šฐ๋ฏธ ํŒŒ์ผ์„ js๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š๊ฒŒ ๋” ์ข‹์ง€...

๊ทธ๋Ÿฌ๋‚˜ ์ €์ž๊ฐ€ "์ด ํŒŒ์ผ ํ•˜๋‚˜๋งŒ"์— ๋Œ€ํ•œ ์ง€์›๋„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์•ฝ๊ฐ„์˜ ์•„์ด๋Ÿฌ๋‹ˆ๋ฅผ ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค”๐Ÿค”๐Ÿค”๐Ÿค”๐Ÿค”๐Ÿคฆโ€โ™‚๏ธ

์ถ”์‹ : ์•„์ง ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ ์–ด๋„ ๋‚ด ๊ฐ์ •์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.PPS getStaticPaths ๋ฅผ ๋ณด์•˜์ง€๋งŒ exportPathMap ์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ๋งคํ•‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

UPD. @babel/core ๋ฐ @babel/preset-typescript ๋Š” ์ด๋ฏธ nextjs์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ @lsm ์ด ์ œ์•ˆํ•œ ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ SyntaxError: Cannot use import statement outside a module ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

UPD2. ์ข‹์•„, ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ts ๋„์šฐ๋ฏธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ js๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํ•„์š”ํ•œ ์œ„์น˜์— ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค(next.config.js ๋ฐ ํŽ˜์ด์ง€์—์„œ fs lib๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— getStaticProps์—์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค). )

@JerryGreen ์œ ์šฉํ•œ ๋„์šฐ๋ฏธ๋ฅผ TS๋กœ JS๋กœ ๊ฒŒ์‹œํ•˜๋Š” npm ํŒจํ‚ค์ง€๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ์˜ต์…˜์ด์—ˆ์Šต๋‹ˆ๊นŒ?

@JerryGreen๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ npm ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ ๋„ˆ๋ฌด ๋งŽ์•„ ๊ฐ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ด๊ฒƒ์„ ํฌ๊ธฐํ•˜๊ณ  js์—์„œ ์ด ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์€ Gatsby๊ฐ€ gatsby-node.ts ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋นŒ๋“œ ์ฃผ๊ธฐ ๋™์•ˆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ต์…˜์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@dpwolfe ์˜ˆ, @beppek ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ํ”„๋กœ์ ํŠธ์— ๊ตญํ•œ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” 20200917-hello-world ์™€ ๊ฐ™์€ ๋‚ ์งœ(์งง์€ ํƒ€์ž„์Šคํƒฌํ”„)๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ์ด ํŽ˜์ด์ง€ ํด๋”์— ์žˆ๊ณ  /hello-world ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ†ต๊ณผํ•˜๊ณ  ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ ์šฉํ•˜๊ณ  exportPathMap ์— ํ•„์š”ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค /blog/posts/20200917-hello-world , -> /hello-world . ๋„ˆ๋ฌด ํ”„๋กœ์ ํŠธ ํŠน์ •์ ์ธ ๊ฒƒ ๊ฐ™์•„์„œ ํŒจํ‚ค์ง€์— ๊ฒŒ์‹œํ•ด์•ผ ํ•˜๋Š” ์‹ค์ œ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Btw ๋‚˜๋Š” getStaticProps ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๊ฑฐ์ง“๋ง์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ exportPathMap ์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ด ๋„์šฐ๋ฏธ๊ฐ€ js๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ts๋กœ ์ž‘์„ฑํ•˜๋ฉด next.config.js ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๋„์šฐ๋ฏธ๋ฅผ js๋กœ ์˜ฎ๊ฒจ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ts๋กœ ์ž‘์„ฑํ•˜๊ณ  js๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด next.config.js ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐœ์ธ์ ์ธ ํ•„์š”์— ๋”ฐ๋ผ ๊ฑฐ์˜ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์ด ์–ต์ œํ•ด์•ผ ํ•˜๋Š” eslint ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

/* eslint-disable @typescript-eslint/no-var-requires */
const withFonts = require('next-fonts');

์ด๊ฒƒ์€ ๋‹ค์‹œ ์—ด๊ฑฐ๋‚˜ ์ ์–ด๋„ ์ด๊ฒƒ์ด ์•Œ๋ ค์ง„ ๋ฌธ์ œ์ž„์„ ์–ธ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด typescript ๋ฌธ์„œ์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ฌธ์„œํ™”ํ•˜๊ฑฐ๋‚˜ next.config.ts๋ฅผ ๋” ์ž˜ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ธ๋ จ๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰