Next.js: Next๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š” ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

ํŽ˜์ด์ง€์˜ ๋ชจ๋“  .js ํŒŒ์ผ์ด ๊ฒฝ๋กœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

src/pages๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

์ด ๋‹ค๋ฅธ ์ฃผ์„์ด ๋ฌด์—‡์„ ๋งํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ next.js๊ฐ€ ๋ช…๋ น์ค„์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ next ./src
$ next dev ./src
$ next build ./src
$ next start ./src -p 8080

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

AFAIK, ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. next.config.js ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ผ์šฐํŒ…์„ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด dir ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹์ง€์ •ํ•˜๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ./src ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const next = require('next')({
  dev,
  dir: './src'
})

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ API(์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„ ํฌํ•จ)์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์ถ”์ • ์œ„์น˜์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค( next.config.js ๋ฐ static ๋””๋ ‰ํ† ๋ฆฌ, ์ œ ์ƒ๊ฐ์—๋Š”).

์ด ๋‹ค๋ฅธ ์ฃผ์„์ด ๋ฌด์—‡์„ ๋งํ•˜๋Š”์ง€ ๋ชจ๋ฅด์ง€๋งŒ next.js๊ฐ€ ๋ช…๋ น์ค„์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ next ./src
$ next dev ./src
$ next build ./src
$ next start ./src -p 8080

๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ณ€๊ฒฝํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ์งˆ๋ฌธ์€ ๊ฝค ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ ์ „์— ์•ž์œผ๋กœ ๋ฌธ์ œ ์ถ”์ ๊ธฐ(์ข…๋ฃŒ๋œ ๋ฌธ์ œ ํฌํ•จ)์—์„œ ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์‹ญ์‹œ์˜ค. .

@timneutkens ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์•ฑ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ๊ฑฐ๋ถ€ํ•œ moment.js์˜ ์œ ์ง€ ๊ด€๋ฆฌ์ž์™€ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” CRA์—์„œ๋„ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.
๋งŽ์€ ํ”„๋กœ์ ํŠธ ์ƒ์šฉ๊ตฌ์—๋Š” ํŒŒ์ผ์ด ์žˆ๋Š” src ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ˜„์žฌ Google์—์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ๊ฒฐ๊ณผ์ด๊ธฐ ๋•Œ๋ฌธ์— @timneutkens ๋ผ๋Š” ๊ฒฐ์ •์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@brainkim์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํŒจํ‚ค์ง€ json ์Šคํฌ๋ฆฝํŠธ์—

ํด๋” ์•ž์— ../๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค.

// src/next.config.js
module.exports = {
  distDir: '../dist'
}
// package.json
  "scripts": {
    "dev": "next ./src",
    "build": "next build ./src",
    "start": "next start ./src",
    ..
  },

@msegers ์ด ์„ค์ •์„ ๋”ฐ๋ฅด๋ ค๊ณ  ํ•˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Cannot find module 'next/document'
Cannot find module 'next/error'
...

HTTP ์š”์ฒญ ์‹œ(๊ฐ€์ ธ์˜ค๊ธฐ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜ ์—†์Œ). ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”?

