Next.js: ๊ธฐ๋Šฅ ์š”์ฒญ : Basepath ์ง€์›

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

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

๊ธฐ๋Šฅ ์š”์ฒญ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋‹ค์ค‘ ์˜์—ญ ์€ ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ์—ฌ๋Ÿฌ next.js ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ next.js์˜ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ํ—ˆ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์•ฑ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ์•ฑ์˜ ํŽ˜์ด์ง€์— ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.

next.config.js ํŒŒ์ผ์—์„œ basepath ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ๋•๋ถ„์— next.js์˜ ๋ชจ๋“  ๋ถ€๋ถ„ (๋ผ์šฐํ„ฐ, ๋งํฌ, ์ •์  ์ž์‚ฐ ๋“ฑ)์€ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•œ ๋Œ€์•ˆ ์„ค๋ช…

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

์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ

assetPrefix ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์•ฑ์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ ‘๋‘์‚ฌ๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๊ณต์ •ํ•œ ๊ฒƒ์€ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

with-zones ์˜ˆ์ œ

module.exports = {
  assetPrefix: NOW_URL ? `https://${alias}` : 'http://localhost:4000'
}

๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

module.exports = {
  assetPrefix: NOW_URL ? `https://${alias}/account` : 'http://localhost:4000/account'
}

screen shot 2018-08-21 at 10 47 08

์ œ ์ƒ๊ฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ณ€์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

module.exports = {
  assetPrefix: NOW_URL ? `https://${alias}` : 'http://localhost:4000',
  basepath: '/account'
}

๊ด€๋ จ ๋ฌธ์ œ

story needs investigation

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

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ... ์ž‘๋…„ ์—์ด ๋ฌด๋ ต์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 1 ๋…„ ํ›„, ์ €๋Š” ์ƒˆ๋กœ์šด ์•ฑ์„ ๊ฐœ๋ฐœ ์ค‘์ด๋ฉฐ ์ž‘๋…„์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Basepath๋Š” ๋ฐ”๋‹๋ผ ๊ธฐ๋Šฅ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜์—ฌ ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Next.js๋Š” ์ €ํฌ ํŒ€ (5 ๋ช…)์ด ํ’€ ํƒ€์ž„์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋™์‹œ์— ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋…„์— ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (์‹ ๊ทœ ๋ฐ ๊ธฐ์กด)์„ ํ›จ์”ฌ ๋” ์ž‘๊ณ , ๋น ๋ฅด๊ณ , ๋” ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์— ๋Œ€ํ•ด "์ฐฌ์„ฑ"์„ ํ‘œ๋ช…ํ•˜๋ ค๋ฉด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์Šค๋ ˆ๋“œ์—์„œ ๐Ÿ‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

basePath ์ด ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์ด์–ด์•ผํ•œ๋‹ค๋Š” ์ ์— ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋กœ๋“œ๋งต์— ์žˆ์œผ๋ฉฐ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์‹œ ์ฝ์–ด ๋ณด๋ฉด ๋ณผ ์ˆ˜์žˆ๋Š” ์ดˆ๊ธฐ PR๋„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

PR : https://github.com/zeit/next.js/pull/9872

์ด ๊ธฐ๋Šฅ์„ ์‹คํ˜„ํ•˜๋Š” ๋ฐ ์žฌ์ •์ ์œผ๋กœ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด [email protected]์œผ๋กœ ๋ฌธ์˜ํ•˜์‹ญ์‹œ์˜ค.

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

cc @jxnblk

cc @alexindigo @DullReferenceException

๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๋‹ค๊ฐ€ assetPrefix ๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

module.exports = {
  host: NOW_URL ? `https://${alias}` : 'http://localhost:3000',
  basePath: '/account',
}

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ assetPrefix ๋ณ€์ˆ˜๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ํ•„์š”ํ•œ ๊ฒƒ์„๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ž์‚ฐ ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์ด ๋‘ ๋ณ€์ˆ˜๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋ผ์šฐํŒ… ๋“ฑ์˜ ๊ฒฝ์šฐ ๋ณ„๋„๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ํ•จ๊ป˜ ์ œ๊ณต ํ•œ ๋‹ค์Œ next.js ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ถ„ํ•  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ assetPrefix๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ถ€์ž‘์šฉ์œผ๋กœ ์ด๊ฒƒ์€ ๋˜ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ค„์ž…๋‹ˆ๋‹ค.
์ด ๋‘ PR์„ ๋น„๊ตํ•˜๋ฉด ๋งค์šฐ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/panter/next.js/pull/2 (๋ถ„ํ• )
https://github.com/panter/next.js/pull/1 (๋‘˜ ๋‹ค ํ†ต๊ณผ)

์ œ ์ƒ๊ฐ์—๋Š”, ๊ทธ๋“ค์€ ๋ถ„๋ฆฌํ•ด์•ผํ•œ๋‹ค, ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ด์œ ๋Š” ํŒŒ๊ดด ์•„๋‹ˆ์—์š” ๋” ์œ ์—ฐํ•œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค assetPrefix ํ•˜๊ณ ์žˆ๋Š” basePath ๋ณ„๋„๋กœํ•ฉ๋‹ˆ๋‹ค.

assetPrefix ์ด ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„์ž…๋‹ˆ๊นŒ? ๋‘ ๋ณ€์ˆ˜ ๋ชจ๋‘ ์‹ค์ œ๋กœ ์ ‘๋‘์‚ฌ ๋งž์Šต๋‹ˆ๊นŒ?

assetPrefix ๋Š” ์ž์‚ฐ ์šฉ์ž…๋‹ˆ๋‹ค ( ์˜ˆ : ํŽ˜์ด์ง€ ๋ฒˆ๋“ค). basePath๋Š” ๋ผ์šฐํ„ฐ ์šฉ์ž…๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • assetPrefix ๊ฐ€ ์ •์˜ ๋œ ๊ฒฝ์šฐ assetPrefix ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„๋กœ๋“œํ•˜๊ณ  ๋ผ์šฐํ„ฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค (ํ˜„์žฌ ๋™์ž‘).
  • assetPrefix ๋ฐ basePath ๊ฐ€ ์ œ๊ณต๋œ ๊ฒฝ์šฐ assetPrefix ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„๋กœ๋“œํ•˜๊ณ  basePath ๋ฅผ ๋ผ์šฐํ„ฐ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • assetPrefix ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  basePath ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ basePath ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„๋กœ๋“œํ•˜๊ณ  basePath ๋ฅผ ๋ผ์šฐํ„ฐ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • assetPrefix ๋„ basePath ๋„ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( assetPrefix ๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ˜„์žฌ ๋™์ž‘).

cc @alexindigo @DullReferenceException @ 3rd-Eden

์œ„์˜ ์ œ์•ˆ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? https://github.com/zeit/next.js/issues/4998#issuecomment -414978297

@tomaswitek ํ˜„์žฌ assetPrefix ์—์„œ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž์‚ฐ ์ ‘๋‘์‚ฌ "assetPrefix":"https://static.trulia-cdn.com/javascript" ์ด๋ฉฐ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ์—ฌ๋Ÿฌ ์˜์—ญ (์„ฌ์ด๋ผ๊ณ  ๋ถ€๋ฆ„)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ ์„ฌ์˜ "basePathing"์€ ์„ฌ ๊ฐ„์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

  1. ๋ฐฐํฌ ๋ฌธ์ œ ๋Œ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฌธ์ œ โ€“ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋””์— ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ๋“ค์–ด์˜ค๋Š” http ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ์–ด๋”˜๊ฐ€์— ๋ฐฐํฌ๋˜๋ฉด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ, ๋‹ค๋ฅธ ํฌํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ก ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ basePath๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ”„๋ก์‹œ ๋˜๋Š” ๊ธฐํƒ€ ์ˆ˜๋‹จ์„ ํ†ตํ•ด ์•ฑ์— ๋Œ€ํ•ด ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

  2. ์„ฌ ์‚ฌ์ด์˜ ๊ต์ฐจ ๋งํฌ โ€“ ์„ฌ์˜ ์ •์‹ ์„ ๋ณ„๋„์˜ ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ์—”ํ‹ฐํ‹ฐ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์„ฌ ์‚ฌ์ด์— ๋‚ด๋ถ€ ๊ตฌํ˜„ ์ง€์‹์ด ๋ˆ„์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ์„ฌ์ด ์„œ๋กœ์˜ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์„ฌ์ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (_ ๊ทธ๋ฆฌ๊ณ  nextjs ์„ธ๊ณ„์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ <IslandALink> ์ข…๋ฅ˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„ ํ˜ธ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•_).
    ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ฌ์€ ๋™์ผํ•œ ๋„๋ฉ”์ธ์„ ๊ณต์œ ํ•˜๊ณ  ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์ง‘ํ•ฉ ( /path1 , path2 ๋“ฑ)์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋‘ ๋ฒˆ์งธ ์„ฌ์€ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ๊ฐ€์ ธ ์™€์„œ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ฐ ์„ฌ์ด ๊ฒฝ๋กœ๋ฅผ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ตœ์†Œํ•œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค (์–ด์จŒ๋“  ์›น์—์„œ๋Š” ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค) :)

