๋ค์ค ์์ญ ์ ๋์ผํ ๋๋ฉ์ธ์์ ์ฌ๋ฌ next.js ์ฑ์ ์คํํ ์์๋ ํ๋ฅญํ ๊ธฐ๋ฅ์ด์ง๋ง next.js์ ๋ชจ๋ ๋ถ๋ถ์์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค. ์ง๊ธ์ ์ฑ ๋ค์ ์คํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ค์ํ ์ฑ์ ํ์ด์ง์ ๋์ผํ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
next.config.js ํ์ผ์์ basepath
๋ฅผ ๊ตฌ์ฑํ๊ณ ์ถ์ต๋๋ค. ์ด ๊ตฌ์ฑ ๋๋ถ์ next.js์ ๋ชจ๋ ๋ถ๋ถ (๋ผ์ฐํฐ, ๋งํฌ, ์ ์ ์์ฐ ๋ฑ)์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ธ์ํ๊ณ ์ฌ๋ฐ๋ฅธ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ผ์น์ํต๋๋ค.
ํ ๊ฐ์ง ๋์์ ์ํ๋ ๋ชจ๋ ํ์ด์ง๋ฅผ ๊ธฐ๋ณธ ๊ฒฝ๋ก์ ์ผ์นํ๋ ํด๋์ ์ค์ฒฉํ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ผ์ฐํ
๊ณผ ๊ด๋ จ๋ ํ ๊ฐ์ง ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋๋ถ๋ถ์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๊ฐ ํ ์์ค ๊ฒฝ๋ก๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ถํฉ๋๋ค.
๋ ๋ฒ์งธ ๋์์ ์์ฒญ์ด next.js ์ฑ์ ๋์ฐฉํ๊ธฐ ์ ์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๊ฐ ์๋์ผ๋ก ์ ๊ฑฐ๋๋ ๋ฐฉ์์ผ๋ก ํ๋ก์๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ชจ๋ ๋งํฌ์ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ๋ ์ฌ์ฉ์ ์ง์ ๋งํฌ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌํํ๋ ๊ฒ์
๋๋ค. next.js์ ์ปค์คํ
ํฌํฌ๋ฅผ ์ ์งํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ ์๊ฐ์๋ ๋ง์ด๋์ง ์์ต๋๋ค.
assetPrefix
์๋ฃจ์
์ ์ฌ์ฉํ๋ฉด ๊ฐ ์ฑ์ ๋ํด ์๋ก ๋ค๋ฅธ ์ ๋์ฌ๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์๋ ํ ๊ณต์ ํ ๊ฒ์ ๋ค๋ฅธ ํธ์คํธ์์๋ง ์๋ํฉ๋๋ค.
module.exports = {
assetPrefix: NOW_URL ? `https://${alias}` : 'http://localhost:4000'
}
๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์คํจํฉ๋๋ค.
module.exports = {
assetPrefix: NOW_URL ? `https://${alias}/account` : 'http://localhost:4000/account'
}
์ ์๊ฐ์๋ ๋ ๊ฐ์ง ๋ณ์๋ก ๋๋์ด์ผํฉ๋๋ค.
module.exports = {
assetPrefix: NOW_URL ? `https://${alias}` : 'http://localhost:4000',
basepath: '/account'
}
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
๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฃผ์ ์์ด๋์ด๋ ๋จ์ผ ์น ์ฌ์ดํธ ๊ฒฝํ์ ์ผ๋ถ๋ก ์ฌ์ ํ์ํ๋ ์ฌ์ฉ์๋ฅผ์ํ ํฌ๋ช
์ฑ์
๋๋ค. ๊ทธ๋์ ์ฌ๋ค ์ฌ์ด์ ๋งํฌ๊ฐ ์์ด์ผํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฐฐํฌ ๋ฌธ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฐฐํฌ ๋ฌธ์ ๋ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฌธ์ โ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๋์ ๋ฐฐํฌ ํ ์ ์๋์ง ์์ง ๋ชปํ๋ฉฐ ๋ค์ด์ค๋ http ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ๋ง ์๊ณ ์์ต๋๋ค. ์๋ต ํ ์์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ์ต๋๋ค.
์ด๋๊ฐ์ ๋ฐฐํฌ๋๋ฉด ๋ค๋ฅธ ๋๋ฉ์ธ, ๋ค๋ฅธ ํฌํธ๊ฐ ๋ ์ ์์ผ๋ฉฐ ์ด๋ก ์ ์ผ๋ก๋ ๋ค๋ฅธ basePath๊ฐ ๋ ์ ์์ผ๋ฉฐ ํ๋ก์ ๋๋ ๊ธฐํ ์๋จ์ ํตํด ์ฑ์ ๋ํด ํฌ๋ช
ํ๊ฒ ๋ง๋ค์ด์ง๋๋ค.
์ฌ ์ฌ์ด์ ๊ต์ฐจ ๋งํฌ โ ์ฌ์ ์ ์ ์ ๋ณ๋์ ๋ฐฐ์น ๊ฐ๋ฅํ ์ํฐํฐ๋ก ์ ์งํ๊ธฐ ์ํด ๋ค๋ฅธ ์ฌ ์ฌ์ด์ ๋ด๋ถ ๊ตฌํ ์ง์์ด ๋์ถ๋์ด์๋ ์๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ฌ์ด ์๋ก์ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ์ฌ์ด ์ฌ์ฉํ ์์๋ ๊ฒฝ๋ก๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์
๋๋ค (_ ๊ทธ๋ฆฌ๊ณ nextjs ์ธ๊ณ์์๋ ์ฌ์ฉ์ ์ ์ <IslandALink>
์ข
๋ฅ์ ๊ตฌ์ฑ ์์๊ฐ ์ ํธ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๋ฐฉ๋ฒ_).
์ง๊ธ๊น์ง๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค. ๋ชจ๋ ์ฌ์ ๋์ผํ ๋๋ฉ์ธ์ ๊ณต์ ํ๊ณ ์ ๋ ๊ฒฝ๋ก ์งํฉ ( /path1
, path2
๋ฑ)์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ๋ ๋ฒ์งธ ์ฌ์ ๊ฒฝ๋ก ๋ชฉ๋ก์ ๊ฐ์ ธ ์์ ์์ ์ ์ผ๋ก ์ ์งํฉ๋๋ค. ๋์์ ๊ฐ ์ฌ์ด ๊ฒฝ๋ก๋ฅผ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋๋ก ์ ์งํ๋ ๊ฒ์ ๋งค์ฐ ์ต์ํ์ ์๊ตฌ ์ฌํญ์
๋๋ค (์ด์จ๋ ์น์์๋ ์ข์ ๊ฒ์
๋๋ค) :)
๋ฐฐํฌ ํน์ basePath๋ฅผ ์ถ๊ฐํ๋ฉด ์ ์ฒด ์์คํ ์ ๋ณต์ก์ฑ์ด ์๋์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ๊ฐ ์์ผ๋๋๊ฐ ์์ฒด ๋ฐฐํฌ basePath๋ฅผ ์๊ณ ์์ด์ผํฉ๋๊น (๊ทธ๋ฆฌ๊ณ ์ง์ ํ ์๋ ์์)? ๊ทธ๋ ๋ค๋ฉด ํ์ฌ ์๋ํ๋ ๋ฐฉ์๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์? ์๋๋ฉด ์์ผ๋๋ A๊ฐ ๋ฐฐํฌ ๊ฒฝ๋ก์ ๋ํด ๋ฌด๊ดํด์ผํฉ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ฌ A๊ฐ ์์ ์ ๋ํด ์๋ ๊ฒ๋ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฌ B๊ฐ ๋ฐฐ์น ๋ ์ฌ A๋ฅผ ์ด๋ป๊ฒ ์ฐพ์ ์ ์์๊น์? ์๋๋ฉด ๋ฐฐ์น ๋ ๋ชจ๋ ์ฌ์ ๋ํ basePath๋ฅผ ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ ์ ๊ณตํด์ผํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ๋ฌผ๊ฑด์ ๋ฐฐํฌํ๋ ํ๋์ ์ธ ๋ฐฉ๋ฒ์ ์๋ก์ด ์ฌ์ ์ถ๊ฐํด์ผ ํ ๋ ๋ชจ๋ ์ฌ์ ์ฌ๋ฐฐ์นํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋๋ฉด ๊ทธ ๋ถ๋ถ์ ์ด๋ป๊ฒ ์์ ํ์ต๋๊น?
๊ฐ์ฌํฉ๋๋ค.
^ ๋ชจ๋ ์ปคํผ ์ ์ ์ผ์ผ๋ ์ข ๋ ์ผ๊ด๋ ์ค๋ช ์ด ํ์ํ๋ฉด ์๋ ค์ฃผ์ธ์. :)
๋จผ์ ์๊ฐ์๋ด์ด ์ ๋ฌธ์ ๋ฅผ ๊ฒํ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@timneutkens ์ assetPrefix
๋ basePath
๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ฒ์์ ๋
ผ์ํ ๋ด์ฉ์
๋๋ค. ๋ช ๊ฐ์ ํ์ผ์ ๋ณ๊ฒฝํด์ผํ๋์ง ํ์ธํ ํ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ๊นจ๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ํ์ง๋ง ์ฒซ ๋ฒ์งธ ์๋ฃจ์
์ผ๋ก ๋กค๋ฐฑํ๊ฒ ์ต๋๋ค. ์ ํ ๋ฌธ์ ์์ด ์์ ํ ๋ถ๋ฆฌํ์ฌ ๋ณด๊ดํฉ์๋ค. ๋๋ ๋จ์ง ํฐ ์๋ฆฌ๋ก ์๊ฐํ๊ณ ์์๋ค.
์์ธํ ๋ต๋ณ์ @alexindigo Thx์ ๋๋ค. ๋น์ ์ ์ง๋ฌธ์ ๋ตํด ๋ณด๊ฒ ์ต๋๋ค ๐
ํ์ฌ assetPrefix์์ ์ ํํ ๋ฌด์์ด ์๋ํ์ง ์์๋์ง ํ์คํ์ง ์์
์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
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๊ฐ๋ฉ๋๋ค. ์ด์ ๋ฅผ ์์ ํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ง๋ ( ์
๋ฐ์ดํธ : https://github.com/zeit/next.js/pull/8426#issuecomment-522801831) ๋๋ฌธ์ด์ง๋ง ๊ถ๊ทน์ ์ผ๋ก @now/next
builder/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 ์ง์์ ํ์ฌ ์คํ์ ์ด๋ฉฐ ์ํ์ ๊ฐ์ํ๊ณ ์ฌ์ฉํ์ญ์์ค.
@Sletheren basePath ์ง์์ ํ์ฌ ์คํ์ ์ด๋ฉฐ ์ํ์ ๊ฐ์ํ๊ณ ์ฌ์ฉํ์ญ์์ค.
cf. # 9872
@martpie ๋๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ๋ณด์์ง๋ง. ์ ๊ฒฝ์ฐ basePath
๋ ํ๋๊ฐ ์๋๋ผ ์ฌ๋ฌ basePath๊ฐ ๋ ์ ์์ต๋๋ค. ๋ค๋ฅธ "URL"์ ํตํด ์ฑ์ ์ ๊ณตํ๊ณ ๋น๋ ์๊ฐ ๋์ basePath
์ค์ ํ๋ ๊ฒ์ ์ต์
์ด ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋จ์ผ ๋ฌธ์์ด์ด ์๋ ๊ฒฝ๋ก ๋ฐฐ์ด์ ์ง์ํ๊ธฐ ์ํด)
@timneutkens ์ ๋ฐ์ดํธ
์ด๊ฒ์ด ๊ธฐ์ ์ ์ฉ์ ๋๊น (๊ธฐ์ ์์ ํ์ ๋ฌธ์ํ๋ ๊ฒ์ด ์ฝ๊ฐ์ ์๊ทน์ ์ผ์ผ์ผฐ์ต๋๋ค)?
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 ์ ๋ฐ์ดํธ
- ์ด๊ฒ์ด ๊ธฐ์ ์ ์ฉ์ ๋๊น (๊ธฐ์ ์์ ํ์ ๋ฌธ์ํ๋ ๊ฒ์ด ์ฝ๊ฐ์ ์๊ทน์ ์ผ์ผ์ผฐ์ต๋๋ค)?
- 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๋ฅผ ์ฌ์ฉํด ๋ณด์์ง๋ง ๋ด ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค.
์ :
next v9.4.5-canary.24
basePath
๋ฅผ /alerts
๋ก ์ค์ :const basePath = '/alerts';
module.exports = {
basePath: basePath,
env: {
BASE_PATH: basePath,
},
};
public/images/example.png
์์๋ ์์ฐ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);
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๊ฒ์ํ์ฌ ๋ฌด์์ ๊ธฐ๋ํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Next.js๋ ์ ํฌ ํ (5 ๋ช )์ด ํ ํ์์ผ๋ก ์์ ํ๊ณ ์์ผ๋ฉฐ ๋์์ ๋ง์ ๊ธฐ๋ฅ์ ์์ ํ๊ณ ์์ต๋๋ค. ์๋ ์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ํ์ต๋๋ค.
Next.js ์ ํ๋ฆฌ์ผ์ด์ (์ ๊ท ๋ฐ ๊ธฐ์กด)์ ํจ์ฌ ๋ ์๊ณ , ๋น ๋ฅด๊ณ , ๋ ํ์ฅ ํ ์ ์๋๋ก ํจ๊ณผ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
๊ธฐ๋ฅ์ ๋ํด "์ฐฌ์ฑ"์ ํ๋ช ํ๋ ค๋ฉด ํ ์ ์์ต๋๋ค. ์ด๊ธฐ ์ค๋ ๋์์ ๐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ญ์์ค.
basePath
์ด ๊ธฐ๋ณธ ์ ๊ณต ๊ธฐ๋ฅ์ด์ด์ผํ๋ค๋ ์ ์ ํ์คํ ๋์ํฉ๋๋ค. ์ด๋ฏธ ๋ก๋๋งต์ ์์ผ๋ฉฐ ์ค๋ ๋์์ ๋ค์ ์ฝ์ด ๋ณด๋ฉด ๋ณผ ์์๋ ์ด๊ธฐ PR๋ ์์ฑํ์ต๋๋ค.PR : https://github.com/zeit/next.js/pull/9872
์ด ๊ธฐ๋ฅ์ ์คํํ๋ ๋ฐ ์ฌ์ ์ ์ผ๋ก ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด [email protected]์ผ๋ก ๋ฌธ์ํ์ญ์์ค.