๋ฃจํŠธ์— pages ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ์ •๋ง ์ €๋ฅผ ๋ฏธ์น˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ˜„์‹ค์ ์œผ๋กœ ํฐ ๊ฒƒ์€ ์Šคํƒ€์ผ, ๊ตฌ์„ฑ ์š”์†Œ, ํด๋ผ์ด์–ธํŠธ ์ €์žฅ์†Œ, ๊ตฌ์„ฑ ํŒŒ์ผ ๋“ฑ ๋ฃจํŠธ์— ์ œ์–ดํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ์Œ“์ด๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€: pages ์„ client/pages ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. Hot Reload๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์Šฌํผ :(

@msegers ์ œ์•ˆ์ด ์ €์—๊ฒŒ

next-i18next๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ NextI18 ๊ตฌ์„ฑ์—์„œ ์˜ฌ๋ฐ”๋ฅธ localePath๋ฅผ ์„ค์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. localePath: 'src/static/locales/',

์ด์™€ ๊ฐ™์ด :

NextI18NextInstance = new NextI18Next({
  defaultLanguage: 'en',
  otherLanguages: ['en'],
  debug: true,
  localePath: 'src/static/locales/',
});

์ด์— ๋Œ€ํ•œ ์š•๊ตฌ๊ฐ€ ๊ฝค ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š” ์œ„์น˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@malimccalla ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/slaterbbx/fullstackinator

๊ฒฝ๊ณ 

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํด๋” ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ "ํŽ˜์ด์ง€"๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ

ํด๋ผ์ด์–ธํŠธ ํด๋”๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ์‚ฌํ•ญ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„ ์‹œ๋‚˜๋ฆฌ์˜ค + typescript์— ๋Œ€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ต์‹ฌ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

  1. package.json์˜ ์Šคํฌ๋ฆฝํŠธ์—์„œ "npm run dev"์— ๋Œ€ํ•ด ( next ) ๋Œ€์‹  ํด๋”( next ./client )๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•˜์‹ญ์‹œ์˜ค / ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค
  2. ํ•ด๋‹น ํด๋”( ./client )์—๋Š” next.config.js ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
module.exports = {
    distDir: '../.next' // so that you can tell it to go up a folder for the dev and prod files.
}

์งˆ๋ฌธ์ด ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ์ €์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ๋ฐฉ๊ธˆ ์œ„์˜ @brainkim ์ด ๋˜‘๊ฐ™์€ ์„ค๋ช…์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์˜ˆ์ œ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์„ ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

@slaterbbx ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ๋ฐฐ์น˜ํ•˜๋ ค๊ณ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค

โ”œโ”€โ”€ components
|   โ”œโ”€โ”€  GridItem.tsx
|   โ”œโ”€โ”€  Avatar.tsx
|   โ””โ”€โ”€  Button.tsx
โ”œโ”€โ”€ pages
|   โ””โ”€โ”€ profile
|       โ””โ”€โ”€ components
|       |   โ”œโ”€โ”€ CoverPhoto.tsx
|       |   โ””โ”€โ”€ UserInterests.tsx
|       โ”œโ”€โ”€ data.ts
|       โ”œโ”€โ”€ styles.ts
|       โ””โ”€โ”€ index.tsx

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฌธ์ œ(@timneutkens๊ฐ€ ์ง€์ ํ•œ ๋Œ€๋กœ)๋Š” pages ๋‚ด์˜ ๋ชจ๋“  ํŒŒ์ผ์ด webpack ์ง„์ž…์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์ฐจ๋ก€๋กœ commonchunks ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ๊ณ ๋ ค๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ทธ๋Œ€๋กœ Next๋Š” pages ๋‚ด์˜ ์ตœ์ƒ์œ„ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๋ฅผ ์ฐพ๋Š” ์œ„์น˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด (ํ•ฉ๋ฆฌ์ ์ธ?) ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ตฌ์„ฑ์—์„œ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์ƒํ•œ๋‹ค.

pages: ["./pages/*/index.tsx"]

์—ฌ๋Ÿฌ ์œ„์น˜์— ํŽ˜์ด์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pages: ["./pages/*", "./admin-pages/*"]

๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ํด๋”์— ์ตœ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ

pages: ["./views/*"]

๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋ ค๋Š” ํ”„๋กœ์ ํŠธ

pages: ["./src/custom/path/to/pages/*"]

์ด๊ฒƒ์€ ๊ณต์ •ํ•œ ๊ธฐ๋Šฅ์ด๋ฉฐ ๊ธ‰์ง„์ ์ธ ํŒจํ„ด์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค( ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„ ์€ ๋™์ผํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ Next.js ์ž์ฒด๊ฐ€ ๊ตฌํ˜„ ํ•˜๋Š” ํŒจํ„ด workspaces ์„ ์ฐพ์Šต๋‹ˆ๋‹ค).

@malimccalla ์•„, ๋„ค, ๋‹น์‹ ์˜ ์Šฌํ””์„ ์™„์ „ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์™„์ „ํžˆ ์œ ์—ฐํ•œ ์†”๋ฃจ์…˜์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋ ฅ์— ๊ธฐ์—ฌํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์†”๋ฃจ์…˜ ์ œ๊ณต์— ๊ด€์‹ฌ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋“ค์ด ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋ถ€์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ํ™•์ธํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋‹ค์‹œ ์ฐฉ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ™‹โ€โ™‚๏ธ

@malimccalla ๋‹ค์Œ์œผ๋กœ ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋กœ ๋ฉ‹์ง€๊ฒŒ ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด pages ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ‰ํ‰ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ํŽ˜์ด์ง€ ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ๊ณณ์— ์ €์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

@joncursi pages ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ด๋ฆ„์„ views ๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ์ตœ์ƒ์œ„ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์œ ์ผํ•œ ๋ชฉ์ ์ธ ์ƒˆ pages ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด pages/profile.tsx ์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export { default } from "../views/profile"  

์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@folofse i18n

๋””๋ฒ„๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋กœ๊ทธ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค(i18next).

...
  localePath: 'src/static/locales',
  localeStructure: '{{lng}}/{{ns}}',
  localeSubpaths: 'foreign',
  backend:
   { loadPath:
      'V:/dev/some-project/static/locales/{{lng}}/{{ns}}.json',
     addPath:
      'V:/dev/some-project/static/locales/{{lng}}/{{ns}}.missing.json' },
  allLanguages: [ 'de', 'de' ],

loadPath๋Š” *\static\locales ๋˜์ง€๋งŒ *\src\static\locales ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜๋ฌธ:

/projectRoot/next-web/server.js ์— ์‚ฌ์šฉ์ž ์ •์˜ ์„œ๋ฒ„ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด /projectRoop/next-renderer-universal/client ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.

// in /projectRoot/next-web/server.js
const nextApp = next({
  dev: NODE_ENV !== 'production',
  dir: APP_DIR,
  quiet: false,
});

์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ฐฐ์†กํ•ฉ๋‹ˆ๊นŒ? :)?