๋ฐฐํฌ ํŠน์ • basePath๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ „์ฒด ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์ด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์•„์ผ๋žœ๋“œ๊ฐ€ ์ž์ฒด ๋ฐฐํฌ basePath๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ (๊ทธ๋ฆฌ๊ณ  ์ง€์‹œ ํ•  ์ˆ˜๋„ ์žˆ์Œ)? ๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”? ์•„๋‹ˆ๋ฉด ์•„์ผ๋žœ๋“œ A๊ฐ€ ๋ฐฐํฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋ฌด๊ด€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์„ฌ A๊ฐ€ ์ž์‹ ์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฌ B๊ฐ€ ๋ฐฐ์น˜ ๋œ ์„ฌ A๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์•„๋‹ˆ๋ฉด ๋ฐฐ์น˜ ๋œ ๋ชจ๋“  ์„ฌ์— ๋Œ€ํ•œ basePath๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“  ์„ฌ์— ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๊ฑด์„ ๋ฐฐํฌํ•˜๋Š” ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์„ฌ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ ๋ชจ๋“  ์„ฌ์„ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ๊ทธ ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ์ƒ์ƒ ํ–ˆ์Šต๋‹ˆ๊นŒ?

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

^ ๋ชจ๋‹ ์ปคํ”ผ ์ „์— ์ผ์œผ๋‹ˆ ์ข€ ๋” ์ผ๊ด€๋œ ์„ค๋ช…์ด ํ•„์š”ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. :)

๋จผ์ € ์‹œ๊ฐ„์„๋‚ด์–ด ์ œ ๋ฌธ์ œ๋ฅผ ๊ฒ€ํ†  ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@timneutkens ์˜ˆ assetPrefix ๋Š” basePath ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ฒ˜์Œ์— ๋…ผ์˜ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐœ์˜ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋” ๊นจ๋—ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ์†”๋ฃจ์…˜์œผ๋กœ ๋กค๋ฐฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „ํ˜€ ๋ฌธ์ œ์—†์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณด๊ด€ํ•ฉ์‹œ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ํฐ ์†Œ๋ฆฌ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ž์„ธํ•œ ๋‹ต๋ณ€์€ @alexindigo Thx์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์งˆ๋ฌธ์— ๋‹ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜

ํ˜„์žฌ assetPrefix์—์„œ ์ •ํ™•ํžˆ ๋ฌด์—‡์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ

์—ฌ๊ธฐ์— ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์ด๋‚˜ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ์ž‘์—… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋„๋ฉ”์ธ ์ œํ•œ ๋ฐ ์™€์ผ๋“œ ์นด๋“œ SSL ์ธ์ฆ์„œ ์—†์Œ)
  2. ๋‹จ์ผ ๋„๋ฉ”์ธ์—์„œ assetPrefix ๋ฅผ ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ”„๋ก์‹œ ๋ผ์šฐํŒ…, ์ •์  ํŒŒ์ผ ๋“ฑ์„ ๋” ๋งŽ์ด ์กฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. basePath ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์กฐ์ •์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @timneutkens๊ฐ€ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด basePath ๋ฅผ ์ œ๊ณต ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๊ฒƒ๋„ ์ œ๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋””์— ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ๊ฐ™์€ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ํ˜„์žฌ ์†”๋ฃจ์…˜์—์„œ assetPrefixes๋ฅผ ๋™์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ์—์„œ ์š”์ฒญ ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

๋ผ์šฐํ„ฐ๋Š” contextPath๋ฅผ ์ธ์‹ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ž…๋‹ˆ๋‹ค.

๊ฐ ์„ฌ์ด ์ž์‹ ์˜ ๋ฐฐํฌ basePath๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์•„์ผ๋žœ๋“œ A๊ฐ€ ๋ฐฐํฌ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋ฌด๊ด€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๊ธฐ์„œ ์ž์œ ๋ฅผ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. assetPrefix์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ basePath๋ฅผ ๋™์ ์œผ๋กœ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์„ฌ A๊ฐ€ ์ž์‹ ์— ๋Œ€ํ•ด ์•„๋Š” ๊ฒƒ๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฌ B๊ฐ€ ๋ฐฐ์น˜ ๋œ ์„ฌ A๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”? ์•„๋‹ˆ๋ฉด ๋ฐฐ์น˜ ๋œ ๋ชจ๋“  ์„ฌ์— ๋Œ€ํ•œ basePath๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“  ์„ฌ์— ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๊ฑด์„ ๋ฐฐํฌํ•˜๋Š” ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์„ฌ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ ๋ชจ๋“  ์„ฌ์„ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๋ฌผ๊ฑด์„ ๋ฐฐํฌํ•˜๋Š” ํ˜„๋Œ€์ ์ธ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์„ฌ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ ๋ชจ๋“  ์„ฌ์„ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์˜์—ญ์—๋Š” basePath๊ฐ€ ์žˆ๊ณ  ์ผ๋ถ€๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์•ฑ์€ ๋‹ค์ค‘ ์˜์—ญ ์„ค์ • ์—†์ด๋„ basePath ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alexindigo pls๋Š” next.js์— ์˜ํ•ด ๋ Œ๋”๋ง๋˜๋Š” ๋‘ ๊ฐœ์˜ ์‹ค์ œ ์„ฌ URL์„ ์ œ๊ณตํ•˜์—ฌ ์‹ค์ œ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•˜๋‚˜๋ฅผ ์ฐพ์œผ๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋„๋ฉ”์ธ์—์„œ _next ์š”์ฒญ์ด์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
๋ชจ๋“  ์„ฌ์˜ ๊ตฌ์„ฑ์ด ๋™์ผํ•ฉ๋‹ˆ๊นŒ?
"assetPrefix":"https://static.trulia-cdn.com/javascript"

๋ฟก ๋นต๋€จ

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์ด๋‚˜ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ์ž‘์—… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋„๋ฉ”์ธ ์ œํ•œ ๋ฐ ์™€์ผ๋“œ ์นด๋“œ SSL ์ธ์ฆ์„œ ์—†์Œ)

์•„, ๊ทธ๋ ‡๋‹ค๋ฉด ๊ณ ์ „์ ์ธ ์˜๋ฏธ์—์„œ CDN์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์•ฑ์—์„œ ์ง์ ‘ ๊ฐ€์ ธ ์˜ค๋Š” ์ž์‚ฐ์— ์˜์กดํ•ฉ๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ฐธ์กฐ.

ํ˜„์žฌ ๋‹จ์ผ ๋„๋ฉ”์ธ์—์„œ assetPrefix๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ”„๋ก์‹œ ๋ผ์šฐํŒ…, ์ •์  ํŒŒ์ผ ๋“ฑ์—์„œ ๋” ๋งŽ์€ ์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. basePath๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์กฐ์ •์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @timneutkens๊ฐ€ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด basePath๋ฅผ ์ œ๊ณต ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๊ฒƒ๋„ ์ค‘๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Btw, ๊ทธ๊ฒƒ์€ "์•„๋‹ˆ์š”, ๊ทธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๊ฐ€ ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. :) ๊ทธ๊ฒƒ์€ ๋” ๋น„์Šทํ–ˆ์Šต๋‹ˆ๋‹ค โ€“ "์•„๋งˆ ์šฐ๋ฆฌ๋Š”์ด ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•ด ๋” ์ „์ฒด ๋ก ์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.":)

๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๊ธฐ์„œ ์ž์œ ๋ฅผ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. assetPrefix์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ basePath๋ฅผ ๋™์ ์œผ๋กœ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

๊ฒฝ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ์— basePath๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๋นŒ๋“œ์‹œ ๋ฐœ์ƒํ•˜๊ณ  basePath๋Š” ๋ฐฐํฌ์‹œ ์ •์˜๋˜๋ฉฐ ๋™์ผํ•œ ์ฝ”๋“œ ์•„ํ‹ฐํŒฉํŠธ (stage, preprod, prod, prod)์˜ ๋ฐฐํฌ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋“ฑ).


๋ชจ๋“  ์„ฌ์˜ ๊ตฌ์„ฑ์ด ๋™์ผํ•ฉ๋‹ˆ๊นŒ?
"assetPrefix": " https://static.trulia-cdn.com/javascript "

์˜ˆ, ๋ชจ๋“  ์„ฌ์€ ์ž์‚ฐ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์ฝ˜ํ…์ธ  ํ•ด์‹ฑ์ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ๋งค์šฐ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค. (๊ฐ ์•„ํ‹ฐํŒฉํŠธ์—์„œ ๋นŒ๋“œ ๋œ ์ž์‚ฐ์„ ์ถ”์ถœํ•˜๊ณ  ๋ฐฐํฌ์‹œ CDN์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.)

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์•ฑ ์„œ๋ฒ„์— "์ผ๋ฐ˜์ ์ธ html"์š”์ฒญ ๋งŒ ์žˆ์œผ๋ฏ€๋กœ trulia.com์—์„œ "_next"๊ฒฝ๋กœ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ฌ์˜ ์˜ˆ :

