ํํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ Next.js ํ๋ก์ ํธ ํด๋ ์ธ๋ถ์์๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. Invalid hook call
์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ฉ๋๋ค. ํํฌ๊ฐ์๋ ๊ตฌ์ฑ ์์๋ ์์๋๋ก ์๋ํฉ๋๋ค.
๊ธฐ๋ณธ ํด๋ ์ธ๋ถ์ ํ์ผ์ด ํธ๋์ค ํ์ผ๋๋๋ก webpack ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ ๋ ๋ชจ๋ ๋ฒ์ >9.0.5
์์ ๋ฒ๊ทธ๊ฐ ๋ํ๋ฉ๋๋ค. <=9.0.5
์์ ์ ์๋ํฉ๋๋ค.
https://github.com/baldurh/next-9.0.6-bug-repro ์์ ์ฌํ์ ํ์ธ
ํ๋ก์ ํธ ํด๋ ์ธ๋ถ์ ํ์ผ์ ์ฌ์ฉํ ๋ ์ฝ๋๊ฐ ๊นจ์ง์ง ์์์ผํฉ๋๋ค.
>=9.0.6
๋๋ ์ด๊ฒ์ด ์๋ง๋ Next.js์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ด ์๋๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ monorepo๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ๋ฌ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๋ ๊ตฌ์ฑ ์์๊ฐ์๋ ๊ณต์ ํด๋๊ฐ ์์ต๋๋ค. ์ด ์์ ์ ๋ค์ ์ํํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋๊ตฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์์๋ ๋์ฒด ๊ตฌ์ฑ์ ์ฐพ์ผ๋ฉด ์ ๋ ๊ธฐ๊บผ์ด ํ ๊ฒ์ ๋๋ค ๐
@baldurh ์ด๊ฒ์ ๋งค์ฐ ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค. Now์ ๊ฐ์ ํ๋ซํผ์ ์ฌ์ฉํ ๋๋ Next.js ์ฑ์ด์๋ ํด๋ ๋ง ๋ฐฐํฌ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ์ธ๋ถ ๋ชจ๋์ ๋ํด ๋จผ์ ์์์ผํ๋ฏ๋ก ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ ๊ฐ์ง ๋ ๋์ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@lfades ๋ต์ฅ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ฌํ ์ต์ ์ค ์ด๋ ๊ฒ๋ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ Now ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋ฐฐํฌํ์ง ์์ต๋๋ค. ์ฒ์์๋ ์ค ์์ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง๋ง bazel์ ํตํฉํ๋๋ฐ ์ค ์์ ๊ณต๊ฐ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ ํน์ฑ๊ณผ โโ์ ์ด์ธ๋ฆฌ์ง ์์ต๋๋ค. Npm ํจํค์ง๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋๋งํผ ๋นจ๋ฆฌ ๊ณต์ ๋ชจ๋์ ๊ฐ๋ฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ค๋ฒ ํค๋๊ฐ ๋๋ฌด ๋ง์ต๋๋ค.
@baldurh ์ค์ฒฉ ๋ NextJs ์ฑ์ ์๋ก ๋ค์ ๊ธฐ ๋๋ฌธ์
@isaachinman ์ฐ๋ฆฌ๋ ์์ต๋๋ค. ์์ง ๋ค๋ฅธ ์ด์ ๋ก 9.x๋ก ์ ๊ทธ๋ ์ด๋ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํ์ง ์์์ต๋๋ค. ๋๊ตฌ๋ ์ง ์ด๊ฒ์ ์ํฅ์ ๋ฏธ์น๋ ์ฝ๋๊ฐ ์ด๋์ ์๋์ง ์๊ณ ์์ต๋๊น? ๋ฌธ์ ๋ฅผ ๋ ์ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
์์ง์ด ๋ฌธ์ ๋ฅผ ํํค์น ์๊ฐ์ด ์์์ง๋ง ๋๊ตฐ๊ฐ ์ฌํ์ด ํ์ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณต์ ํด์ผํฉ๋๋ค. cd
๋ฅผ examples/simple
์ ๋ณต์ ํ๊ณ NextJs ๋ฒ์ ์> = 9.0.6์ผ๋ก ์
๊ทธ๋ ์ด๋ํฉ๋๋ค.
ํ์ฌ 9.0.3์ ์์ผ๋ฏ๋ก ๊ธฐ์ ์ ์ผ๋ก ํจ์น์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค.
์ต๊ทผ์ ๋น์ทํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ 9.0.5 (๋ฐ React 16.8.x)๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํด์ผํ์ต๋๋ค. ๋๋ Next์ MDX ์ฌ์ฉ์ ๋ํด ๋ด๊ฐ ๋ณธ ๋ฌธ์ ๋ฅผ ์ขํ์ง๋ง ๊ทธ ์ด์์ ๊ตฌ์ฒด์ ์ธ ์ธ๋ถ ์ฌํญ์ ์์ต๋๋ค.
Next & next-i18next๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฝค ํฐ ํ๋ก์ ํธ๋ก ๊ฐ์ ๋ฌธ์ ๋ฅผ ํํค ์ณค์ต๋๋ค.
์ด ์ค๋ฅ๋ ์ธ ๊ฐ์ง ์ด์ ๋ก ๋ฐ์ํ ์ ์์์ ์์์ต๋๋ค.
์ด์ํ ์ ์ ํ๋ก๋์ ๋น๋ ์์๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
@timneutkens @Timer ์ ํ๊ทธ๋ฅผ ๋ฌ์ ์ฃผ์ ์ ์ฃ์ก ํฉ๋๋ค๋ง ์ฌ๋ฌ๋ถ์ ์๊ฒฌ์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น? ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋ช ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ตฌํํด์ผํฉ๋๊น? ์ด๊ฒ์ ํ์ฌ ์ฐ๋ฆฌ์๊ฒ ๋งค์ฐ ํฐ ์ฐจ๋จ์ ์ ๋๋ค. ๊ฐ์ฌ.
๋ณ์นญ์ด react
์ด์ง๋ง react-dom
์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ํด ๋ณผ ์ ์์ต๋๊น?
@ ํ์ด๋จธ ๊ฐ์ฌํฉ๋๋ค. ์๋ํ์ง๋ง ํจ๊ณผ๊ฐ ์์์ต๋๋ค
react
๋ฐ react-dom
์ข
์์ฑ์ ํ ์์ค ์๋ก ์ด๋ํ์ฌ ์ฌํ ์์ ๋ฐฉ๊ธ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค. ๋๊ตฐ๊ฐ ์๋ํด๋ณด๊ณ ์ถ๋ค๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ด ๋ฃ์์ต๋๋ค. ๋๋ ์ค์ ํ๋ก์ ํธ์์ ๊ทธ๊ฒ์ ์๋ํ์ง ์์์ง๋ง ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ํจ๊ณผ๊ฐ ์๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ @isaachinman , @jaredcwhite ๋ฐ @felixmosh ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๊น?
@Timer ์ฐ๋ฆฌ ํ๋ก์ ํธ์์์ด ์์
์ ์ํํ์ง๋ง react
๋ฅผ ํ๋ก์ ํธ์ node_modules
ํด๋์ ์ค์นํ๋ ๋ค๋ฅธ ์ข
์์ฑ์ด ์๋์ง ํ์ธํด์ผํ์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์คํ ๋ฆฌ ๋ถ๊ณผ ๊ด๋ จ์ด์์์ต๋๋ค ( yarn why react
๋ ๋ง์ ๋์์ด๋์์ต๋๋ค ๐). ์ด์จ๋ ์คํ ๋ฆฌ ๋ถ์ ๋ณ๋์ ํ๋ก์ ํธ๋ก ์ฎ๊ธธ ๊ณํ ์ด์๊ธฐ ๋๋ฌธ์์ด ์๋ฃจ์
์ด ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์ ํจ๊ณผ๊ฐ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์. ๋ถ์ ์ ํ๊ฒ ๊ฒ์ ๋ node_module
ํจํค์ง๋ก ์ธํด์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค (ํผ์ด ์ข
์์ฑ ๋์ react(-dom|)
๋ํ ์ข
์์ฑ ํฌํจ).
react
๋ฐreact-dom
์ข ์์ฑ์ ํ ์์ค ์๋ก ์ด๋ํ์ฌ ์ฌํ ์์ ๋ฐฉ๊ธ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค. ๋๊ตฐ๊ฐ ์๋ํด๋ณด๊ณ ์ถ๋ค๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ด ๋ฃ์์ต๋๋ค. ๋๋ ์ค์ ํ๋ก์ ํธ์์ ๊ทธ๊ฒ์ ์๋ํ์ง ์์์ง๋ง ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์๊ฒ ํจ๊ณผ๊ฐ ์๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ @isaachinman , @jaredcwhite ๋ฐ @felixmosh ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๊น?
์ด ์ ์ฅ์์์ ์ํ ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
npm ls react
๋๋ npm ls react-dom
๋ชฉ๋ก์ ๋ค์ ์ฑ๋ง ์์ต๋๋ค.
@felixmosh ์ฃ์กํฉ๋๋ค. ์ด์ ํธ์๊ฐ ์คํจํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค ๐
react
๋ฐ react-dom
์ (๋ฅผ) app
ํด๋์์ ๋ฃจํธ ํด๋๋ก ์ด๋ ํ์ผ๋ฏ๋ก ์ด์ ๋ ๋ค์์ yarn/npm install
์์
์ ์ํํด์ผํฉ๋๋ค. app
ํด๋์ ๋ฃจํธ ํด๋๋ฅผ ํ์ธํ ํ app
๋ฅผ ์คํํฉ๋๋ค. ์ด๊ฒ์ด ์ถฉ๋ถํ ๋ช
ํํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ๋ก๋์ ์์์ด ์์ ์ ์ํํ๋ ค๋ฉด ๋น๋ ์์คํ ์ ์ฝ๊ฐ ๋ณ๊ฒฝํด์ผํ๋ฏ๋ก์ด ์๋ฃจ์ ์ ์ฌ์ ํ โโ์ฐ๋ฆฌ์๊ฒ ์ฝ๊ฐ์ ๋ฒ๊ฑฐ ๋ก์์ ๋๋ค .๐
์ค๋ช ๊ณ ๋ง์ต๋๋ค. ๋ค์ ํ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค. ๋ด ๋ชจ๋ ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฃจํธ์ ๋ฐ์ deps๋ฅผ ๋๋ ๊ฒ์ด ์ฝ๊ฐ ์ด์ํ๊ฒ ๋ค๋ฆฝ๋๋ค.
@felixmosh ๊ทธ๋, ๋๋ ๋น์ ์๊ฒ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฌ ์์ ๊ณต๊ฐ๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ฉด ๋๊ตฌ๊ฐ ์ ํํ ์ํํ๋ ์์ ์ ๋๋ค. ๋ ๊ฐ ์ด์์ ํ๋ก์ ํธ์ ๋์ผํ ์ข ์์ฑ์ด์๋ ๊ฒฝ์ฐ ์ข ์์ฑ์ ๋ฃจํธ์ ๊ฒ์ํฉ๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ์์ ๋์ผํ ๋ฒ์ ์ ์ข ์์ฑ์ ๊ฐ๋๋ก ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ฐ ๋๊ตฌ๊ฐ ์๋ค๋ฉด ์ง์ ๊ด๋ฆฌํด์ผํ๋๋ฐ ์ด๋ ์ฐธ์ผ๋ก ๋ค์ ์ด์ํฉ๋๋ค. ์ต์ ์ ํด๊ฒฐ์ฑ ์ Next.js ํ์ด ์ฐ๋ฆฌ ๋ชจ๋๋ฅผ ์ํด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค ๐๐๐ป
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ react
๋ฐ react-dom
ํ ์์ค ์๋ก ๊ฐ์ ธ์ ๋ฃจํธ์์ ์๋ฒ๋ฅผ ์คํํ๋ ๊ฒ์ด ํ์ฌ 9.1.5์์ ์๋ํ๋ ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์
๋๋ค. ์ด ๋ฌธ์ ์ด์ ์ ํด๋น ๋งํฌ๋ฅผ ์ฐพ์์ผ๋ฏ๋ก ์ฐธ์กฐ๋ฅผ ์ํด https://github.com/facebook/react/issues/13991 ๋ฐ https://github.com/facebook/react/issues/15315#issuecomment -479802153์ ์ฐ๊ฒฐํฉ๋๋ค.
์๋ ํ์ธ์์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ monorepo๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ์ด ์ ํํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋์ญ์์ค.
v9.0.5๋ rootFolder ์ธ๋ถ์์ ๊ฐ์ ธ์จ ๊ตฌ์ฑ ์์์ ๋ํ ํํฌ์ ์ ์๋ํฉ๋๋ค.
9.0.6๋ถํฐ 9.1.6-canary.5๊น์ง ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์๋ฒ ์ธก์์๋ง ๋ฐ์ํฉ๋๋ค. SSR์ด ๋นํ์ฑํ ๋ ๊ฒฝ์ฐ (์ : dynamic์ ํตํด ์ธ๋ถ ๊ตฌ์ฑ ์์๋ก๋) ๋ชจ๋ ๋ฒ์ ์ด> = 9.0.6 ์ธ ๊ฒฝ์ฐ ์์๋๋ก ์๋ํฉ๋๋ค.
@nodkz ๋ฐ์ ํจํค์ง ํด๊ฒฐ ๋ฌธ์ ์ด๋ฏ๋ก ๋ ธ๋์์๋ง ๋ฐ์ํฉ๋๋ค.
@Timer ์ด ๋ฌธ์ ๋ ์ฝ 6 ๊ฐ ๋ฒ์ ์ "๋ค์"์ด์ ํ๋ก ์ด๋ํ์ฌ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
๋๋ ํ๋ฃจ ์ข ์ผ ์๋ฐ ์์ค์ ์๊ฐ์ ๋ญ๋นํ์ผ๋ฉฐ ๊ทธ ์์ธ์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ํ์ต๋๋ค (์๋ํ์ง ์์).
๋ฐฉํฅ์ ์กฐ์ฌํ๋ ๋ฐ ๋์์ด ํ์ํ์ญ๋๊น?
๊ทธ๊ฒ์ ๋ํด ์ง๊ฐ์ด ์์ต๋๊น?
ํ๋ก๋์
๋น๋์์๋ง ๋ฐ์ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ด์ ๊ด๋ จ์ด์์ ์์๋ 9.0.5
์์ 9.0.6
๋ก ๋ณ๊ฒฝ๋ ์ฌํญ์ ๋ฌด์์
๋๊น?
๊ณ ๋ง์ต๋๋ค ๐๐ผ
๋ฌธ์ ๋ฅผ ์ฐพ์ ๊ฒ ๊ฐ์์ !!!
๋๋ ๊ทธ๊ฒ์ด ๋ ๊ฐ์ง์ ์กฐํฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
i18next
/ react-i18next
์ (๋) ์๋ฒ ๋ฒ๋ค์ ์ธ๋ถ๊ฐ ์๋๋๋ค !!useTranslation
hook ...๊ทธ๋์ ๋๋ ์ ์๋ฒ ๋ฒ๋ค ์์ ๋ ธ๋ ๋ชจ๋์ด ์๋์ง์ ๋ํ ์ด์ ๋ฅผ ์กฐ์ฌํ์ต๋๋ค (์๋ฒ ๋ฒ๋ค์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก๋ ๊ทธ๊ฒ๋ค์ ์ธ๋ถ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค).
๋๋ (์?), ์ฌ๋ฏธ์๋ ๋ถ๋ถ์ด๋ค ๊ทธ ๋ค์ ๋ค์ lib ๋๋ ํ ๋ฆฌ์ ๋ํ ๋ช ๊ฐ์ง ์์ธ๊ฐ ๋ณธ ์ด ์ ๊ท์์ ๋ชจ๋ libs์ ์ก๋๋ค ๊ทธ๊ฒ ๋ next/dist/
๋ก, i18next
& react-i18next
์์ต๋๋ค !!
๋ฐ๋ผ์ ์ด๊ฒ์ ๋ณ๊ฒฝํ๋ฉด :
res.match(/next[/\\]dist[/\\]/)
์ผ๋ก
res.match(/[/\\]next[/\\]dist[/\\]/)
์๋ฒ ๋ฒ๋ค์ next
์ด์ธ์ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ next/dist
๋๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค!
์ ์๊ฒ ์ฃผ์ ๋ฌธ์ ๋ ์์ฒญ์ด ํด๊ฒฐ๋๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋๋ค : https://github.com/zeit/next.js/blob/canary/packages/next/build/webpack-config.ts#L446
ํ๋ก์ ํธ ๋ฃจํธ ์ธ๋ถ์ ๊ตฌ์ฑ ์์๊ฐ ์์ผ๋ฏ๋ก ์์ฒญ ํด๊ฒฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ react
๊ฐ ์๋ฒ ์ฒญํฌ์ ๋ฒ๋ค๋ก ์ ๊ณต๋ฉ๋๋ค. ๊ทธ๋์ ์๋ฒ์์ Invalid hook call
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ๊ฒฐ ํ ์์ @baldurh context
๋ webpack์์ ์ ๊ณตํ๋ฉฐ ์ปดํ์ผ ๋ฃจํธ (ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ)์ ๋ค๋ฆ
๋๋ค.
ํญ์ ์๊ตฌ ์ฌํญ์ ๋ฐํํ๋ ํ์ผ์ ๋๋ ํ ๋ฆฌ์
๋๋ค.
๊ถ๋ฆฌ. ์ง๊ธ์ ์ฐ๋ฆฌ๋ฅผ ์ํด ์๋ํ๋๋ก ํจ์นํ์ต๋๋ค. ๊ฒฐ๊ตญ ์์ ๋๋ ํฐ๋ฆฌ ์์ค์์ ์ข
์์ฑ์ด ๊ณต์ ๋๋๋ก ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ react
๊ฐ ์ธ๋ถ ํด๋ (๋ฃจํธ ์ธ๋ถ)์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ผ๋ ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ๊ฒฐ๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋๋ฐ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌํ๊ฒ๋ https://github.com/facebook/react/issues/13991 ์ ์์ ์ฌํญ์ ์๋ํ์ง ์์ต๋๋ค ๐
yarn link
์ฌ๋ณผ๋ฆญ ๋งํฌ ๋ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ v9.0.6-canary.4
๊น์ง ์ ์๋ํ๊ณ ์ง๊ธ์ ๋ค๋ฅธ ๋๊ธ ์์ฑ์์ ๊ฐ์ ์์น์ ์์ผ๋ฉฐ์ด ์ดํ๋ก ์
๊ทธ๋ ์ด๋ ํ ์ ์์ต๋๋ค ..์ด PR์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ํํ๊ฒ ์ง์ ํ์ต๋๋ค. https://github.com/zeit /next.js/pull/8739
๋ด ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ react
, react-dom
๋ฐ styled-components
ํฉ๋๋ค. ์ด์ ๋ํ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ต์ ์ ๋ณด
์ด ๋ชจ๋์ ์๋ฒ ์ธ๋ถ์ ํฌํจ์์ผ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์์์ต๋๋ค. ์ด ๋๊ธ์ @HosseinAgha ๋๋ถ์ https://github.com/martpie/next-transpile-modules/issues/50#issuecomment -558318688
if (isServer) {
config.externals = [
'react',
'react-dom',
'styled-components',
...config.externals
]
}
๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์์ผ๋ฉฐ ์ง๊ธ๊น์ง ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ๋ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
๋ด ํจํค์ง๋ ๊ฒ์ํ๊ณ ์ค์นํ๋ฉด ์๋ํฉ๋๋ค (๊ทธ๋ฆฌ๊ณ next.config.js์์ resolve.alias ์ฌ์ฉ).
๊ทธ๋ฌ๋ yarn link @mypackage
๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ํจํค์ง๋ก ๊ฐ๋ฐ ๋น๋๋ฅผ ์คํํ๋ฉด ํญ์ ์๋ชป๋ ํํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ํ node_modules/dist/build/wepack-config.js
๋ฅผ ์์ ํ๊ณ https://github.com/zeit/next.js/pull/8739์ ์ถ๊ฐ ๋ ์ค์ ์ฃผ์์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์๋์ํฌ ์์์์ต๋๋ค.
baseRes ๋ฐ res๋ฅผ ๊ธฐ๋กํ๋ฉด ๋ด๊ฐ ๋ณด๋ ๊ฒ์ if ์กฐ๊ฑด์ด ๋ค์๊ณผ ๊ฐ์ด ํธ๋ฆฌ๊ฑฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ต์ ์ ๋ณด:
์ฐ๋ฆฌ๋ ํจํค์ง๋ฅผ yarn ์์
๊ณต๊ฐ์ ์ฌ์ฉํ๋๋ก ๋ณํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค (๋ ํฌ์ ๋จ์ผ ํจํค์ง ๋ง ํฌํจ๋์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ).
์ฝ๋๋ฅผ ./src์์ ./package/our-package-name/src๋ก ์ด๋ํ๊ณ yarn ์์
๊ณต๊ฐ์ ์ค์ ํ์ต๋๋ค => https://classic.yarnpkg.com/en/docs/workspaces/
์ด๊ฒ์ ์ต์์ ./node_modules ํด๋์ ๋ํ ๊ณตํต ์ข ์์ฑ์ ๋์ด ์ฌ๋ฆฌ๊ณ ./package/our-package-name/node_modules๊ฐ ๊ฑฐ์ ๋น์ด์๋ ์ํ๋ก ์ ์ง๋๋ฏ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ํจํค์ง๋ฅผ ์ฐ๊ฒฐํ๋ฉด ๋ค์ ๋ฒ์ ์ด ๋ ์ด์ ๋ฐ์์ ๋ ๋ฒ์งธ ๋ฒ์ ์ ๊ฐ์ ธ ์ค์ง ์๊ณ (ํจํค์ง node_modules ํด๋์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์) ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ์์ด. ยฌยฌ '
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ๊ฐ๋ น์ ์๋ฐฐ๋๋ฏ๋ก ์์ค์ ์ ์ต๋๋ค.
์ฃ์กํฉ๋๋ค.์ด ๋ฒ๊ทธ๋ก ํ๊ฐ๋ฌ์ต๋๋ค. ์ฌ์ค ์ ๋ Next.JS๋ฅผ ๋๋ฌด ๋ง์ด ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋์ด ๋ฌธ์ ๋ ์ง๋ฃจํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ๋ถ ๋ก์ปฌ ํจํค์ง ๋ฐ next-transpile-modules
์์
ํ ๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ต์ ๋ฒ์ ์ Next.js๋ฅผ ๊ณ ์ํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๊ทผ๋ณธ ์์ธ์ ์ฐพ์ผ๋ฉด Next.js์ ํจ์น๋ฅผ ์ ์ถํ๋ ค๊ณ ํฉ๋๋ค.
[email protected] ์ ์ค์น ํ ํ์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ด ์ข
์์ฑ์ [email protected] , [email protected] , [email protected] ๋ฐ ๋ฌผ๋ก ๋ค๋ฅธ ๋ง์ libs์
๋๋ค (๊ทธ๋ฌ๋ next-i18next๋ฅผ ์ค์นํ๊ธฐ ์ ์ ๋ชจ๋ ๊ฒ์ด ์๋ํ์ต๋๋ค). ๋๊ตฐ๊ฐ๊ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋๋จ ํ ์ ์์ต๋๋ค : +1 :
์ด ๋ฌธ์ ๋ฅผ ๊ฒ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ํ ๋์์ธ ์์คํ (๋ฐ์ ๊ตฌ์ฑ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ํจํค์ง๋ฅผ ์ฌ๋ณผ๋ฆญ ๋งํฌํ๋ ๋ฐ ๋ฌธ์ ๊ฐ์์์ต๋๋ค. ๋ํ https://github.com/martpie/next-transpile-modules๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ค ํ์ผํ๊ณ
์ฌ๊ธฐ์ ์ ์ ๋ ์์ ์ฌํญ์ด ์ฐ๋ฆฌ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
node_modules
ํด๋์ ์ฌ๋ณผ๋ฆญ ๋งํฌํฉ๋๋ค ( npm link
๋์ ์์ฒด ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํด์ผ ํจ).next.config.js
๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ์ถ๊ฐํฉ๋๋ค.// next.config.js
const nextConfig = {
webpack: (config, options) => {
// modify the `config` here
if (options.isServer) {
config.externals = ["react", ...config.externals];
}
config.resolve.alias["react"] = path.resolve(__dirname, ".\\node_modules\\react");
return config;
},
};
// more plugins etc...
๊ตฌ์ฑ์ด ํ์ํ์ง ์์ ๋์ฒด ํด๊ฒฐ ๋ฐฉ๋ฒ
node_modules
๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฒ์ Symlinkํ์ญ์์ค. ๋๋ ์ด๊ฒ์ ์ํด ๋ด ์์ ์ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ง๋ค์๊ณ ์๋ง๋ github์ ๊ฒ์ ํ ์ ์์ต๋๋ค.๊ทธ๋ฌ๋ ์ด๊ฒ์ด NextJS์์ ์์ ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ๋๋ ์ ๋ด NextJS๊ฐ ์๋ ๋ชจ๋ ํ๋ก์ ํธ์์ webpack ๋ณ์นญ์ด ์๋ํ๋์ง ์ดํดํ๊ธฐ ์ํด ๋ง์ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
์ถ์ . ์ด๊ฒ์ด ํ๋ก๋์ ๋น๋์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ฐ๋ฐ ์ค์ ๋ง ์ฌ์ฉํฉ๋๋ค.
if (options.isServer) {
config.externals = ["react", ...config.externals];
}
react
์ (๋) ์ด๋ฏธ ์ธ๋ถ ์๋ฒ ์ธก์
๋๋ค.
config.resolve.alias["react"] = path.resolve(__dirname, ".\\node_modules\\react");
์ด๊ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
์์ ๋งํ๋ฏ์ด์ด ๋ฌธ์ ๋ react
์ ์์กดํ๋ ์ข
์์ฑ๊ณผ ๊ด๋ จ์ด ์์ง๋ง peerDependency
์ react
๊ฐ ์์ด์ผํฉ๋๋ค (ํ์ํ ๊ฒฝ์ฐ react-dom).
๋ฟก ๋นต๋จ
์, ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค. ๋๋ ํ์คํ ๋ฐ์๊ณผ ๋ฐ์์ ํผ์ด ์์กด์ฑ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ nextjs ํ๋ก์ ํธ์ ์ฌ๋ณผ๋ฆญ ๋งํฌํ๋ฉด ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ node_modules
ํด๋๊ฐ ์๊น๋๋ค (์ ์ด๋ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์์ npm i
๋๋ npm link
๋ฅผ ์คํ ํ ๊ฒฝ์ฐ).
react๊ฐ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์์ ํด๊ฒฐ๋๋ฉด node_modules
ํด๋์์๋ ๊ฒ์ผ๋ก ํด๊ฒฐ๋๊ณ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ react์ ์ด์ค ์ฌ๋ณธ์ด ์์ฑ๋ฉ๋๋ค. ๋ด lib ๋ด์์ node_modules
ํด๋๋ฅผ ์ญ์ ํ๊ฑฐ๋ npm link
์ด์ธ์ ๊ฒ์ ์ฌ์ฉํ์ฌ ์ค์นํ๋ฉด yes ofc๊ฐ ์๋ํฉ๋๋ค (ํผ์ด ์ข
์์ฑ ๋๋ ์ ํํ ๋์ผํ ๋ฐ์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ).
๋ฐ๋ผ์ ๊ฐ๋ฐ ์ค์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ณ์นญ ๋ฐ์์ ํตํด ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ๋ฒ์ ์ ์ฌ์ฉํ๋๋กํด์ผํฉ๋๋ค. ์ฌ๊ธฐ์ ์ธ๊ธ ๋ ๋ฌธ์ ๋ก ์ธํด config.externals ...
๋ถ๋ถ (์ ์ด๋ ์ ์๊ฒ๋)์ ์ถ๊ฐํ์ง ์๊ณ ๋ ํ์ฌ NextJS ๋ฒ์ ์์ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์๋ง๋ ์ฌ๊ธฐ์ ์ธ๊ธ ๋ ์ผ๋ถ ๋ณ๊ฒฝ ์ฌํญ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ธ๊ธ ํ ๊ฒ์ฒ๋ผ # 8739?
๋จ์ง ์ถ๊ฐ ์ ์ฌํ ๋ฌธ์ ๋ ๋์๊ฒ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์์ง๋ง (์ ์ฌ์ ์ผ๋ก) ๋๋ฌธ์ (# 10162์ ์ค๋ช
๋๋๋ก) ์ฌ๋ฃ-UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ง๊ธ์ ๋ด ์์ ์์ ํ๋ค npm run clean
๋ด preserve
์ dev
์คํฌ๋ฆฝํธ :
https://github.com/zeit/next.js/issues/10162#issuecomment -612501431
@timneutkens ์ด๋ฌํ ์ข ์์ฑ์ด ์์ ์ deps (deps ๋ peer-dep)๋ฅผ ๋์ดํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จํ์ฌ ์ค์ ๋ฌธ์ ๊ฐ ์์์ ์ดํดํ์ง๋ง์ด๋ฅผ ๋ ์๊ตฌ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ์์ฒด ์ฑ์์ ๋ฌด์์ ํ ์ ์๋์ง ์ ์ ์์ต๋๊น?
@ ryan-0 ํน๋ณํ ์ค์ ์ด ์์ต๋๊น? ์ฌ๋ฃ Ui๊ฐ ํผ์ด dep๋ก ๋ฐ์ํ์ง ์์ผ๋ฉด ๋๋ ๊ฒ์ ๋๊น? ์์ฃผ ์ค๋๋ ๋ฐ์ ๋ฒ์ ์ด๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ฌ์ฉํฉ๋๊น?
ํน๋ณํ ์ค์ ์ด ์์ต๋๋ค .. ์ฌ๋ณผ๋ฆญ ๋งํฌ ๋ฐ ๋ฐ์ ์์ 16.13.1
-> ๋ฌธ์ ๋ฅผ ๊ณต์ ํ๊ฒ ๋ง๋ค ์์๋ ๋ค๋ฅธ deps๊ฐ ์์ง๋ง ์ ์ด๋ ๊ทธ ์ฌํ์ ๋ฐ๋ฅด๋ฉด material-ui / core์ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค. (์ฐ๋ฆฌ๋ ์ฌ์ฉ) :
https://github.com/zeit/next.js/issues/10162
@ ryan-0 material-ui ํด๋ ์์ ๋ฐ์์ด์๋ node_modules ํด๋๊ฐ ์์ต๋๊น?
๋ํ npm ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์คํ ํ ํ ์๋์ด ์์๋ฉ๋๊น?
์๋์ ์ค์ฒฉ ๋ ๋
ธ๋ ํด๋๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๋ ๋ฐฉ์์ ๋ํด ํผ๋ ์ค๋ฝ์ต๋๋ค. npm dedupe
์๋ํ์ง ์์์ต๋๋ค. :(
์ด์ํ๊ฒ๋ resolve.alias
์ ํ๋ก์ ํธ ๋ฃจํธ ์ธ๋ถ์ ํจํค์ง์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด next.config.js
ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const path = require('path')
module.exports = {
webpack: config => {
const { alias } = config.resolve || {}
alias.react$ = path.resolve('node_modules/react')
alias['react-dom$'] = path.resolve('node_modules/react-dom')
config.resolve = {
...config.resolve,
alias,
}
return config
}
}
Lerna monorepo์์๋ ๋ก์ปฌ ํจํค์ง์ yarn link
์ฌ์ฉํ๊ณ ์์ต๋๋ค. node_modules
์๋ react
๋ณต์ฌ๋ณธ์ด ํฌํจ๋์ด ์์ง ์์ง๋ง monorepo ๋ฃจํธ ์๋ ํฌํจ๋์ด ์์ต๋๋ค. resolve.alias
๋ฅผ ์ฌ์ฉํ๋ ํ ์ฐจ์ด๊ฐ์์ ๊ฒ์ผ๋ก ์์ํ์ง ์์ง๋ง, ๋ถํํ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. monorepo ๋ฃจํธ์์ react
๋ณต์ฌ๋ณธ์ ์ ๊ฑฐํ ํ ๋์ Cannot find module 'react'
์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๊ตฐ๊ฐ ์ด๊ฒ์ ๋ํ ์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
๋ด '์๋น์'ํ๋ก์ ํธ์ ์ถ๊ฐํ๊ธฐ ์ํด next-transpile-modules
์ ์ฌ์ฉํ๋ ๋งํฌ ๋ ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ฌธ์์ ์ธ๊ธ ๋๋๋ก react
๋ณ์นญ์ next.config.json
ํ์ง๋ง ์ถฉ๋ถํ์ง ์์์ต๋๋ค. React์ ๋ํ ์ค๋ณต ์ข
์์ฑ ์ค๋ฅ๊ฐ ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค.
@mweststrate์ relative-deps
๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ ์ด๊ฒ์ ๋ํ ์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
๋ด '์๋น์'ํ๋ก์ ํธ์ ์ถ๊ฐํ๊ธฐ ์ํด
next-transpile-modules
์ ์ฌ์ฉํ๋ ๋งํฌ ๋ ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ฌธ์์ ์ธ๊ธ ๋๋๋กreact
๋ณ์นญ์next.config.json
ํ์ง๋ง ์ถฉ๋ถํ์ง ์์์ต๋๋ค. React์ ๋ํ ์ค๋ณต ์ข ์์ฑ ์ค๋ฅ๊ฐ ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค.
์, ์์ ๊ฒ์๋ฌผ์ ์ฐธ์กฐํ์ญ์์ค. ์ํ์ config.externals ๋ถ๋ถ์ ์ถ๊ฐํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ณ์นญ์ด ๋ค์ ์๋ํ๊ธฐ ์์ํฉ๋๋ค.
@johot ๊ทํ์ ์๋ฃจ์
์ ์๋ํ์ง๋ง ์ ์๊ฒ ํจ๊ณผ์ ์ด์ง ์์์ต๋๋ค. ์ด์ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ง๋ง ์ฃผ๋ก ์๋ฃจ์
์ ์๋ํ ํ cannot destructure property 'query' of 'Object(...)(...)' as it is null
์
๋๋ค. ์ด ๊ฒฝ์ฐ ๋๋ก์ ๋ณธ ๋ชฉ์ ์ ์ธ useRouter
์์ next/router
.
@aleclarson ํ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ค์ ์ค์ ์์ ์๋ํ์ง ์์ผ๋ฉด ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
next-transpile-modules
๋ฐ Yarn์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์๋ฃจ์
์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. https://github.com/martpie/next-transpile-modules#i -have-trouble-with-duplicated-dependencies-or-the -์๋ชป๋ ํํฌ ํตํ ์ค๋ฅ ๋ฐ์
npm
์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ ํ ํด๊ฒฐ์ฑ
์ ์ฐพ๊ณ ์์ต๋๋ค .c
์ข์, ๊ทธ๋์ ์ต์ข
ํด๊ฒฐ์ฑ
์ yarn link
์์ yalc
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ด ์์ต๋๋ค. ํ์ผ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ํ๊ณ ํ์ผ์ dist
ํด๋์ ๋ณต์ฌ ํ ๋ค์ ๋ณ๊ฒฝ ์ฌํญ์ yalc ์ ์ฅ์์ ํธ์ํ๋ gulp ์์
์ด ์์ต๋๋ค.
๋ด '์๋น์'์์ tsconfig.json
๋ฅผ ์์ ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
"paths": {
"~/*": ["/src/*"],
"my-library/*": ["./node_modules/my-library/dist/*"]
},
๊ทธ๋ฆฌ๊ณ next.config.js
์ ๋ค์์ ์ถ๊ฐํ์ต๋๋ค.
experimental: {
jsconfigPaths: true, // enables it for both jsconfig.json and tsconfig.json
}
๋ฐ๋ผ์ ๋ค์์ tsconfig.json paths
๊ธฐ๋ฐ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ๋ง์ ์ ๋ณด๊ฐ
๊ฐ๋จํ ๋งํด์ yalc
+ next-transpile-modules
ํ๋ฉด ๋ก์ปฌ ๊ฐ๋ฐ ์ค์ ์ด ๋ง์ด ํฅ์๋์์ต๋๋ค. ์ค๋ณต ์ข
์์ฑ ๋ฐ ์ด์ํ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ง์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ถ๊ฐ์ ๋์ yarn add
ํ๊ณ ์ ๋ชจ๋์ ์ฐ๊ฒฐ yalc
๊ฑฐ์ ๋์ผํฉ๋๋ค.
styled-components
์ ์์กดํ๋ ๋ก์ปฌ๋ก ์ฐ๊ฒฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ฐธ์กฐํ์ญ์์ค. https://styled-components.com/docs/faqs#linking -in-an-ssr-scenario
server/index.js
:
const moduleAlias = require('module-alias');
moduleAlias.addAlias('styled-components', path.join(__dirname, '../node_modules/styled-components'));
๊ทธ๋ฌ๋ next.config.js
๋ค์์ ์ถ๊ฐํด์ผํฉ๋๋ค.
config.resolve.alias['react'] = path.resolve(__dirname, './node_modules', 'react');
config.resolve.alias['react-dom'] = path.resolve(__dirname, './node_modules', 'react-dom');
config.resolve.alias['prop-types'] = path.resolve(__dirname, './node_modules', 'prop-types');
config.resolve.alias['styled-components'] = path.resolve(__dirname, './node_modules', 'styled-components');
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ ์คํธ ๋์ :
๋ค์ : 9.3.5
๋ฐ์ : 16.13.1
์คํ์ผ ๊ตฌ์ฑ ์์ : 5.1.0
์ฌ๋ฌ๋ถ, ๊ฐ๋จํ ์์ ์ ๋ค์์ ์ํํ์ฌ react, next ๋ฐ react-dom์ ๊ธ๋ก๋ฒ ๋ฒ์ ์ ์ ๊ฑฐํฉ๋๋ค.
npm remove -g react next react-dom
์ฌ๋ฌ๋ถ, ๊ฐ๋จํ ์์ ์ ๋ค์์ ์ํํ์ฌ react, next ๋ฐ react-dom์ ๊ธ๋ก๋ฒ ๋ฒ์ ์ ์ ๊ฑฐํฉ๋๋ค.
npm remove -g react next react-dom
๋๋ ๋น์ ์ ์ํด ์ผํ ๊ฒ์ด ๊ธฐ์์ง๋ง์ด ์ค๋ ๋์ ๋ง์ ์ฌ๋๋ค์ด ์ด๋ฌํ ์ข ์์ฑ์ ์ ์ธ๊ณ์ ์ผ๋ก ์ค์นํ๋์ง ์์ฌํฉ๋๋ค.
์น๋ฟ๋ง ์๋๋ผ!
๋ฐ์ 16.9
๋ฐ์ ๋ค์ดํฐ๋ธ 0.62
Android์์ ์คํ
์๋ง๋ ์ญ์ฌ์ ๊ฐ์ฅ ์์ ์ฌ์์ฐ ์์ผ๊น์?
import React, { Component, useState } from 'react';
import {
AppRegistry,
} from 'react-native';
function hooker() {
const [count, setCount] = useState(0)
}
class ClassA extends Component {
constructor(props) {
super(props)
//hooker(); //Invalid hook call Error
}
componentDidMount(){
//hooker(); //Invalid hook call Error
}
render() {
hooker(); //Invalid hook call Error
return (
null
);
}
}
export default function App(props) {
//hooker(); //No problem
return (
<ClassA/>
);
};
AppRegistry.registerComponent('default', () => App);
๋๋ ๋ํ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ฌ yarn
๋์ npm
(npm ์ฌ์ฉ์ ์๋ํ์ง ์์)์ ์ฌ์ฉํ๊ณ https://github.com/vercel/next.js/๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ์ต๋๋ค.
์ด๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๋ฒ์ 9.4.4์์ ์์ ํ ๊ณ ์ฐฉ๋์์ต๋๋ค.
์๋์ ๊ฐ์ธ ๊ฒฝ๋ก์ ๋ํด HOC์์ ๋ฐ์ํ๋ ๋ฌธ์ ์
๋๋ค. ๋๋ ๋ํ withRouter
์ฌ์ฉ์ ์๋ํ์ง๋ง ๋์ ๋ํ ๋ ๊ตฌ์ฑ ์์์ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
import { useRouter } from 'next/router'
function withPrivateRoute(WrappedComponent) {
const router = useRouter(); //**** ERROR IS THROWN HERE *******
class WPR extends React.Component {
componentDidMount(){
console.log('wrappeed', WrappedComponent);
// const { router } = this.props;
const intendedRoute = router.pathname;
// const isAdmin = !!cookies.get('isAdmin');
// const isAuthenticated = !!cookies.get('username');
const isAuthenticated = false;
const isAdmin = false;
if (!isAuthenticated) {
router.push({
pathname: '/login',
query: { from: intendedRoute },
});
}
if (
isAuthenticated &&
router.pathname.includes('admin') &&
!isAdmin
) {
router.push('/');
}
}
render() {
return ({ ...props }) => <WrappedComponent {...props} />;
}
}
return WPR;
}
export default withPrivateRoute;
๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ด์ ์ง์ (์ด ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๊ฐ์ )์ผ๋ก ๋์๊ฐ์ ์ต์ ์ฝ๋ ํ์ผ์ ํ์ผ๋ณ๋ก ์ถ๊ฐํ๊ณ ๋ฌธ์ ๊ฐ
import { useToasts, AppearanceTypes } from 'react-toast-notifications';
export const showToast = (message: string, appearance: AppearanceTypes) => {
const { addToast } = useToasts();
addToast(message, {
appearance,
});
};
ํ ์คํธ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์๋๋ฐ ๋ชจ๋ ์์ฒญ์ โโ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด showToast
ํ์
์ด ํ์๋์ง๋ง ์ด์ ์ด ์ค๋ฅ๋ก ์ธํด์ด ์๋น์ค๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
@arcanis์ PR https://github.com/vercel/next.js/pull/8739 ์ ๊ด๋ จ์ด ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ธ๊ธ ๋ PR์ด ๋ณํฉ ๋ ์ด์ ๋ฅผ ์ ๊ฑฐํ๋ Rush ๋ฐ pnpm ๊ณผ ํจ๊ป monorepo ์ค์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ํ https://github.com/vercel/next.js/issues/9022#issuecomment -610255555์์ ๋ง๋ @timneutkens ์ ์์ ์ด ์ ์ฉ๋์ง ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
dependencies: next, react, react-dom, library
library
devDependencies: react, react-dom (for tests)
peerDependencies: react, react-dom
library.devDependencies.(react|react-dom)
๋ website.dependencies(react|react-dom)
์ ์ ํํ ๋์ผํ ํ์ผ์ ๊ฐ๋ฆฌํค๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ์
๋๋ค. ๊ทธ๋ฌ๋ https://github.com/vercel/next.js/blob/f98e38c9b634b85e6679e7b5f953a9d98074cfc3/packages/next/lib/resolve-request.ts#L16 ์์ ์ฌ์ฉ๋๋ [email protected] ์ฒ๋ผ ๋ณด์
๋๋ค. ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ณด์กดํ์ฌ ๊ธฐ๋ณธ Node.js ๋์.
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
library
์์ ์ฝ๋๋ฅผ ํธ๋์ค ํ์ผ ํ๊ธฐ์ํ resolve.symlinks = true
๋ด๋ถ์ ์นํฉ ๊ตฌ์ฑ์์ next.config.js
library
์ผ๋ก๋ถํฐ ์์ฒญํ๊ธฐ library/node_modules
(์ ๋๋ก ํด๊ฒฐ ๋ชจ๋์ ์๋ฒ ์ธก ๋น๋)์ด๊ฒ์ ์๋ ํ๋๋ก ์๋ํ์ง๋ง, Next.js๊ฐ Apple ๊ณผ ๊ฐ์ ์ค์ํ ์น ์ฌ์ดํธ๋ฅผ ์ง์ํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋, ๊ทธ ํฐ ํ๋ก์ ํธ์์ ๊ณต์ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋๋ ๋ชจ๋ ธ ๋ ํฌ์ ๋ํ ๋ ๋์ ์ง์์ ๊ธฐ๋ํ ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ๋ค์ ๊ฐ์ง๊ณ ๋์๊ณ HOC๋ฅผ ์ฌ์ฉํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง ๊ตฌ์ฑ ์์๋ฅผ ๋ํผ๋ก ์ฌ์ฉํ๋ฉด ์ ๋๋ก ์๋ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
๋๊ตฐ๊ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ์ด๊ฒ์ ์ฌํ ํ ์์๋ repo๊ฐ โโ์์ต๋๋ค : next-components-hooks-error
components/withPrivateRoute.js
-> ์์ ๊ตฌ์ฑ ์์
import React, { useEffect } from 'react';
import { useRouter } from 'next/router';
const withPrivateRoute = WrappedComponent => {
const router = useRouter();
const [loading, setLoading] = useState(true);
useEffect(() => {
const user = localStorage.getItem('user');
console.log(user);
if (!user) {
router.push('/login');
} else {
setLoading(false);
}
}, []);
return ({ ...props }) => !loading && <WrappedComponent test={test} {...props}/>;
};
export default withPrivateRoute;
pages/hoc.js
-> ์๋ํ์ง ์์ (HOC ์ฌ์ฉ ํ์ด์ง)
import React from 'react';
import withPrivateRoute from '../components/withPrivateRoute';
const HocTest = () => <p>Authorization HOC Test!</p>;
export default withPrivateRoute(HocTest);
components/AuthLayout.js
-> ๊ตฌ์ฑ ์์ (๋ํผ)
import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/router';
const AuthLayout = ({ children }) => {
const router = useRouter();
const [loading, setLoading] = useState(true);
useEffect(() => {
const user = localStorage.getItem('user');
console.log(user);
if (!user) {
router.push('/login');
} else {
setLoading(false);
}
}, []);
return !loading && (
<React.Fragment>
{children}
</React.Fragment>
);
};
export default AuthLayout;
pages/wrapper.js
-> ๋ํผ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง, ์๋ํฉ๋๋ค.
import React from 'react';
import AuthLayout from '../components/AuthLayout';
const WrapperTest = () => (
<AuthLayout>
<p>Authorization Wrapper Test!</p>
</AuthLayout>
);
export default WrapperTest;
@Timer ์ ์ง์ ์ด ์์ต๋๊น?
https://github.com/vercel/next.js/issues/9022#issuecomment -609969178์ ์๋ฃจ์
์ผ๋ก ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ด ๋ฌธ์ ๋ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ yarn link
๋ด ์ฑ ๋ฆฌํฌ์งํ ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์
package.json
{
"dependencies": {
"next": "9.5.1",
"myUILibrary": "git+ssh://[email protected]/MyRepo/library-web-ui.git#master",
"react": "16.13.1",
"react-dom": "16.13.1"
}
}
yarn link myUILibrary
๋ react
์ค์น๋ ๋ด ๋ก์ปฌ ์ฒดํฌ ์์ MyRepo/library-web-ui
๋ก ๋ณด๋
๋๋ค.
์๋ฃจ์ ์ ๊ฒ์ ํด ์ฃผ์ @johot ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
5 ๐ 3 ์ ๋ง์ (์! ๋ชจ๋ ๋ณ๊ณผ ๊ทธ ์ด์!)
Rush + PNPM monorepo์์ @ wasd171 ๊ณผ ๋์ผํ ๊ฒฝํ์ ํ์ธํ ์ ์์ต๋๋ค. ์ค๊ฐ์ ~9.4.4
๋ง ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
Rush + PNPM๊ณผ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค ๐
์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋งค์ฐ ์ด๋ฆฌ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
import React, { useState } from 'React';
๋์ R์ ์ด๋ฆฐ์ ๋ค์ ๋๋ค ์ฌ๋๋ค์ ๋ํผ์ r์ ์ด๋ฆฐ์ ๋ค์ ๋๋ค ์ฌ๋๋ค์ ๋ํผ๋ฅผํด์ผํ๋ค :
import React, { useState } from 'react';
์. 9.5.x
๋ณผ ์ ์์ต๋๋ค.- 9.4.4
๋ค์ด ๊ทธ๋ ์ด๋ํ๋ ์์
- next-site
๋ก๋ ์ฌํ ํ ์ ์์ต๋๋ค.
9.5.2์์์ด ์ค๋ฅ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ๊ฒ์ด ํธ๋ฆญ์์ด 9.5.3์์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค.
pnpm์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๋๋ฌด ๋นจ๋ฆฌ ๋ง ํ์ด์. 9.5.3์์๋ ์๋ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ง๊ธ์ 9.5.3์์ ์์ ์ ์ผ๋ก ์๋ํฉ๋๋ค. ๐คท ๋ ์ด์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
9.5.3์ด ๋๋ฅผ ์ํด ์๋ํ์ง ์์ต๋๋ค-๋์ผํ ์ค๋ฅ. Rush + NPM์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์๋ ค์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? (btw๋ ๋ ์ด์ 9.0.6์ด ์๋๊ธฐ ๋๋ฌธ์ ์ ๋ชฉ์ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค)
์ฐธ๊ณ ๋ก, ๋ด ์กฐ์ง์ด npm
์์ yarn
๋ก ์ด๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ด์ ์ค ํ๋์์ต๋๋ค. (๋ถํํ๋) ํจ์ฌ ๋ ์ ์ฌ์๋ฉ๋๋ค. ๊ทธ ์์ง์์ ์ฑ๊ฐ ์์ง๋ง ์ฐ๋ฆฌ๋ ์ง๊ธ ๋งค์ฐ ํ๋ณตํฉ๋๋ค.
ํํฌ๊ฐ์๋ ํธ๋์ค ํ์ผ ๋ ๋ชจ๋๋ ๋์๊ฒ ์ ํฉํ์ง ์์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , next-transpile-modules
๋ฐ npm
์ฌ์ฉํ ๋์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๋ ์ฌ๋์๊ฒ ๋ฌธ์ ์ ์ ์ฌ์ ์๋ฃจ์
์ ์ค๋ช
ํ๋ FAQ ์น์
์ ์์ฑํ์ต๋๋ค. https://www.npmjs.com/package/ ๋ค์ transpile-modules # i- ์ค๋ณต ๋ ์ข
์์ฑ ๋๋ ์ ํจํ์ง ์์ ํํฌ ํธ์ถ ์ค๋ฅ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ ์์ฌ์ ๋ฒ์ ํด์๋๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ๋ฐ์ ์ข
์์ฑ์ ๋ฃจํธ package.json
๋ก ์ด๋ํ๋ ๋์ ๋ค์ ์ค์ ์ถ๊ฐํ์ต๋๋ค.
"resolutions": {
"react": "16.13.1",
"react-dom": "16.13.1"
}
์ฐธ์กฐ : https://classic.yarnpkg.com/en/docs/selective-version-resolutions/
์ ๊ฒฝ์ฐ์๋ ๋ก์ปฌ ๋น๋๊ฐ ์๋ํ๋ ๋ฐ๋ฉด Vercel์ ๋น๋๋ Invalid hook call
์ค๋ฅ๋ฅผ๋ณด๊ณ ํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
Next 10์ ์บ์น ์ฌ ํ์ด์ง๋ก _app.js
์์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ์คํํ์ต๋๋ค.
์ผ,
์ ๊ฒฝ์ฐ์๋ npm link
๋ฅผ ํตํด ๋งํฌ ๋ ๋ชจ๋์ ํธ๋์ค ํ์ผํ์ต๋๋ค.
React์ ๊ฐ์ ์ข
์์ฑ์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ค์ด๋ก๋ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ์ข
์์ฑ ๋์ peerDependencies
๋ก ํฌํจ๋์ด์ผํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ชป๋ ํํฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ํ์ญ์์ค.
npm install
๋ฅผ ์คํํ์ฌ ๋ชจ๋ ๋ชจ๋์ ์ค์นํ์ญ์์ค.sudo npm link
๋ฅผ ์คํํฉ๋๋ค.npm link @example/project
์คํํฉ๋๋ค. Visual Studio Code๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ node_modules ๋ด๋ถ์ ๋ชจ๋ ์ด๋ฆ ๊ทผ์ฒ์ ์์ ํ์ดํ ์์ด์ฝ์ด ํ์๋ฉ๋๋ค.npm run dev
์คํํ์ญ์์ค.๋ค์ ๋งํ์ง๋ง, @ example / project์ ์ผ๋ฐ ์ข ์์ฑ ๋์ React๋ฅผ peerDependency๋ก ํฌํจํด์ผํฉ๋๋ค.
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด๋ถ์ next.js ํ๋ก์ ํธ๊ฐ์๋ monorepo๊ฐ โโ์์ต๋๋ค. storybook
์ค์น ํ ์๋ชป๋ ํํฌ ํธ์ถ๋ก ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. @aengl ์ ์ ์์ ๋ฐ๋ผ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. resolutions
์ ๋ฃจํธ ์์ค package.json
.
"resolutions": {
"react": "^17.0.1",
"react-dom": "^17.0.1"
}
๊ทธ๋๋ ๋ ๋ง์ ํด๋ผ์ด์ธํธ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๊ฒ์ด ์ข์ ์๋ฃจ์ ์ด ๋ ์ง ํ์คํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ monorepo๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ์ด ์ ํํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.