Next.js: Serverless Next: `next` ๊ฐœ๋ฐœ ์ „์šฉ ์ข…์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ๋” ์ž‘์€ ๋นŒ๋“œ์™€ ๋” ๋น ๋ฅธ ๋ถ€ํŒ…์„ ์œ„ํ•ด `next-server` ๋„์ž…

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

๋ฌธ์ œ : ํ˜ธ์ถœ, ์ƒ์‚ฐ ๋นŒ๋“œ ์ตœ์ ํ™” next start ๋˜๋Š” ์‚ฌ์šฉ require('next') ๋‚ด์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ server.js ์˜ ์ „์ฒด ์„ธํŠธ๋ฅผ ๊ฐ€์ ธ ํฌํ•จ next ์„ ํฌํ•จํ•˜์—ฌ ์ข…์†์„ฑ์„ webpack ์™€ ๊ฐ™์ด ๊ฐœ๋ฐœ์—๋งŒ ๊ด€๋ จ๋œ ๊ฒƒ.

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

์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•˜๊ณ  _์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ๊ฐ„_์— ๋ฏผ๊ฐํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด(์˜ˆ: https://twitter.com/rauchg/status/990667331205447680 ์ฐธ์กฐ) next-server ํŒจํ‚ค์ง€๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

require('next') ์—์„œ ๋ชจ๋“  ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ์„ค์ •์„ ๋บ€ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ๊ณผ ํฌํŠธ๋ฅผ ์—ด๊ณ  ์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ž‘์€ next-server CLI๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ ํ™”ํ•˜๋ ค๋Š” ๋Œ€์ƒ:

  • next-server ์˜ ์ด ์ข…์†์„ฑ ์ง‘ํ•ฉ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์‹œ์ž‘ ํ•˜๋ ค๋ฉด ๋ถ€ํŒ… ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ตœ์ ํ™”ํ•ด์•ผ

๋˜ํ•œ, ์šฐ๋ฆฌ์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•œ๋‹ค examples/ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— next-server ๊ณผ ํ•จ๊ป˜ pkg ์ž์ฒด์— ํฌํ•จ ๋œ ELF ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ Next.js ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

p1 feature request

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

ํ”„๋ก ํŠธ์—”๋“œ์šฉ Now 2.0์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ๊ฐ„์€ 80mb IIRC์˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ์— ๋Œ€ํ•ด 1.5์ดˆ์ž…๋‹ˆ๋‹ค.

2018-05-29 16 50 37

Node ๋˜๋Š” V8 ๋˜๋Š” ์ฝœ๋“œ ํ‰๊ฐ€์— ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ์ข…์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  1์— ํ›จ์”ฌ ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ react ๋ฐ react-dom ).

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

ํ”„๋ก ํŠธ์—”๋“œ์šฉ Now 2.0์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝœ๋“œ ์Šคํƒ€ํŠธ โ€‹โ€‹์‹œ๊ฐ„์€ 80mb IIRC์˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ์— ๋Œ€ํ•ด 1.5์ดˆ์ž…๋‹ˆ๋‹ค.

2018-05-29 16 50 37

Node ๋˜๋Š” V8 ๋˜๋Š” ์ฝœ๋“œ ํ‰๊ฐ€์— ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ์ข…์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  1์— ํ›จ์”ฌ ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ react ๋ฐ react-dom ).

์™€, ์ด๊ฑด ๊ต‰์žฅํ•ด!! :์˜ํ˜•

์šฐ์™€ ๊ทธ๊ฑฐ ๊ต‰์žฅ ํ•˜๊ตฐ.

next-server ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

  1. ๋ผ์ดํŠธ ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„๊ฐ€ ๋ ๊นŒ์š”?
  2. ์˜ˆ, ๊ณ ์† ๊ฒฝ๋กœ ๋ฐ next-routes ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Nishchit14 ๋นŒ๋“œ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ ค๊ณ  ํ•œ๋‹ค๋ฉด express ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

next-routes ๋Š” ์—ฌ์ „ํžˆ ์ž˜ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์กด ์„œ๋ฒ„๋ฅผ ์ž์ฒด ํŒจํ‚ค์ง€๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ „๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ next๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  next-server๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ต‰์žฅํ•˜๋‹ค! ๋‚˜์™€ ๋‚ด๊ฐ€ ์•„๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์Šค์นธ๋””์›€ ( ์ด ๊ฐ€์ด๋“œ ์‚ฌ์šฉ )์„