์šฐ๋ฆฌ์˜ ์ƒˆ๋กœ์šด ์„ฌ โ€“ ์ด์›ƒ ํŽ˜์ด์ง€ โ€“ https://www.trulia.com/n/ca/san-francisco/pacific-heights/81571 (์—ฌ๊ธฐ์—์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : http : //www.trulia. com / neighborhoods)
์ด ์„ฌ์€ ๋ชจ๋“  /n/* ๊ฒฝ๋กœ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ์„ฌ์€ ์šฐ๋ฆฌ์˜ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค โ€“ https://login.trulia.com/login โ€“ ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด์ง€๋งŒ ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๋™์ผํ•œ ๋ฐฐํฌ์ž…๋‹ˆ๋‹ค. :)
๊ทธ๋ฆฌ๊ณ ์ด ์„ฌ์€ /login , /signup ์™€ ๊ฐ™์€ URL์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•œ ์ ์ด ๋” ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

@alexindigo ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์…”์„œ ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์ œ๋ฅผ ๋ถ„์„ ํ•œ ํ›„ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

์—ฌ์ „ํžˆ ๋ชจ๋“  ์„ฌ์— ๋Œ€ํ•ด ์„œ๋ฒ„ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ž์‚ฐ์„ ๊ณตํ†ต CDN์œผ๋กœ ์ถ”์ถœํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

https://www.trulia.com/n/ca/san-francisco/pacific-heights/81571 ์ด ํ˜ธ์ถœ ๋  ๋•Œ ์ •ํ™•ํžˆ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ข€ ๋” ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ท€ํ•˜์˜ ๋Œ€๋ฆฌ์ธ์€ /n ์ด ์ง€์—ญ ๊ฐœ์š”๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์„ฌ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์„ฌ์— ๋„์ฐฉํ•˜๊ธฐ ์ „์— ์š”์ฒญ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ ๊นŒ?

๋‹ค์Œ ์„ฌ ๋‚ด๋ถ€์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์„ฌ ๋‚ด๋ถ€์˜ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ Neighborhood overview ์€ URL์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‹ฌ ํƒ์ƒ‰ ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์—๋Š” ์™„์ „ํ•œ ๋งž์ถคํ˜• ์†”๋ฃจ์…˜์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋Œ“๊ธ€์—์žˆ๋Š” ๋ชจ๋“  ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ๐Ÿ˜

Btw, ๊ทธ๊ฒƒ์€ "์•„๋‹ˆ์š”, ๊ทธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค"๊ฐ€ ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. :) ๊ทธ๊ฒƒ์€ ๋” ๋น„์Šทํ–ˆ์Šต๋‹ˆ๋‹ค โ€“ "์•„๋งˆ ์šฐ๋ฆฌ๋Š”์ด ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•ด ๋” ์ „์ฒด ๋ก ์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.":)

๋ฌผ๋ก , next.js๋ฅผ ๋งŒ์งˆ ํ•„์š”๊ฐ€์—†๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜

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

๋‚˜๋Š” "์„ฌ"ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์“ฐ๊ฑฐ๋‚˜ ๋งํ•œ ์ ์ด ์—†๋‹ค. ๋ฐฉ๊ธˆ @timneutkens ์™€ ์ฑ„ํŒ…์„ next.js ๊ฐ€ basepaths๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ํ•œ ํ›„์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ฐพ๋Š” ์œ ์ผํ•œ ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์กฐ๊ธˆ ๊ธฐ์—ฌํ•  ์ˆ˜์žˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ Tim์€ ๋‚˜์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„์ฃผ๊ธฐ ์œ„ํ•ด ํ•‘์„ํ–ˆ๊ณ  ํ”ผ๋“œ๋ฐฑ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๋นŒ๋“œ์‹œ ๋ฐœ์ƒํ•˜๊ณ  basePath๋Š” ๋ฐฐํฌ์‹œ ์ •์˜๋˜๋ฉฐ ๋™์ผํ•œ ์ฝ”๋“œ ์•„ํ‹ฐํŒฉํŠธ (stage, preprod, prod, prod)์˜ ๋ฐฐํฌ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๋“ฑ).

๋นŒ๋“œ ํ•  ๋•Œ ๊ฒฝ๋กœ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๋‹ค๋ฅธ ์„ฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์—์„œ basePath๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์š”์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ๋Š” ์ •๋ง ๊ทธ๋Ÿฐ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ ์•ฑ์„ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๊ณผ ํฌํŠธ์— ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ๋™์ผํ•œ basePath๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์•„์นจ @tomaswitek :)

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

์—ฌ์ „ํžˆ ์•ฑ์„ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๊ณผ ํฌํŠธ์— ๋ฐฐํฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ๋™์ผํ•œ basePath๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํ•˜์œ„ ํด๋”์™€ ๊ฐ™์€ - ๋‹น์‹  ๊ฐ™์€ ์†Œ๋ฆฌ๋Š” ์ฒ˜์Œ์— ์–ธ๊ธ‰ํ•˜๋Š” ๊ทธ "basePath๋Š”"๋‹น์‹ ์˜ ๋ผ์šฐํŒ… ์ฝ”๋“œ์˜ ์ผ๋ถ€ ์†”๋ฃจ์…˜, ๋ญ”๊ฐ€ ๊ดœ์ฐฎ์„ ๊ฒƒ pages BTW, ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์„ ํƒํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์‹ ํ˜ธ ํ• ํ…๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ( basePath ๊ฝค ์ž˜). ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์„ ๋ง‰์€ ์œ ์ผํ•œ ๊ฒƒ์€ ์ž์‚ฐ _next ๋Œ€ํ•œ ๋‚ด๋ถ€ nextjs ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋” ์ ์€ ์žฅ๊ธฐ์ ์ธ ๋ถ€์ž‘์šฉ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋” ์ข์€ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž์‚ฐ๋ณ„๋กœ assetPath๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ (์˜ˆ : next.config ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ) ๋” ๋‚˜์•„๊ฐ€ ์•ฑ๊ฐ„์— ์ž์‚ฐ์„ ๊ณต์œ ํ•˜์—ฌ ์„ฑ๋Šฅ ๋“ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ณต๊ฐœ PR์ด ์žˆ์Šต๋‹ˆ๋‹ค. ;) / cc @timneutkens ๋Š” ๊ทธ ๊ฐ•์•„์ง€์—๊ฒŒ ๋Œ์•„๊ฐˆ ์‹œ๊ฐ„ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)

์กฐ๋งŒ๊ฐ„์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” readme์— ์ถ”๊ฐ€ ๋œ ์ต์Šคํ”„๋ ˆ์Šค ๊ธฐ๋ฐ˜ server.js ์˜ˆ์ œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์—์„œ ๋– ๋Œ์•„ ๋‹ค๋‹ˆ๋Š” ๋ช‡ ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ.

์•ˆ๋…•ํ•˜์„ธ์š” @ccarse ์ €๋Š” ์ด๋ฏธ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—… ํฌํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/panter/next.js/pull/2
๋˜ํ•œ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ PR์„ ์—ด๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํˆฌ์ž ํ•  ์ค€๋น„๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
@timneutkens @alexindigo ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
basePath ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ assetPath ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ ํšŒ์‚ฌ๋„ ์ด์— ๋ฐ˜๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ์•ฑ์„ ์„น์…˜๋ณ„๋กœ ์ฒœ์ฒœํžˆ ์ธ๊ณ„ํ•˜๊ณ  Next.js๋กœ ๋Œ€์ฒดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํ™” ๋œ ์˜ˆ :

| URL | ์•ฑ |
| --- | --- |
| example.com | ์œ ์‚ฐ |
| example.com/shop | ๋‹ค์Œ |
| example.com/search | ์œ ์‚ฐ |
| example.com/members | ๋‹ค์Œ |

์ฆ‰, ํŽ˜์ด์ง€, ๊ฒฝ๋กœ, ์ž์‚ฐ ๋“ฑ ๊ฐ Next.js ์•ฑ ๋‚ด์—์„œ ๋ชจ๋“  ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด์šฉํ•˜์ง€ ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ now.json ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋„๋ฉ”์ธ ์•ž์— ๋ฐฐ์น˜ ๋œ ์ž์ฒด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์žˆ๊ณ  ํ•˜์œ„ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„ (hapi)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„ ๋‚ด์—์„œ ์—ฌ๊ธฐ์— ์ƒ์„ฑ ๋œ ๋ชจ๋“  ๊ฒƒ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

now.config.json ์„ค์ •์˜ ์ผ๋ถ€ ์กฐํ•ฉ ๋˜๋Š” ์ด์™€ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋งˆ์ดํฌ๋กœ ํ”„๋ก์‹œ ์˜ ์ผ๋ถ€ ์‚ฌ์šฉ์ด์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ์˜ฌ๋ฐ”๋ฅธ ์กฐํ•ฉ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Now v2์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ์—ฌ๋Ÿฌ ์ •์ ์œผ๋กœ ๋‚ด ๋ณด๋‚ธ Next.js ์•ฑ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

| URL | ์•ฑ |
| -| -|
| example.com | ๋‹ค์Œ |
| example.com/dashboard | ๋‹ค์Œ |

์˜ˆ์ƒ๋Œ€๋กœ ๋ฃจํŠธ ์•ฑ์€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ์—์„œ๋Š” ์ƒํ™ฉ์ด ์ž˜๋ชป๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ next/link ์™€ ํ•จ๊ป˜ assetPrefix ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

export default ({ children, href, ...rest }) => (
      <Link href={process.env.NODE_ENV === "production" ? `/dashboard${href}` : href} {...rest}>
        {children}
      </Link>
);

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ URL์—์„œ .js ํŒŒ์ผ์„ ์ฐพ์œผ๋ ค๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— prefetch ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด์ƒ์ ์ด์ง€ ์•Š์€ prefetch ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋˜ํ•œ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@timneutkens ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด PR์„ ์—ด๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํˆฌ์ž ํ•  ์ค€๋น„๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ”„๋กœ๋•์…˜์—์„œ ์†”๋ฃจ์…˜ (https://github.com/panter/next.js/pull/1)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์„ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ์ƒˆ๋กœ์šด API๋ฅผ ๊ณง ๋„์ž… ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์˜ ์˜ํ–ฅ๋„๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ์—์„œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๊ธฐ๋Šฅ์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ETA๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

API

๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ๋˜์–ด ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? :๋””

์Šค๋ ˆ๋“œ๋ฅผ ์ŠคํŒธํ•˜์ง€ ๋ง๊ณ  ๋ฌธ์ œ ์ž์ฒด์— GitHub์˜ ๐Ÿ‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@timneutkens ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” API๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? "๊ณง"๋ฌด์—‡์„ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์ค‘ ์˜์—ญ๊ณผ ์ •ํ™•ํžˆ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  ํ”„๋ก์‹œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ : @Zertz
์ฐธ๊ณ  : ์—ฌ์ „ํžˆ ๋งํฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋งํฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์ ‘๋‘์‚ฌ๋ฅผ ์•ฑ์— ์ „๋‹ฌํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ ์ ‘๋‘์‚ฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ •์  ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด๊ฒƒ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

const proxy = require('http-proxy-middleware');

app.setAssetPrefix('/dashboard');

  // Express custom server
  // Proxy so it works with prefix and without...
  // So if asset prefix is set then it still works
  const server = express();
  server.use(
    proxy('/dashboard', {
      target: 'http://localhost:3000', 
      changeOrigin: true,
      pathRewrite: {
        [`^/dashboard`]: '',
      },
    }),
  );

์ œ๊ฐ€ ์–ธ๊ธ‰ ํ•œ ์ œ์•ˆ์€ # 7329์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์–ธ๊ธ‰ ํ•œ ์ œ์•ˆ์€ # 7329์ž…๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
์ œ์•ˆ ๋œ ํ›„ํฌ๊ฐ€ ๊ธฐ๋ณธ ๊ฒฝ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ทธ๋ฆฌ๊ณ  Router.push('/about') ์™€ ๊ฐ™์€ ๋ผ์šฐํ„ฐ ๋ฆฌ๋””๋ ‰์…˜์€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์‹œ๊ฐ„ ๋‚ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜

๋งํฌ ํ•  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ผ์šฐํ„ฐ API๋„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ URL ์ž์ฒด์— ๋Œ€ํ•œ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์„ ์–ป์„ ์ˆ˜์žˆ๋Š”์‹œ๊ธฐ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ ๋‚˜ ์ตœ์†Œํ•œ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๋Œ€์‹  ์ดˆ๊ธฐ ๋ฌธ์ œ์— ๐Ÿ‘์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

@ MMT-LD ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜ ์ข…๋ฅ˜๊ฐ€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์ง€๋งŒ ์ด์ œ ๋ชจ๋“  ๋งํฌ ํด๋ฆญ ๋˜๋Š” ๋ผ์šฐํ„ฐ ํ‘ธ์‹œ ์ด๋ฒคํŠธ์—์„œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค โ˜น๏ธ

@Zertz ์˜ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค!
๋˜ํ•œ ์ถœ๋ ฅ ํŒŒ์ผ์„ ํ”„๋ฆฌ ํŽ˜์น˜ ๋œ ๊ฒฝ๋กœ์— ๋ณต์‚ฌํ•˜์—ฌ prefetch ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/fand/MDMT/blob/master/scripts/copy-preload.js

... ๊ทธ๊ฒƒ์€ ๋”๋Ÿฌ์šด ์†์ž„์ˆ˜์ด์ง€๋งŒ ์–ด์จŒ๋“  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ๐Ÿคช

ํ—‰ํ—‰

์ด์ œ ๋ชจ๋“  ๋งํฌ ํด๋ฆญ ๋˜๋Š” ๋ผ์šฐํ„ฐ ํ‘ธ์‹œ ์ด๋ฒคํŠธ์—์„œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. โ˜น๏ธ

์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋งํฌ์˜ 'as'๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ๋งํฌ๋Š” ๋‚ด๋ถ€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌ ํ‚ค์ง€ ๋งŒ 'as'๋Š” ๊ฒฝ๋กœ์— ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค.
์˜ˆ :
<Link href={"/${item.link}"} as={"./${item.link}"}>

ํ—‰ํ—‰

๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์ง€๋งŒ ์ด์ œ ๋ชจ๋“  ๋งํฌ ํด๋ฆญ ๋˜๋Š” ๋ผ์šฐํ„ฐ ํ‘ธ์‹œ ์ด๋ฒคํŠธ์—์„œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค โ˜น๏ธ

์ด๊ฒƒ์ด ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

// WithConfig component
import getConfig from 'next/config';

const { publicRuntimeConfig } = getConfig();

const WithConfig = ({ children }) =>
  children && children({ config: publicRuntimeConfig });

export default WithConfig;
// Extended Link component

 import React from 'react';
import PropTypes from 'prop-types';
import Link from 'next/link';
import { WithConfig } from '../WithConfig';
/* 
    <Link> component has two main props:
    href: the path inside pages directory + query string. e.g. /page/querystring?id=1
    as: the path that will be rendered in the browser URL bar. e.g. /page/querystring/1

*/