@armenr ์ด ์ž‘์€ ์•ฑ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ง„์ž…์ ( src/server.ts )์„ ์‚ฌ์šฉํ•˜๋ฉฐ next() ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://gitlab.com/kachkaev/website-frontend/blob/e1c7106cf63811f6341c4bd47dd2354eb2546914/src/server.ts#L11 -18

๋ชจ๋“  ์†Œ์Šค ํŒŒ์ผ์„ PROJECT_ROOT/src (๋˜๋Š” ๋‹ค๋ฅธ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ) ์•„๋ž˜์— ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ Next.js์—์„œ ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Next 9์— ์ถ”๊ฐ€๋œ ์ž๋™ TS ํ†ตํ•ฉ์œผ๋กœ ์ธํ•ด ์ƒํ™ฉ์ด ์ข€ ๋” ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜” https://github.com/zeit/next.js/issues/4315 ๊ฐ€ ๋‹ค์‹œ ์—ด๋ ธ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

:) ๋‚˜๋Š” monorepo๋ฅผ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๋ฌป๋Š” ์งˆ๋ฌธ์€ ๋‹ค๋ฅธ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ดํ›„๋กœ ์šฐ๋ฆฌ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ์•Œ์•„๋ƒˆ์ง€๋งŒ ์ƒ˜ํ”Œ ์ฝ”๋“œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค! ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค :)

@armenr monorepo ์™€ ๊ด€๋ จํ•˜์—ฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? lerna๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@anoop-gut