1) ํŒจํ‚ค์ง€ ํฌ๊ธฐ. Lambda๋Š” ํฌํ•จ๋œ ๋ชจ๋“  ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” 50MB์˜ ํ•˜๋“œ ์ œํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

2) ์ฝœ๋“œ ์Šคํƒ€ํŠธ. Lambda๋Š” ์–ธ์ œ๋“ ์ง€ ๋” ๋งŽ์€ ์„œ๋ฒ„๋ฅผ ๊ฐ€๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋น ๋ฅธ ๋ถ€ํŒ…์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋ฒ„๋„ ์ตœ๋Œ€ 4์‹œ๊ฐ„ ๋™์•ˆ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ด๋‹ˆ์…”ํ‹ฐ๋ธŒ๋ฅผ ๋ณด๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์˜๊ณ  ๋„์›€์ด ๋˜์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์ข‹์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. Nuxt.js์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. nuxt start -> nuxt-start ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ช…๋ น์ด๊ธฐ ๋•Œ๋ฌธ์— nuxt-start ๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ์„œ www.bustle.com ์€ <1s ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ์žˆ๋Š” AWS Lambda์˜ SSR preact ์•ฑ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ๋œ ์ „์ฒด ํ”„๋กœ๋•์…˜ zip ํŒŒ์ผ์€ 166kb์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. Webpack์€ ๋ฒˆ๋“ค๋ง์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@southpolesteve๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. #๋ชฉํ‘œ

์‚ฌ์šฉ์ž ์‚ฌ๋ก€๋Š” micro ๋ฐ micro-dev ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ช…์นญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? next ๋ฐ next-dev

์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ next.js์™€ ์„œ๋ฒ„๋ฆฌ์Šค๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๊ณ  ์žˆ์œผ๋ฉฐ ์ง€๊ธˆ ๋” ์ž‘์€ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—์„œ ์ ˆ๋Œ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  serverless ๋˜๋Š” repack-zip ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋Š” node_modules ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@Enalmada ์—ฌ๋Ÿฌ dep์™€ ํ•จ๊ป˜ next.js๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  material-ui ๊ฐ€ ๊ทธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ทœ๋ชจ ๋ฉด์—์„œ ๊ฝค ํฐ ์•ฑ์ด ์žˆ์ง€๋งŒ Lambda์— ์—…๋กœ๋“œํ•˜๋Š” ๋นŒ๋“œ๋œ zip์€ ~ 45MB์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ฐพ์œผ์‹œ๋‚˜์š”?

@albinekb ์œ„์˜ 166kb์— ๋Œ€ํ•œ southpolesteve bustle.com ์‘๋‹ต์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ์œผ๋ฉฐ ์ด ํ›Œ๋ฅญํ•œ ํ‹ฐ์ผ“์ด ์™„์„ฑ๋  ๋•Œ๊นŒ์ง€ dist ์ œ์™ธ ํŒŒ์ผ์— ๋ฌด์—‡์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š”์ง€๋งŒ ์•Œ์•˜๋‹ค๋ฉด ๋‚ด "45MB"๊ฐ€ ์–ผ๋งˆ๋‚˜ ์“ธ๋ชจ์—†๊ณ  ์ œ๊ฑฐํ•˜๊ธฐ ์‰ฌ์šด์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. .

@albinekb ์›นํŒฉ, ์†Œํฌ ๋˜๋Š” ๋กค์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋žŒ๋‹ค์šฉ JS๋ฅผ ๋ฒˆ๋“ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์น˜๋Š” ๊ฒƒ์ด ๊ฝค ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํŒ… ์‹œ๊ฐ„๋„ ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.

ZEIT Now์— ๋ฐฐํฌํ•˜๊ณ  ๋น ๋ฅธ ์ฝœ๋“œ ๋ถ€ํŒ…์„ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด Package Phobia์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•˜๊ธฐ ์ „์— npm ์ข…์†์„ฑ์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ์ข…์†์„ฑ์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒฝ์ฐฝ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด).