const NextLink = ({
  browserHref,
  pagesHref,
  whatever,
}) => {
  return (
    <WithConfig>
      {({ config: { pathPrefix } = {} }) => (
        <Link
          as={pathPrefix ? `${pathPrefix}${browserHref}` : browserHref}
          href={pagesHref}
          passHref
        >
          <a>{whatever}</a> // this bit is up to you - children or whatever
        </Link>
      )}
    </WithConfig>
  );
};

NextLink.propTypes = {
  browserHref: PropTypes.string.isRequired,
  pagesHref: PropTypes.string,
};

NextLink.defaultProps = {
  pagesHref: undefined,
};

export default NextLink;

์šฉ๋ฒ•:

import NextLink from '../NextLink'

<NextLink browserHref={`/page/1`} pagesHref={`/page?querystring=1`} whatever='I'm the link' />

ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค : ์Šค๋งˆ์ผ :

useLink RFC๊ฐ€ ์ด์ œ ๊ฑฐ๋ถ€๋˜๊ณ  (# 7329) basePath ์ง€์›์ด ํฐ ๋„์›€์ด๋˜์—ˆ์œผ๋ฏ€๋กœ Next.js ํ”„๋กœ์ ํŠธ๋Š” PR์ด์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ด๋‚˜์š”? ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@tomaswitek ์˜์ด ๊ตฌํ˜„ ์„ ๋ณด๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ผ์šฐํ„ฐ๊ฐ€ basePath ์ธ์‹ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. basePath ์ง€์›์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ „๋ฐ˜์ ์œผ๋กœ ๋””์ž์ธ์ด ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์„ฑ ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

module.exports = {
  basePath: '/demo'
}

assetPrefix ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์€ https://github.com/zeit/next.js/issues/4998#issuecomment-414978297์— ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


์—…๋ฐ์ดํŠธ : ๋‚˜๋Š” ๋˜ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์–ด๋–ป๊ฒŒ ๋“  ๊ธฐ๋ณธ ๋ผ์šฐํ„ฐ๋ฅผ ๊ต์ฒดํ•˜์—ฌ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค .Next.js๋Š” ๋ผ์šฐํ„ฐ๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐ

์ด ๋ฌธ์ œ๋Š” 2017 ๋…„ ์ดํ›„๋กœ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด basePath ์š”์ฒญ์— ๋Œ€ํ•œ ๊ณต์‹์ ์ธ ์‘๋‹ต์ž…๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ https://github.com/zeit/next.js/issues/4998#issuecomment์— ์ œ์•ˆ ๋œ๋Œ€๋กœ assetPrefix ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • <Link> ๊ตฌ์„ฑ ์š”์†Œ์˜ ์กฐํ•ฉ์œผ๋กœ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ ํ›„ -464345554 ๋˜๋Š” https://github.com/zeit/next.js/issues/4998#issuecomment -521189412, ๋ถˆํ–‰ํžˆ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •์˜ assetPrefix ,์ด ๊ฐ™์€ ๋น„๊ต์  ๊ฐ„๋‹จํ–ˆ๋‹ค next.config.js :

const assetPrefix = process.env.DEPLOYMENT_BUILD ? '/subdir' : '';

module.exports = {
  assetPrefix,
  env: {
    ASSET_PREFIX: assetPrefix,
  },
}

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์‚ฌ์šฉ์ž ์ •์˜ Link ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด https://github.com/zeit/next.js/issues/4998#issuecomment -464345554์—์„œ ์ฃผ์–ด์ง„ ์ฒซ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด href ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ฐ„์ฒด).

export default ({ children, href, ...rest }) => (
  <Link href={`${process.env.ASSET_PREFIX}${href}`} {...rest}>
    {children}
  </Link>
);

์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด๋ณด๊ณ  ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์š”์ฒญ์ด ๊ฐ‘์ž๊ธฐ / subdir /_next/static/.../pages/ subdir /example.js-๋‹ค๋ฅธ "subdir"์ด ์—†์–ด์•ผํ•˜๋ฏ€๋กœ ํ”„๋ฆฌ ํŽ˜์นญ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ Link ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ href๋ฅผ /subdir/example ๋กœ ์„ค์ •ํ•˜๋ฏ€๋กœ Next.js๊ฐ€ pages/subdir/example.js ํŽ˜์ด์ง€ ๋ฒˆ๋“ค์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ํ”„๋ฆฌ ํŽ˜์นญ์€ ์„ธ์ƒ์˜ ์ข…๋ง์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์ง€๋งŒ (UX๋Š” ๋งค์šฐ ์ถ”์•…ํ•˜์ง€๋งŒ) ์šฐ๋ฆฌ ์•ฑ์—์„œ๋Š” Next.js 9์˜ ๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ƒํ™ฉ์ด ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด as ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•ด์•ผ ์‚ฌ์šฉ์ž ์ •์˜ Link ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ง„ํ™”๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

export default ({ children, href, as, ...rest }) => (
  <Link 
    href={`${process.env.ASSET_PREFIX}${href}`}
    as={`${process.env.ASSET_PREFIX}${as}`}
    {...rest}
  >
    {children}
  </Link>
);

์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<CustomLink href='/post/[id]' as='/post/1'>...</CustomLink>

๋‹ค์Œ์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

<Link href='/subdir/post/[id]' as='/subdir/post/1'>...</Link>

Now์— ๋ฐฐํฌ ํ•  ๋•Œ ์ „ํ˜€ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. https://deployment-id.now.sh/subdir/post/1 ๋กœ ์ด๋™ํ•˜๋ฉด 404๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ์™„์ „ํžˆ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ @now/next builder ( ์—…๋ฐ์ดํŠธ : https://github.com/zeit/next.js/pull/8426#issuecomment-522801831) ๋•Œ๋ฌธ์ด์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ /subdir/post/[id] ์š”์ฒญํ•  ๋•Œ Next.js์˜ ๋ผ์šฐํ„ฐ๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒํ•ฉ๋‹ˆ๋‹ค

์ด ์Šค๋ ˆ๋“œ, ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ์žˆ๋‹ค https://github.com/zeit/next.js/issues/4998#issuecomment -521189412์€, ๊ทธ ์ ‘๋‘์‚ฌ๋กœ๋งŒํ•˜์ง€ href๊ฐ€์ด ๊ฐ™์€ (๊ฐ„์ฒด) :

export default ({ children, href, as, ...rest }) => (
  <Link href={href} as={`${process.env.ASSET_PREFIX}${as}`} {...rest}>
    {children}
  </Link>
);

ํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

<Link> ์˜ as ๊ฐ’์ด href ๊ฐ’๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/zeit/next.js/issues/7488 ์—๋ณด๊ณ  ๋œ ๋ฌธ์ œ

๊ฒฐ๊ตญ basePath ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ง€์› ๋  ๋•Œ๊นŒ์ง€ ํ•ด๊ฒฐ์ฑ…์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

@borekb ์ด์ „์— ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋„์›€์„ ์ค„ ์ค€๋น„๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๋ชจ๋“  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ์˜ ์ผ๋ถ€๋งŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” basePath๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ๋•์…˜์—์„œ next.js์˜ ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์„ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ์ƒˆ๋กœ์šด API๋ฅผ ๊ณง ๋„์ž… ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

@tim ์—ฌ์ „ํžˆ https://github.com/zeit/next.js/issues/7329

Btw. ๋‚ด์ผ์€ ์ •ํ™•ํžˆ 1 ๋…„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒ๋Œ€์ ์œผ๋กœ ๊ฑฐ์นœ ์•„์ด๋””์–ด ์ค‘ ํ•˜๋‚˜๋Š” src/pages ์™€ ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๊ฐ–๊ณ  ์ ์ ˆํ•œ ์œ„์น˜์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

  • myapp.example.com ๋ฐฐํฌํ•˜๋ ค๋ฉด src/pages ๋ฅผ pages ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•ฉ๋‹ˆ๋‹ค.
  • example.com/myapp ๋ฐฐํฌํ•˜๋ ค๋ฉด src/pages ๋ฅผ pages/myapp ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ <Link> ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ assetPrefix ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด _ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ _ ์‹œ๋„ ํ• ๋งŒํผ ์šฉ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค ๐Ÿ˜„.

๊ทธ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

basePath ์ง€์›์— ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? :)