Lerna, monorepo, ์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„ ๋ฐ ๋ณ„๋„์˜ packages.

๋ชจ๋“  ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ renderer-universal ํด๋”์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ next-web ๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๋‹ค์Œ ์„œ๋ฒ„๋ฅผ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ nextron ๋ณด๊ด€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(next + electron...excellent project, GitHub์—์„œ ์ฐพ์•„๋ณด๊ธฐ).

nextron ๋ฐ next-web์šฉ server.js ํŒŒ์ผ์—์„œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const nextApp = next({
  dev: NODE_ENV !== 'production',
  dir: APP_DIR,
  quiet: false,
});

๊ทธ๋ฆฌ๊ณ  ENV ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋Ÿฌ-์œ ๋‹ˆ๋ฒ„์„ค ํŒจํ‚ค์ง€์˜ ๋””๋ ‰ํ† ๋ฆฌ ์œ„์น˜๋ฅผ ํ•ด๋‹น ์„œ๋ฒ„ ํŒŒ์ผ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ monorepo์˜ ๋‹ค๋ฅธ lerna ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ๋งŽ์€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ webpack/babel ๊ตฌ์„ฑ ๋˜๋Š” symlink ํ•ด๊ฒฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

  - api
  - pages
  - utils

์ตœ์ƒ์œ„ src ํด๋”๋Š” ์ •์ƒ์ด๋ฉฐ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์™œ ์•ˆ ๋ผ ?

@revskill10 ๋„ค , ์ €๋„ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•ฑ ๋ฐ ์„œ๋น„์Šค + NextJS๋ฅผ ๋ฐ์Šคํฌํ†ฑ/ํด๋ผ์šฐ๋“œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ์™€ ์›น ๋นŒ๋“œ ๋ชจ๋‘์— ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ - node_modules ์ค‘๋ณต, ์‚ฌ์šฉ์ž ์ •์˜ serverJS ํŒŒ์ผ w/ Next, ๊ณต์œ  ๋ชจ๋“ˆ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์‚ฌ์ด์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด์˜/๊ฐ„๋‹จํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

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

์‹œ์ž‘ํ•˜๋Š” ํ‰๊ท ์ ์ธ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ๊ณผ์ž‰์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์ดˆ๊ธฐ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์— ๋Œ€ํ•ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ์ •์˜ server.js ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  Next9์— ๊ตฌํ˜„๋œ /api ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์ด๋™ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์›น + ๋„ฅ์ŠคํŠธ๋ก ์„ ๋™์‹œ์— ๊ฐœ๋ฐœ/๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์—ฌ์ „ํžˆ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@armenr ์ €์žฅ์†Œ ์œ„์น˜๋ฅผ

distDir: '../dist', ๋ฉ”์„œ๋“œ๋Š” Typescript ๋ฐ ๊ณ ๊ฐ ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” Next 9์—์„œ ๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” src ๋””๋ ‰ํ† ๋ฆฌ์— tsconfig.json ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์ง€ ๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์˜ฎ๊ฒจ์•ผํ–ˆ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋Ÿฐ ํ˜ผ๋ž€ ๐Ÿ˜ž

image

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์ง€ ๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์˜ฎ๊ฒจ์•ผํ–ˆ์Šต๋‹ˆ๋‹ค ... ๊ทธ๋Ÿฐ ํ˜ผ๋ž€ ๐Ÿ˜ž

image

๊ฒฝ๋กœ ํ™•์ธ์„ ์–ด์ง€๋Ÿฝํžˆ ๊ฑฐ๋‚˜ tsconfig.json์—์„œ ์ง„์ž…์  ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€

์ด๊ฒƒ์€ 2017๋…„๋ถ€ํ„ฐ ์š”์ฒญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@timneutkens ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ณ  ์žฌ๊ณ 

์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ธ€ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
https://github.com/zeit/next.js/issues/4315#issuecomment -522263598

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