readme์—๋Š” ๋˜ํ•œ ํŒฝ์ฐฝ๊ณผ ์‹ธ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์œ ์‚ฌํ•œ ๋„๊ตฌ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: https://github.com/styfle/packagephobia

์ด๊ฒƒ์€ ๋‹ค์Œ 7 ๋ฆด๋ฆฌ์Šค์—์„œ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? :(

์ง€๊ธˆ zeit์— ๋ฐฐํฌํ•˜๊ณ  ๋น ๋ฅธ ์ฝœ๋“œ ๋ถ€ํŒ…์„ ์œ„ํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด Package Phobia์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋นŒ์–ด๋จน์„ ๊ฐœ๋ฏธ: https://packagephobia.now.sh/result?p=antd

@Enalmada ์•„๋งˆ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ฑ…์ž„์ด ์žˆ๋Š” antd์˜ ์ข…์†์„ฑ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” https://packagephobia.now.sh/result?p=%40material-ui%2Fcore ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•˜๊ณ 

์ด๊ฒƒ์€ ๋‹ค์Œ 7 ๋ฆด๋ฆฌ์Šค์—์„œ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? :(

์ด ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด Next.js 7์€ Serverless Next.js์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•˜๊ณ  ์•ฝ 5๊ฐœ์˜ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ค์ œ๋กœ ํ”„๋กœ๋•์…˜์— ํ•„์š”ํ•œ ๊ฒฝ๋กœ๋Š” 2๊ฐœ๋งŒ ๋‚จ๊น๋‹ˆ๋‹ค.

๋กค์—… ์ž‘์—…์„ ์œ„ํ•ด next.js๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„์ฃผ ๊ฐ€๊นŒ์›Œ์ง„ ๊ฒƒ ๊ฐ™์•„์š”... 60m dist ํŒŒ์ผ์—์„œ ๋กค์—…์„ ์‹คํ–‰ํ•˜๋ฉด ํฌ๊ธฐ๊ฐ€ 6m๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ dist ํŒŒ์ผ์€ ์‹ค์ œ๋กœ ์‹œ์ž‘๋˜์ง€ ์•Š์œผ๋ฉฐ ๋กค์—… ์ค‘ ๊ฒฝ๊ณ ์ธ next.js ์ฝ”๋“œ์˜ ๋‹จ์ผ ์ˆœํ™˜ ์ข…์†์„ฑ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ next.js ์ฝ”๋“œ์—์„œ ์ˆœํ™˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•  ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ํ›จ์”ฌ ๋” ์ž‘์€ ๋นŒ๋“œ์™€ ๋” ๋น ๋ฅธ ๋ถ€ํŒ…์— ๋งค์šฐ ๊ฐ€๊นŒ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://github.com/zeit/next.js/issues/5392

์ด๊ฒƒ์„ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ์„œ www.bustle.com ์€ <1s ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ์žˆ๋Š” AWS Lambda์˜ SSR preact ์•ฑ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ๋œ ์ „์ฒด ํ”„๋กœ๋•์…˜ zip ํŒŒ์ผ์€ 166kb์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. Webpack์€ ๋ฒˆ๋“ค๋ง์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@southpolesteve ์›นํŒฉ ๋ฒˆ๋“ค ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๋ฌด์—‡์ด๋“  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@shauns ๋ถˆํ–‰ํžˆ๋„, ์ €๋Š” ๋” ์ด์ƒ Bustle์— ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๋” ์ด์ƒ ๋ณผ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

@southpolesteve ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ ์–ด๋„ webpack์—์„œ ๊ทธ ์œ„์น˜๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๋ฒˆ ๋‹ฌ์— ๋ช‡ ๊ฐ€์ง€ ์ปค๋ฐ‹์„ ๋ณด์•˜๋‹ค.

์นด๋‚˜๋ฆฌ์•„ ๋ถ„๊ธฐ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์–ธ์ œ ์ถœ์‹œํ•  ์˜ˆ์ •์ธ๊ฐ€์š”?

ํ˜„์žฌ ํƒ€์ž„๋ผ์ธ์„ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ์™„ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://spectrum.chat/zeit/general/unable-to-import-module-now-launcher-error~2662f0ba-4186-402f-b1db-2e3c43d8689a

๋ฐฉ๊ธˆ ์ฐฉ๋ฅ™ #5927

@timneutkens next ๋ฅผ devDependencies๋กœ ์ด๋™ํ•˜๊ณ  next-server ๋ฅผ ๋‚ด ์ข…์†์„ฑ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด babel์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋‚˜์š”?
https://github.com/zeit/next.js/blob/canary/packages/next/build/babel/plugins/next-to-next-server.ts

@Skaronator #5927์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์–‘์— ๋”ฐ๋ผ ํŽ˜์ด์ง€๋‹น ํ•˜๋‚˜์˜ ๋ฒˆ๋“ค์„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, .next/serverless/index.js ์š”๊ตฌ( require('./.next/serverless/index.js') )ํ•œ ๋‹ค์Œ render ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const page = require('./.next/serverless/index.js')

page.render(req, res)

๊ทธ๋Ÿฌ๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜๊ณ  ์‘๋‹ต์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๊ต‰์žฅํ•ด!
๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ aws ๋žŒ๋‹ค์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ํŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ปค์Šคํ…€ ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์„œ๋ฒ„๋ฆฌ์Šค ํŒŒ์ผ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค ๐Ÿค”

ํŽธ์ง‘ํ•˜๋‹ค
์ด๊ฒƒ์€ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด๋ ค๋ฉด ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

const serverless = require("serverless-http");
const http = require('http');
const app = require('./.next/serverless/index.js');
const server = new http.Server((req, res) => app.render(req, res))
app.prepare().then(() => {
    const handler = serverless(server, {
        binary: binaryMimeTypes
    });
    return handler(event, context, callback);
});

"์ปค์Šคํ…€ ์„œ๋ฒ„"์™€ "์„œ๋ฒ„๋ฆฌ์Šค"๋ฅผ ํ˜ผ๋™ํ•˜๊ณ  ๊ณ„์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น API๋Š” ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„๋ฆฌ์Šค์—๋Š” .prepare ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ค€๋น„ํ•  ๊ฒƒ์ด ์—†์œผ๋ฏ€๋กœ ์ฆ‰์‹œ ํŽ˜์ด์ง€๋ฅผ html๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. render ํ˜ธ์ถœ ์‹œ ์‘๋‹ต.

const serverless = require("serverless-http");
const http = require('http');
const page = require('./.next/serverless/index.js');
const server = new http.Server((req, res) => page.render(req, res))
const handler = serverless(server, {
  binary: binaryMimeTypes
});
handler(event, context, callback);

์‚ฌ์‹ค, ๊ทธ๋ฆฌ๊ณ  ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์™œ ์ž‘๋™ํ–ˆ๋Š”์ง€(์–ด์ฉŒ๋ฉด ๋‹จ์ง€ ์บ์‹œ์˜€์„ ์ˆ˜๋„ ์žˆ์Œ) ๊ทธ๋Ÿฌ๋‚˜ serverless-http ๊ฐ€ http.Server ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์™€ ๊ท€ํ•˜์˜ ์ฝ”๋“œ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค event ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๋ Œ๋”๋ง req ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— page.render(req, res) ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ด ํ‘œํ˜„ ๋˜ํ•œ, ๋‚ด๊ฐ€ ์›ํ•˜๋Š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค / KOA /๋Š”์ด ๋‹ค์Œ ์ƒˆ ๊ธฐ๋Šฅ์˜ ์ „์ฒด ๋ชฉ์ ์„ .. ํœด์‹ ๋•Œ๋ฌธ์— (์–ด๋–ค serverless-http ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉ์— ๊ดœ์ฐฎ๋‹ค๊ณ  ๊ทธ๋ž˜์„œ dependencie ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค)

๋‚˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์—†๋‹ค :/

์•„๋งˆ๋„ ์ด๊ฒƒ์€ @guillaumebreux https://github.com/zeit/now-builders/blob/master/packages/now-node-bridge/bridge.js์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@timneutkens ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. typeError: Parameter "url" must be a string, not undefined

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์˜ค์—ผ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๊ณ  ๊ณ„์† ํŒŒ๊ณ ๋“ค๋ฉฐ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์œผ๋ฉด ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

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

์ด ์Šค๋ ˆ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์— ์žˆ๋Š” gif๋Š” ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ธ ํ›„์ž์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด npm ํŒจํ‚ค์ง€ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋Š” next-server ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค . ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉฐ ๋ฒ„์ „ ํƒœ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ 8.0.0-canary.7(๋‹ค์Œ ๋ฒ„์ „ ํƒœ๊ทธ)์ด์ง€๋งŒ Google์ด๋‚˜ GitHub ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ํŒจํ‚ค์ง€.

๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์“ด ๊ฒƒ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์นด๋‚˜๋ฆฌ์•„์— ์žˆ๋”๋ผ๋„ ์กฐ๊ธฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ํ˜„์žฌ ์†”๋ฃจ์…˜(๋ช…๋ฐฑํ•œ ์ด์œ ๋กœ in prod ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ )์€ next.config.js config.externals ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์Šคํƒ€์ผ์ด ๋Šฆ๊ฒŒ ๋กœ๋“œ๋˜์–ด ๋ชจ๋“  ํŽ˜์ด์ง€ ๋กœ๋“œ์—์„œ 0.5์ดˆ ๋™์•ˆ ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. (๋‚ด ์ง๊ฐ์€ ์„ ํƒํ•œ ํ…Œ๋งˆ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ํ…Œ๋งˆ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๊ณ  ์„œ๋ฒ„๊ฐ€ ๊ณตํ†ต ๊ณต๊ธ‰์—…์ฒด ๋ฒˆ๋“ค์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋ถ„ํ• ์ด ์ž˜ ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.)

๋‚˜๋Š” node_modules 200MB์˜๋ฅผ ์„ค์น˜ ํ•œ ๋‹ค์Œ ๋‚ด ๊ฐ€๋‚œํ•œ, ์ž‘์€ ์ƒ์‚ฐ VM ๋‚ด๊ฐ€ ์—…๋ฐ์ด ํŠธ๋ฅผ ๋ฐ€์–ด๋งˆ๋‹ค์— ์ปดํŒŒ์ผ ์ด๋ถ„์„ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†๋„๋ก ๋ฏธ๋ฆฌ ๋นŒ๋“œ ๋œ ์„œ๋ฒ„๋ฅผ ์ƒ์‚ฐํ•  ์ˆ˜์žˆ์„ ์‹ถ์–ด์š”.


* "prod"๋Š” ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•˜๊ฑฐ๋‚˜ ๊ทธ๋‹ค์ง€ ์ „๋ฌธ์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Š์Šจํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ์„œ www.bustle.com ์€ <1s ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ์žˆ๋Š” AWS Lambda์˜ SSR preact ์•ฑ์ž…๋‹ˆ๋‹ค. ๋ฐฐํฌ๋œ ์ „์ฒด ํ”„๋กœ๋•์…˜ zip ํŒŒ์ผ์€ 166kb์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ชจ๋“  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. Webpack์€ ๋ฒˆ๋“ค๋ง์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Next.js 8 ์„œ๋ฒ„๋ฆฌ์Šค ํƒ€๊ฒŸ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 42Kb์˜ zip ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ต‰์žฅํ•ด! ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค!

@dfoverdx์™€ ์ •ํ™•ํžˆ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  node_modules๋„ ํฌํ•จํ•˜๋Š” ์„œ๋ฒ„ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Express์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ข…์†์„ฑ์ด ํŒจํ‚ค์ง€์— ํฌํ•จ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์ œ ์„œ๋ฒ„์— _all_ ์ข…์†์„ฑ๋„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(react, next, axios, ...).

์ด๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์€์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๋ชจ๋“  ์ข…์†์„ฑ์„ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์„œ๋ฒ„ ์ธก ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ์™„์ „ํžˆ ํ‹€๋ ธ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์ด webpack ๊ตฌ์„ฑ์˜ externals ์„น์…˜์„ ๋ฎ์–ด์“ฐ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์ข…์†์„ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

module.exports = {
  webpack: (config, { dev }) => {
    config.externals = [];
    return config;
  })
};

๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฒ„์—๋Š” ์—ฌ์ „ํžˆ react ๋ฐ react-dom์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค๋„ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ...

๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ ์„œ๋ฒ„๋ฆฌ์Šค ๋ชจ๋“œ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ .next์—์„œ ์ƒ์„ฑ๋œ _app.js๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด next/router์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋ฐ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋น„์„œ๋ฒ„๋ฆฌ์Šค ๋ชจ๋“œ๋„ ๋‹ค์Œ์— ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„ ํ˜„์žฌ ์„œ๋ฒ„๋ฆฌ์Šค ๋ชจ๋“œ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ .next์—์„œ ์ƒ์„ฑ๋œ _app.js๊ฐ€ ์˜ˆ๋ฅผ ๋“ค์–ด next/router์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋ฐ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ 8๋ถ€ํ„ฐ๋Š” server.js์—์„œ 'next' ๋Œ€์‹  'next-server'๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์ค‘๊ฐ„ ์„œ๋ฒ„์—์„œ CI ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  Webpack ๊ด€๋ จ ์ข…์†์„ฑ์„ ํ”„๋กœ๋•์…˜ ์ธ์Šคํ„ด์Šค์— ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์•„์ง ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@ElvenMonky ๋Š” 1๋…„ ์ „๋ถ€ํ„ฐ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์ง€๋งŒ ๋ฌธ์„œ๋‚˜ ์˜ˆ์ œ์—์„œ ์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@timneutkens ์ด๊ฒƒ์„ ํ™•์ธํ•ด ์ฃผ ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋Ÿฌํ•œ ์„ค์ •์„ ์‹คํ—˜ํ•˜๊ณ  ๋ฌธ์„œ/์˜ˆ์ œ์— ๋Œ€ํ•œ PR์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ 8๋ถ€ํ„ฐ๋Š” server.js์—์„œ 'next' ๋Œ€์‹  'next-server'๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์„œ๋ฒ„ ๋Œ€์ƒ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„๋ฆฌ์Šค ๋นŒ๋“œ๋Š” "๋Œ€์ƒ์ด ์„œ๋ฒ„๊ฐ€ ์•„๋‹ ๋•Œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. https://err.sh/zeit/next.js/next-start-serverless " ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๋Šฅ๋™์ ์œผ๋กœ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ผ๋ฐ˜ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋นŒ๋“œ ํŒŒ์ผ์€ next ํŒจํ‚ค์ง€์˜ ํ•ญ๋ชฉ์„ ์ง์ ‘ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ next/router ์„œ๋ฒ„ ์ธก ์ปดํŒŒ์ผ๋œ _app.js ํŒŒ์ผ์˜ next ๋ฐ webpack ์–ด์จŒ๋“  ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์— ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@ElvenMonky

๋‹ค์Œ 8๋ถ€ํ„ฐ๋Š” server.js์—์„œ 'next' ๋Œ€์‹  'next-server'๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด๋ถ€์ ์œผ๋กœ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
https://github.com/zeit/next.js/blob/709850154754278d2fc86b987eebe1b3f0565255/packages/next/build/babel/plugins/commonjs.ts#L5 -L32

@sheerun #7011์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด next-transpile-modules ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ next ๋ชจ๋“ˆ์„ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋ฉด ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ next/router ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/ElvenMonky/next.js/tree/custom-next-server-express/examples/custom-server-express

์ถ”์‹ : ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์  ๊ฒฝ๋กœ์™€ ์ •์  ์ฝ˜ํ…์ธ  ์ œ๊ณต์€ ๋ฌผ๋ก ์ด๊ณ  TODO์— ๋‚˜์—ด๋œ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ์ƒ๊ด€์—†์ด #5927์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋งค์šฐ ํฅ๋ถ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ข‹์€ ์†Œ์‹์€ ์œ„์˜ ์†”๋ฃจ์…˜์ด https://www.npmjs.com/package/next-serverless ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„ ์„ค์ •๊ณผ ์ž˜ ์ž‘๋™ํ•˜์—ฌ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ œํ•œ ์—†์ด ์˜ˆ๋ฅผ ๋“ค์–ด AWS Lambda์— ๋‹ค์Œ์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ 8๋ถ€ํ„ฐ๋Š” server.js์—์„œ 'next' ๋Œ€์‹  'next-server'๋ฅผ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์—๋งŒ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ์กฐ์–ธ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ next ๊ฐ€ ํ•„์š”ํ•œ next/config ๊ฐ€ ํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ require('next/config') ๋Š” ๋‹ค์Œ ๋ฒ„์ „ 8.0.3์˜ node_modules์— next ์„ค์น˜๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ”„๋กœ๋•์…˜์—์„œ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๋‹ค์Œ ๋ฒ„์ „ 8.1.0์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ/๊ตฌ์„ฑ์„ next-runtime-config ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋˜๋Š” next-runtime-vars (next.config.js์™€ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด config๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ).

ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹œ๋ฉด PR์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…• ๋ชจ๋‘๋“ค! ์ด ๋ฌธ์ œ๋Š” Next.js 8๋ถ€ํ„ฐ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ Next.js 9์—์„œ๋„ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Œ

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ํ˜ผ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/zeit/next.js/issues/7011
๋Œ€์ƒ์„ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค: "์„œ๋ฒ„๋ฆฌ์Šค"


์‚ญ์ œ๋œ ๋Œ“๊ธ€ ๋ณด๊ธฐ

์ผ๋ถ€ "next/*" ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด "next-server/*" ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ/๊ตฌ์„ฑ -> ๋‹ค์Œ ์„œ๋ฒ„/๊ตฌ์„ฑ
  • ๋‹ค์Œ/amp -> ๋‹ค์Œ ์„œ๋ฒ„/amp
  • ๋‹ค์Œ/๋™์  -> ๋‹ค์Œ ์„œ๋ฒ„/๋™์ 
  • ๋‹ค์Œ/์ƒ์ˆ˜ -> ๋‹ค์Œ ์„œ๋ฒ„/์ƒ์ˆ˜
  • ๋‹ค์Œ/ํ—ค๋“œ -> ๋‹ค์Œ ์„œ๋ฒ„/ํ—ค๋“œ

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ์˜ OP์—์„œ ์–ธ๊ธ‰ํ•œ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ง€์›์ด ์—†๋Š” ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ/๋ผ์šฐํ„ฐ -> ๋‹ค์Œ ์„œ๋ฒ„/dist/lib/๋ผ์šฐํ„ฐ/๋ผ์šฐํ„ฐ(์•„๋งˆ๋„)? (์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•จ)
  • ๋‹ค์Œ/๋งํฌ ?

์„œ๋ฒ„(AKAIK)์—์„œ๋„ ์ธ๋ผ์ธ๋˜๋ฏ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ/์•ฑ
  • ๋‹ค์Œ/๋ฌธ์„œ

์•ˆ๋…• ๋ชจ๋‘๋“ค! ์ด ๋ฌธ์ œ๋Š” Next.js 8๋ถ€ํ„ฐ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ Next.js 9์—์„œ๋„ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Timer - ๋‹น์‹ ์€ servless ๋Œ€์ƒ์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด 'next'๋ฅผ 'next-server'๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

next๋ฅผ ๋‹ค์Œ ์„œ๋ฒ„๋กœ ๊ต์ฒดํ•˜๋ฉด packages.json ์ข…์†์„ฑ๋„ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š” ํ•œ node_modules ํด๋” ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์„œ๋ฒ„๋ฆฌ์Šค ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” AWS Lambda์— ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋ฌธ์ œ์— ์„ค๋ช…๋œ ์ ‘๊ทผ ๋ฐฉ์‹์€ serverless ๋Œ€์ƒ์œผ๋กœ ๋ฐœ์ „ํ–ˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@timneutkens serverless ๋Œ€์ƒ์€ ๋™์  ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. #5927 ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ํŽ˜์ด์ง€, ์ž์‚ฐ ์ ‘๋‘์‚ฌ, ์‚ฌ์šฉ์ž ์ง€์ • _app, _document ๋ฐ _err: ๊ธฐ๋ณธ์ ์œผ๋กœ TODO ๋ชฉ๋ก์— ๋ช…์‹œ๋œ ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ œ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.
next-server ๋Š” webpack ๋ฐ babel๊ณผ ๊ฐ™์€ ์ด์ƒํ•œ ๊ฐœ๋ฐœ ์ „์šฉ ์ข…์†์„ฑ ์—†์ด ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ต๊ณผ woodoo ์ถค์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ด ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜๊ณ  @rauchg ๊ฐ€ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์ดˆ๊ธฐ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ธ์  ๊ฐ€ ๋” ๊ฐ•๋ ฅํ•œ ์†”๋ฃจ์…˜์„ ๋ณด๊ธฐ๋ฅผ ํฌ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

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