ํ—‰ํ—‰

์ด์ œ ๋ชจ๋“  ๋งํฌ ํด๋ฆญ ๋˜๋Š” ๋ผ์šฐํ„ฐ ํ‘ธ์‹œ ์ด๋ฒคํŠธ์—์„œ ํŽ˜์ด์ง€๊ฐ€ frowning_face๋ฅผ ๋‹ค์‹œ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋งํฌ์˜ 'as'๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ๋งํฌ๋Š” ๋‚ด๋ถ€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌ ํ‚ค์ง€ ๋งŒ 'as'๋Š” ๊ฒฝ๋กœ์— ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค.
์˜ˆ :
<Link href={"/${item.link}"} as={"./${item.link}"}>

๋‹น์‹ ์€ ๋‚ด ํ•˜๋ฃจ๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค! :)))

๋‚˜๋Š” Router.push(`/route`, `${process.env.BASE_PATH}route`); ์™€ ๋˜‘๊ฐ™์ดํ•˜๊ณ ์žˆ๋‹ค

ํ—‰ํ—‰

์ด์ œ ๋ชจ๋“  ๋งํฌ ํด๋ฆญ ๋˜๋Š” ๋ผ์šฐํ„ฐ ํ‘ธ์‹œ ์ด๋ฒคํŠธ์—์„œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. โ˜น๏ธ

์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋งํฌ์˜ 'as'๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ๋งํฌ๋Š” ๋‚ด๋ถ€ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌ ํ‚ค์ง€ ๋งŒ 'as'๋Š” ๊ฒฝ๋กœ์— ์ƒ๋Œ€์ ์ž…๋‹ˆ๋‹ค.
์˜ˆ :
<Link href={"/${item.link}"} as={"./${item.link}"}>

์ด ์†”๋ฃจ์…˜์€ ๋‹ค์Œ 9 ๊ฐœ์˜ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. /route/[id] , ${process.env.BASE_PATH}/route${id} ์—์„œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜๊ฒฌ ์€ ๋ฌธ์ œ๋ฅผ ์•„์ฃผ ์ž˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ์‚ฌ๋žŒ์ด ์—ฌ๊ธฐ์˜ ์†”๋ฃจ์…˜์ด ํ”„๋ฆฌ ํŽ˜์น˜๋ฅผ ์ค‘๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ. ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

next9๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด href ์—์„œ assetPrefix๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด next _always_๊ฐ€ ์„œ๋ฒ„ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ์‹œ์—ฐํ•˜๋Š”์ด ๋ฌธ์ œ ์—์„œ ๋ณต์ œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋ณธ์งˆ์ ์œผ๋กœ Apollo Client ์บ์‹œ๋ฅผ ์†์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๊ตฌํ˜„์€ assetPrefix๊ฐ€ ์—†๋Š” ๊ธฐ๋ณธ ํŽ˜์ด์ง€ href ๋ฅผ ๋‹ค์Œ ๊ฒฝ๋กœ href (assetPrefix ํฌํ•จ)์™€ ๋น„๊ตํ•˜์—ฌ ๊นŠ์€ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ : href /prefix/page (๊ธฐ๋ณธ ํŽ˜์ด์ง€๋Š” /page )์ด๊ณ  ๋‹ค์Œ href ๊ฒฝ๋กœ๋Š” /prefix/page/[id] (์ ‘๋‘์–ด๊ฐ€ ์—†์œผ๋ฉด 404๊ฐ€๋ฉ๋‹ˆ๋‹ค) ์ด๊ฒƒ์€ ๋งค์šฐ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์ด๋ฉฐ ์–•์€ ๊ฒฝ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ธ‰ํ–‰ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ์ค‘

์‚ฌ์šฉ์‹œ basePath ์ธ href props๊ฐ€์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ ํ”„๋ฆฌ ํŽ˜์น˜๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
PLZ๋Š” basePath ๋ฐ prefetch๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ •๋ง๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์„œ๋ฒ„ ์†Œ์Šค์—์„œ ์—ฌ๋Ÿฌ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ ๊ณ ์œ  ํ•œ web/appX/{next project files} . basePath๋ฅผ ๋” ๋งŽ์ด ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์ง€๋งŒ ๊ทธ๋‹ค์ง€ ์˜ˆ์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ •์  ๋‚ด๋ณด๋‚ด๊ธฐ๋„ basePath ๐Ÿ˜Š

์„ฑ๊ณตํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ‘

{
  experimental:{
    basePath: '/some/dir',
  }
}

๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋งค์šฐ ๋‚˜์œ ์ œํ•œ์ž…๋‹ˆ๋‹ค.

์—ญ๋ฐฉํ–ฅ ํ”„๋ก์‹œ ๋’ค์— ๋ชจ๋“  ์•ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ๊ฒฝ๋กœ๋ฅผ ์ ‘๋‘์‚ฌ๋กœ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜ ์˜ˆ์—์„œ๋Š” ์ ‘๋‘์‚ฌ /auction-results ).

์ด๋ฏธ assetPrefix ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์•ฑ์ด ์„œ๋ฒ„ ์ธก ์š”์ฒญ์— ๋Œ€ํ•ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ : mydomain.com/auction-results/ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์ต์Šคํ”„๋ ˆ์Šค ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

router.get(`/${appPrefix}/`, (req, res) => {
  nextApp.render(req, res, '/national', req.params);
});

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ next/link ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก ํƒ์ƒ‰์„ ์‹œ๋„ ํ•  ๋•Œ, ์˜ˆ :

์—ฌ๊ธฐ์„œ /auction-results ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ ‘๋‘์‚ฌ์ด๊ณ  /national ๋Š” ~pages/national ์˜ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

<Link href="/national" as="/auction-results/">
  <a>Goto National Page</a>
</Link>

์•„๋ฌด ์ผ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ณ ์ŠคํŠธ ํด๋ฆญ)

์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ ๊ณ ์นจ ๋งํฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด๊ฑธ ๋„์šธ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ... ์ž‘๋…„ ์—์ด ๋ฌด๋ ต์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 1 ๋…„ ํ›„, ์ €๋Š” ์ƒˆ๋กœ์šด ์•ฑ์„ ๊ฐœ๋ฐœ ์ค‘์ด๋ฉฐ ์ž‘๋…„์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Basepath๋Š” ๋ฐ”๋‹๋ผ ๊ธฐ๋Šฅ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ... ์ž‘๋…„ ์—์ด ๋ฌด๋ ต์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. 1 ๋…„ ํ›„, ์ €๋Š” ์ƒˆ๋กœ์šด ์•ฑ์„ ๊ฐœ๋ฐœ ์ค‘์ด๋ฉฐ ์ž‘๋…„์—ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Basepath๋Š” ๋ฐ”๋‹๋ผ ๊ธฐ๋Šฅ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜์—ฌ ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Next.js๋Š” ์ €ํฌ ํŒ€ (5 ๋ช…)์ด ํ’€ ํƒ€์ž„์œผ๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋™์‹œ์— ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋…„์— ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (์‹ ๊ทœ ๋ฐ ๊ธฐ์กด)์„ ํ›จ์”ฌ ๋” ์ž‘๊ณ , ๋น ๋ฅด๊ณ , ๋” ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์— ๋Œ€ํ•ด "์ฐฌ์„ฑ"์„ ํ‘œ๋ช…ํ•˜๋ ค๋ฉด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์Šค๋ ˆ๋“œ์—์„œ ๐Ÿ‘ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

basePath ์ด ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ์ด์–ด์•ผํ•œ๋‹ค๋Š” ์ ์— ํ™•์‹คํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋กœ๋“œ๋งต์— ์žˆ์œผ๋ฉฐ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์‹œ ์ฝ์–ด ๋ณด๋ฉด ๋ณผ ์ˆ˜์žˆ๋Š” ์ดˆ๊ธฐ PR๋„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

PR : https://github.com/zeit/next.js/pull/9872

์ด ๊ธฐ๋Šฅ์„ ์‹คํ˜„ํ•˜๋Š” ๋ฐ ์žฌ์ •์ ์œผ๋กœ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด [email protected]์œผ๋กœ ๋ฌธ์˜ํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ์ •๋ง๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค : /

@Sletheren basePath ์ง€์›์€ ํ˜„์žฌ ์‹คํ—˜์ ์ด๋ฉฐ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

cf. https://github.com/zeit/next.js/pull/9872

@Sletheren basePath ์ง€์›์€ ํ˜„์žฌ ์‹คํ—˜์ ์ด๋ฉฐ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

cf. # 9872

@martpie ๋‚˜๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ. ์ œ ๊ฒฝ์šฐ basePath ๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ basePath๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ "URL"์„ ํ†ตํ•ด ์•ฑ์„ ์ œ๊ณตํ•˜๊ณ  ๋นŒ๋“œ ์‹œ๊ฐ„ ๋™์•ˆ basePath ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒฝ๋กœ ๋ฐฐ์—ด์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด)

@timneutkens ์—…๋ฐ์ดํŠธ

  1. ์ด๊ฒƒ์ด ๊ธฐ์—… ์ „์šฉ์ž…๋‹ˆ๊นŒ (๊ธฐ์—… ์˜์—…ํŒ€์— ๋ฌธ์˜ํ•˜๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„์˜ ์ž๊ทน์„ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค)?

  2. PR์— ๋”ฐ๋ฅด๋ฉด ๋กœ๋“œ๋งต์—์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋‹ค์‹œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž„์˜์˜ ๊ฐ€๊ฒฉ์— ๋Œ€ํ•ด ๋ช‡ ์ฃผ ๋™์•ˆ ์ž„์˜์˜ ํŒ๋งค์›๊ณผ ํ˜‘์ƒ ํ•œ ํ›„ ๋ช‡ ์ฃผ ๋™์•ˆ ๋ฌด๋„ˆ์ง„ ์˜คํ”ˆ ์†Œ์Šค ๋ฒ„์ „๊ณผ ์™„์ „ํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ๋ฒ„์ „๊ณผ ๊ฐ™์ด ๋‹ค์Œ ๋‹ฌ์— ๋†€๋ผ์›€์—†์ด์ด ๊ธฐ๋Šฅ์„ ์ง€๊ธˆ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ดํ•ด ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

FWIW, ๋‚˜๋Š” ์ด์ œ ์ž‘๋™ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์šด์ „ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ next.config.js ๋„ฃ์œผ์‹ญ์‹œ์˜ค.

module.exports = {
  experimental: {
    basePath: '/custom',
  },
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ  ์›น ์„œ๋ฒ„ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ง€์ • ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์š”์ฒญ์„ ์žก์Šต๋‹ˆ๋‹ค. app.use('/custom', (req, res...) => { ... ๊ทธ๋Ÿฐ ๋‹ค์Œ (์ค‘์š”) Next๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์Šคํ…œ์˜ URL์— ํ”„๋ก์‹œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์˜ ๋‚ด๋ถ€ ์ฃผ์†Œ ์™€ http-proxy ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉ) http-proxy => ์˜ˆ. ... target: 'http://next:3000/custom ), ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๊ฒฝ๋กœ๊ฐ€์—†๋Š” ํ˜ธ์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ http-proxy-middleware ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„์š”.์ด ๊ธฐ๋Šฅ์— EE ๋ผ์ด์„ ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํŒ€์ด์ด ๊ธฐ๋Šฅ์„ ์„ฑ์ˆ™์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋„์›€์ด ํ•„์š”ํ•˜๋ฉด pls๊ฐ€ ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

ํŽธ์ง‘ : Next์˜ ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ๋„ ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@timneutkens ์—…๋ฐ์ดํŠธ

  1. ์ด๊ฒƒ์ด ๊ธฐ์—… ์ „์šฉ์ž…๋‹ˆ๊นŒ (๊ธฐ์—… ์˜์—…ํŒ€์— ๋ฌธ์˜ํ•˜๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„์˜ ์ž๊ทน์„ ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹ค)?
  2. PR์— ๋”ฐ๋ฅด๋ฉด ๋กœ๋“œ๋งต์—์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ๋‹ค์‹œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž„์˜์˜ ๊ฐ€๊ฒฉ์— ๋Œ€ํ•ด ๋ช‡ ์ฃผ ๋™์•ˆ ์ž„์˜์˜ ํŒ๋งค์›๊ณผ ํ˜‘์ƒ ํ•œ ํ›„ ๋ช‡ ์ฃผ ๋™์•ˆ ๋ฌด๋„ˆ์ง„ ์˜คํ”ˆ ์†Œ์Šค ๋ฒ„์ „๊ณผ ์™„์ „ํ•œ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ๋ฒ„์ „๊ณผ ๊ฐ™์ด ๋‹ค์Œ ๋‹ฌ์— ๋†€๋ผ์›€์—†์ด์ด ๊ธฐ๋Šฅ์„ ์ง€๊ธˆ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

์ดํ•ด ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@ pe-s ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด ๊ฒŒ์‹œ๋ฌผ์„ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” "enterprise Next.js ๋ฒ„์ „"์ด ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋” ์งง์€ ์‹œ๊ฐ„์— ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ํšŒ์‚ฌ๊ฐ€ ์ปจ์„คํŒ… ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ธฐ ์œ„ํ•ด ์†์„ ๋ป—์€ ์ˆ˜๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜์—ญ ์ง€์›์€ Trulia์™€ ํ˜‘๋ ฅํ•˜์—ฌ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์•„์ง ์ž‘์—… ์ค‘์ด๋ฉฐ ๋กœ๋“œ๋งต์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ค‘์ธ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์˜คํ”ˆ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. Next.js์˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋ฒ„์ „์ด ์—†๋‹ค๊ณ  ๋งํ–ˆ๋“ฏ์ด. ๋‚ด๊ฐ€ ์—ฐ๋ฝ ์–ธ๊ธ‰ ๋”ฐ๋ผ์„œ ์™œํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋กœ๋“œ๋งต์— ๋†’์€ ์ถฉ๊ฒฉ ์ž‘์—…์˜ ์—ฌ๋Ÿฌ ์šฐ์„  ์ˆœ์œ„๋ฅผ [email protected]์„ ๋‹น์‹ ์ด Next.js.์— ๋Œ€ํ•œ ๊ธฐ์—…์˜ ์ง€์›์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ / ๊ฐ€๋Šฅํ•œ์ด ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœํ•˜๋Š” ๊ฒฝ์šฐ

@timneutkens tx๋Š” ๋น ๋ฅธ ์‘๋‹ต๊ณผ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ฌ์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)
์•ž์œผ๋กœ๋„ ํž˜์จ์ฃผ์„ธ์š”!

Basepath ์ง€์›์€ ํ˜„์žฌ next@canary ์—์„œ ์ œ๊ณต๋˜๋ฉฐ ๋” ์ด์ƒ ์‹คํ—˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ๋งŒ๊ฐ„ ์•ˆ์ •์ ์ธ ์ฑ„๋„์—์„œ ๋ฐฉ์†ก ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๊ฝค ๋Šฆ์—ˆ์ง€๋งŒ ์ด๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹  ์‹ค์ œ HTML <base> ์‚ฌ์šฉ์„ ๊ณ ๋ ค ํ–ˆ์Šต๋‹ˆ๊นŒ?

Basepath ์ง€์›์€ ํ˜„์žฌ next@canary ์—์„œ ์ œ๊ณต๋˜๋ฉฐ ๋” ์ด์ƒ ์‹คํ—˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ๋งŒ๊ฐ„ ์•ˆ์ •์ ์ธ ์ฑ„๋„์—์„œ ๋ฐฉ์†ก ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

@timneutkens ,์ด ์ถ”๊ฐ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋น„ ์‹คํ—˜์  basePath ์ง€์›์ด ์–ธ์ œ ๊ณต์‹์ ์œผ๋กœ ์ถœ์‹œ๋˜๋Š”์ง€ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

๋˜ํ•œ basePath๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ž์‚ฐ (๊ณต์šฉ ํด๋”์— ์žˆ์Œ)์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ ์ ˆํ•œ URL์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์—์„œ ์ฐธ์กฐ ํ•  ๋•Œ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ src์— ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ๊ฒฝ๋กœ์—์„œ ๊ณ„์† ์ฐธ์กฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด basePath์˜ ์˜ˆ์ƒ ์‚ฌ์šฉ์ž…๋‹ˆ๊นŒ? ๋˜ํ•œ assetPrefix๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ๋‚ด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ :

  1. next v9.4.5-canary.24
  2. next.config.js์—์„œ basePath ๋ฅผ /alerts ๋กœ ์„ค์ • :
const basePath = '/alerts';
module.exports = {
  basePath: basePath,
  env: {
    BASE_PATH: basePath,
  },
};
  1. public/images/example.png ์—์žˆ๋Š” ์ž์‚ฐ
  2. ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ž์‚ฐ ์‚ฌ์šฉ ์˜ˆ :
const ExampleImage = () => (
  <img src={`${process.env.BASE_PATH}/images/example.png`} />
);

๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์ž์‚ฐ URL์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์‹  ์นด๋‚˜๋ฆฌ์•„๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
npm install [email protected]

next.config.js

const isProd = process.env.NODE_ENV === 'production';

module.exports = {
  basePath: isProd ? '/example' : ''
}

๋ชจ๋“  ํŽ˜์ด์ง€ ๋ฐ ๋งํฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
http : // localhost : 3000 / example / posts / pre-rendering
http : // localhost : 3000 / example / posts / ssg-ssr
http : // localhost : 3000 / example / posts / pre-rendering

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€, ํŒŒ๋น„์ฝ˜ ๋“ฑ์€ ๋งคํ•‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
http : // localhost : 3000 / favicon.ico 404
http : // localhost : 3000 / images / profile.jpg 404

๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ assetPrefix๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚ด์žฅ ๋œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base

@kmturley ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹น์‹ ์˜ ๋์—์„œ
@timneutkens ,์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ

์ด๋ฏธ์ง€ ์ ‘๋‘์‚ฌ๋ฅผ ์ˆ˜๋™์œผ๋กœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ basePath๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const {basePath} = useRouter()

https://nextjs.org/docs/api-reference/next.config.js/cdn-support-with-asset-prefix

Next.js๋Š”๋กœ๋“œํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž๋™์œผ๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ณต์šฉ ํด๋”์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด์ œ / public์—์žˆ๋Š” ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ : <img/> <link/> ...
์ด๊ฒƒ์ด ๊ฐ๊ฐ์— ๋Œ€ํ•œ basePath๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๊นŒ?

์•„๋ž˜์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ํ˜ผ๋™์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

<WithinBasePath>
  {/* automatically fixes the path with basePath */}
  <img src="/logo.png" />
</WithinBasePath>

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์˜๋ฏธ ํ•œ ๋ฐ”์ž…๋‹ˆ๋‹ค.

// src/components/WithinBasePath/index.tsx

import React from "react"
import path from "path"
import { useRouter } from "next/router"
interface Props {}

const WithinBasePath: React.FC<Props> = (props) => {
  const { basePath } = useRouter()
  const children = [props.children].flatMap((c) => c) as React.ReactElement[]
  return (
    <>
      {children.map((child, key) => {
        let newChild = null

        switch (child.type) {
          case "img":
            newChild = React.createElement(child.type, {
              ...child.props,
              src: path.join(basePath, child.props.src),
              key,
            })
            break
          case "link":
            newChild = React.createElement(child.type, {
              ...child.props,
              href: path.join(basePath, child.props.href),
              key,
            })
            break
          default:
            newChild = React.createElement(child.type, {
              ...child.props,
              key,
            })
        }
        return newChild
      })}
    </>
  )
}
export default WithinBasePath

// pages/test.tsx

import React from "react"
import WithinBasePath from "@src/components/WithinBasePath"
interface Props {}

const test: React.FC<Props> = (props) => {
  return (
    <WithinBasePath>
      <img src="/123.jpg" />
      <link href="/abc.jpg" />
      <div>other element</div>
    </WithinBasePath>
  )
}
export default test

ํ›„ํฌ ์ธ const {basePath} = useRouter() ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ž‘์—…ํ•˜๊ณ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ :

์ž˜๋ชป๋œ ํ›„ํฌ ํ˜ธ์ถœ ๊ฒฝ๊ณ 

https://reactjs.org/warnings/invalid-hook-call-warning.html

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { withRouter, Router } from 'next/router'

class Example extends Component<{router: Router}, {router: Router}> {
  constructor(props) {
    super(props)
    this.state = {
      router: props.router
    }
  }
  render() {
    return (
      <Layout home>
        <Head><title>Example title</title></Head>
        <img src={`${this.state.router.basePath}/images/creators.jpg`} />
      </Layout>
    )
  }
}
export default withRouter(Example)

markdown๊ณผ ํ•จ๊ป˜ basePath๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฌธ์ž์—ด์—์„œ ์ฐพ๊ธฐ ๋ฐ ๋ฐ”๊พธ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

const content = this.state.doc.content.replace('/docs', `${this.state.router.basePath}/docs`);
return (
<Layout>
  <Container docs={this.state.allDocs}>
    <h1>{this.state.doc.title}</h1>
    <div
      className={markdownStyles['markdown']}
      dangerouslySetInnerHTML={{ __html: content }}
    />
  </Container>
</Layout>
)

์ด๋ฏธ์ง€ ์ ‘๋‘์‚ฌ๋ฅผ ์ˆ˜๋™์œผ๋กœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ basePath๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const {basePath} = useRouter()

์ด ์†”๋ฃจ์…˜์€ css ๋˜๋Š” scss ํŒŒ์ผ๋กœ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. css ๋˜๋Š” scss ํŒŒ์ผ ๋‚ด์—์„œ ์ž์‚ฐ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ img ํƒœ๊ทธ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ ๋˜๋Š” ์Šคํƒ€์ผ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ€์ผ์ด ์—ฌ๋Ÿฌ ์œ„์น˜์— ๊ตฌํ˜„๋˜๋„๋ก ๋ถ„ํ• ๋˜๋ฏ€๋กœ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@peetjvv ๋‹ค์Œ์€ CSS์—์„œ ์ ‘๋‘์‚ฌ basePaths๊ฐ€์žˆ๋Š” ์ž์‚ฐ์„ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ ์ฐจ์„ ์ฑ…์ž…๋‹ˆ๋‹ค. ๋งŒ๋“ค๊ธฐ, ์ˆ˜์ž… ๋ฐ ์ถ”๊ฐ€ <CSSVariables> ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ _app.tsx ๊ธ€๋กœ๋ฒŒ ์ธ๋ผ์ธ ์ฃผ์ž…ํ•˜๋Š” <style> ๋‹น์‹ ์ด ๋‹ค์Œ ์Šคํƒ€์ผ ์‹œํŠธ์— ๊ฑธ์ณ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” CSS ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ์š”์†Œ.

์˜ˆ๋ฅผ ๋“ค์–ด <body> ๋ณ€์ˆ˜๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

<style>
:root {
      --asset-url: url("${basePath}/img/asset.png");
}
</style>

basePath๋ฅผ ์–ป์œผ๋ ค๋ฉด withRouter ์‚ฌ์šฉํ•˜๋Š” @kmturley ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ชจ์–‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { withRouter, Router } from "next/router";
import { Component } from "react";

export interface IProps {
  router: Router;
}

class CSSVariables extends Component<IProps> {
  render() {
    const basePath = this.props.router.basePath;
    const prefixedPath = (path) => `${basePath}${path}`;
    const cssString = (value) => `\"${value}\"`;
    const cssURL = (value) => `url(${value})`;
    const cssVariable = (key, value) => `--${key}: ${value};`;
    const cssVariables = (variables) => Object.entries(variables)
      .map((entry) => cssVariable(entry[0], entry[1]))
      .join("\n");
    const cssRootVariables = (variables) => `:root {
      ${cssVariables(variables)}
    }`;

    const variables = {
      "asset-url": cssURL(
        cssString(prefixedPath("/img/asset.png"))
      ),
    };

    return (
      <style
        dangerouslySetInnerHTML={{
          __html: cssRootVariables(variables),
        }}
      />
    );
  }
}

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