ããã¯ã䜿çšããã¡ã€ã³ã®Next.jsãããžã§ã¯ããã©ã«ããŒã®å€éšã«ããã³ã³ããŒãã³ããreactã䜿çšããå Žåã æçµçã«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ããã¯ç¢ºãã«éåžžã«ãŸãã§ã
@lfadesè¿ä¿¡ããããšã
@baldurhäŸãšããŠãã¹ããããNextJsã¢ããªãããããã next-i18nextã§ããã«
@isaachinmanãŸã ãããŸããã ä»ã®çç±ã§ãŸã 9.xã«ã¢ããã°ã¬ãŒãã§ããŠããªãã®ã§ã調æ»ããŠããŸããã ããã«åœ±é¿ãäžããã³ãŒããã©ãã«ããã®ã誰ããç¥ã£ãŠããŸããïŒ åé¡ããã£ãšããç解ãããã§ãã
ç§ã¯ãŸã ãããæãäžããæéããããŸããã§ãããã誰ããåçŸãå¿
èŠãªå ŽåïŒ next-i18nextã®ã¯ããŒã³ãäœæãã cd
ãexamples/simple
ã«ã¯ããŒã³ããNextJsããŒãžã§ã³ã> = 9.0.6ã«ã¢ããã°ã¬ãŒãããŸãã
çŸåš9.0.3ã§ãããããããã¯æè¡çã«ã¯ãããã®é倧ãªå€æŽã§ãã
æè¿åæ§ã®ãšã©ãŒãçºçãã9.0.5ïŒããã³React 16.8.xïŒã«ããŠã³ã°ã¬ãŒãããå¿ èŠããããŸããã ç§ãèŠãåé¡ãNextã®MDXã®äœ¿çšã«çµã蟌ãã ã®ã§ããããã以äžã®å ·äœçãªè©³çŽ°ã¯ãããŸããã
NextïŒnext-i18nextã«åºã¥ãããªã倧ããªãããžã§ã¯ãã§åãåé¡ãæãäžããŸããã
ãã®ãšã©ãŒã¯æ¬¡ã®3ã€ã®çç±ã§ã¹ããŒãããå¯èœæ§ãããããšãããããŸããã
å¥åŠãªããšã«ãããã¯æ¬çªãã«ãã§ã®ã¿çºçããŸãã
@timneutkens @Timerããã«ã¿ã°ãä»ããŠç³ãèš³ãããŸããããããªãããã®å ¥åããåŸ ã¡ããŠããŸãã ããã¯ä¿®æ£ã§ãããã®ã ãšæããŸããïŒç§ãã¡å šå¡ãããã€ãã®åé¿çãå®è£ ããå¿ èŠããããŸããïŒ ããã¯ãçŸæç¹ã§ã¯ããªã倧ããªãããã«ãŒã§ãã ããããšãã
react
ãšã€ãªã¢ã¹ãäœæããããã§ããã react-dom
ã¯ãšã€ãªã¢ã¹ããŠããŸããã ããªãã¯ãããè©Šãããšãã§ããŸããïŒ
@Timerããããšãã è©ŠããŸãããå¹æããããŸããã§ãã
react
ãšreact-dom
äŸåé¢ä¿ã1ã¬ãã«äžã«ç§»åããããšã§ãä»ãªããã§ããã解決ããããšãã§ããŸããã 誰ããè©ŠããŠã¿ããå Žåã¯ãå€æŽãããã·ã¥ããŸããã å®éã®ãããžã§ã¯ãã§ã¯è©ŠããŠããŸããããããŸãããããšãé¡ã£ãŠããŸãã ããããããã¯ãåæ§@isaachinmanã@jaredcwhiteãš@felixmoshã®ããã®åé¡ã解決ããã ãããïŒ
@Timerããããããžã§ã¯ãã§æ©èœãããŸãããããããžã§ã¯ãã®node_modules
ãã©ã«ããŒã«react
ãã€ã³ã¹ããŒã«ããä»ã®äŸåé¢ä¿ããªãããšã確èªããå¿
èŠããããŸããã ç§ãã¡ã®å Žåãããã¯ã¹ããŒãªãŒããã¯ã«é¢é£ããŠããŸããïŒ yarn why react
ã¯å€§ãã«åœ¹ç«ã¡ãŸããðïŒã ãšã«ããã¹ããŒãªãŒããã¯ãå¥ã®ãããžã§ã¯ãã«ç§»åããããšãèšç»ããŠããã®ã§ããã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ãã¡ã®å Žåã«ã¯ããŸããããšæããŸãã
ãããããã§ãã äžé©åã«å
¬éãããnode_module
ããã±ãŒãžã¯ããããåŒãèµ·ãããŸãïŒãã¢ã®äŸåé¢ä¿ã§ã¯ãªãã react(-dom|)
ã«äŸåããŸãïŒã
react
ãšreact-dom
äŸåé¢ä¿ã1ã¬ãã«äžã«ç§»åããããšã§ãä»ãªããã§ããã解決ããããšãã§ããŸããã 誰ããè©ŠããŠã¿ããå Žåã¯ãå€æŽãããã·ã¥ããŸããã å®éã®ãããžã§ã¯ãã§ã¯è©ŠããŠããŸããããããŸãããããšãé¡ã£ãŠããŸãã ããããããã¯ãåæ§@isaachinmanã@jaredcwhiteãš@felixmoshã®ããã®åé¡ã解決ããã ãããïŒ
ãã®ãªããžããªã§è¡ã£ãå€æŽã«ã€ããŠè©³ãã説æããŠããã ããŸããïŒ
npm ls react
ãŸãã¯npm ls react-dom
ãå®è¡ããŸããããªã¹ãã«ãã次ã®ã¢ããªã®ã¿ãååŸããŸããã
@felixmoshç³ãèš³ãããŸããããæšæ¥ããã·ã¥ã倱æããããã§ãã ããã§å€æŽã¯ééããªããããŸãð
react
ãšreact-dom
ãapp
ãã©ã«ããŒããã«ãŒããã©ã«ããŒã«ç§»åããã®ã§ãäž¡æ¹ã§yarn/npm install
ãå®è¡ããå¿
èŠããããŸãapp
ãã©ã«ããšã«ãŒããã©ã«ãããªããå®è¡ããåã«app
ã ãããååã«æ確ã§ããããšãé¡ã£ãŠããŸãã
ãããæ¬çªç°å¢ã§æ©èœãããã«ã¯ããã«ãã·ã¹ãã ã«ããã€ãã®å€æŽãå ããå¿ èŠãããããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãŸã å°ãé¢åã§ãð
説æãããããšããç§ã¯æ¬¡ã®ããŒã ãããã解決ããã®ãåŸ ã¡ãŸããç§ã®ã¢ããªããžããªã®ã«ãŒãã«reactdepsã眮ãã®ã¯å°ãå¥åŠã«èãããŸã...
@felixmoshããç§ã¯ããªãã«åæããŸãã ãã ãã糞ã®ã¯ãŒã¯ã¹ããŒã¹ã®ãããªãã®ã䜿çšããå Žåãããã¯ãŸãã«ãã®ããŒã«ãè¡ãããšã§ãã 2ã€ä»¥äžã®ãããžã§ã¯ãã§åãäŸåé¢ä¿ãããå Žåã¯ãäŸåé¢ä¿ãã«ãŒãã«åŒãäžããŸãã ãã¹ãŠã®ãããžã§ã¯ãã§åãããŒãžã§ã³ã®äŸåé¢ä¿ãããããšãä¿èšŒãããã®ã§ãããã¯çŽ æŽãããããšã§ãã ãããããã®ãããªããŒã«ããªãå Žåã¯ãèªåã§ç®¡çããå¿ èŠããããå®éã«ã¯å°ãåä»ã§ãã æåã®è§£æ±ºçã¯ãNext.jsããŒã ã調æ»ããç§ãã¡å šå¡ã®ããã«ããã解決ããããšã§ããããšã«åæããŸãððð»
åãåé¡ãçºçãã react
ãšreact-dom
1ã¬ãã«äžããŠãã«ãŒããããµãŒããŒãå®è¡ããããšããçŸåš9.1.5ã§æ©èœããå¯äžã®åé¿çã§ãã ãã®åé¡ã®åã«ãããã®ãªã³ã¯ãèŠã€ããã®ã§ãåç
§çšã«https://github.com/facebook/react/issues/13991ãšhttps://github.com/facebook/react/issues/15315#issuecomment-479802153ããªã³ã¯ããŸãã
ããã«ã¡ã¯ãã®åé¡ã«é¢ããæŽæ°ã¯ãããŸããïŒ ç§ãã¡ã¯ã¢ãã¬ããæã£ãŠããããã®æ£ç¢ºãªåé¡ã«çŽé¢ããŠããŸãã
åãåé¡ã«çŽé¢ããŸãã
v9.0.5ã¯ãrootFolderã®å€éšã«ã€ã³ããŒããããã³ã³ããŒãã³ãã®ããã¯ã§ããŸãæ©èœããŸãã
9.0.6ãã9.1.6-canary.5ãŸã§åãåé¡ããããŸãã
ãã®åé¡ã¯ãµãŒããŒåŽã§ã®ã¿çºçããŸãã SSRãç¡å¹ã«ãªã£ãŠããå ŽåïŒããšãã°ãåçãä»ããŠå€éšã³ã³ããŒãã³ããããŒãããå ŽåïŒãããŒãžã§ã³> = 9.0.6ã§ãã¹ãŠãæåŸ ã©ããã«æ©èœããŸãã
@nodkzããã¯reactããã±ãŒãžã®è§£æ±ºã«é¢ããåé¡ã§ãããããããŒãã§ã®ã¿çºçããŸãã
@Timerãã®åé¡ã¯ãçŽ6ããŒãžã§ã³ã®ã次ã®ããã€ã«ã¹ããŒã³ã«ç§»åããŸãããããã«ãããææ°ããŒãžã§ã³ã«æŽæ°ã§ããªããªããŸãã
ç§ã¯ãã®å®¿æ³æœèšã§äžæ¥äžç¡é§ã«ãªããŸãããããã®åå ãäœã§ãããããããŸãããåé¿çãè©ŠããŸããïŒããã¯ããŸããããŸããã§ããïŒã
æ¹åæ§ã調æ»ããã®ã«å©ããå¿
èŠã§ããïŒ
äœãçŽæã¯ãããŸããïŒ
ãªãããã¯æ¬çªãã«ãã§ã®ã¿çºçããã®ã§ããïŒ
ããã«é¢é£ããå¯èœæ§ã®ãã9.0.5
ãã9.0.6
äœãå€æŽãããŸãããïŒ
ããããšãððŒ
ç§ã¯åé¡ãèŠã€ãããšæããŸã!!!
ç§ã¯ããã2ã€ã®ããšã®çµã¿åããã ãšæããŸãïŒ
i18next
/ react-i18next
ã¯ãµãŒããŒãã³ãã«ã®å€éšã§ã¯ãããŸããã§ãã!!useTranslation
ããã¯ã§æå¥ãèšããŸã...ããã§ããµãŒããŒãã³ãã«å ã«ããŒãã¢ãžã¥ãŒã«ãååšããçç±ã調æ»ããŸããïŒãµãŒããŒãã³ãã«ã®ãã¹ããã©ã¯ãã£ã¹ã¯ãããããå€éšã«ããããšã§ãïŒã
nextã«ã¯nextlibã®ããã€ãã®äŸå€ãããããšãããããŸããïŒãªãã§ããïŒïŒãé¢çœãéšåã¯ã i18next
ïŒ react-i18next
åæ§ã«ããã®æ£èŠè¡šçŸãnext/dist/
ã§çµãããã¹ãŠã®libããã£ããããããšã§ãã !!
ãããã£ãŠããããå€æŽãããšã次ã®ããã«ãªããŸãã
res.match(/next[/\\]dist[/\\]/)
ã«
res.match(/[/\\]next[/\\]dist[/\\]/)
ãµãŒããŒãã³ãã«ã¯ã next
ã§ã¯ãªãã next/dist
ã§çµãããã¹ãŠã®ã©ã€ãã©ãªãé€å€ããåé¡ã解決ããŸããã
ç§ã«ãšã£ãŠã®äž»ãªåé¡ã¯ããªã¯ãšã¹ãã解決ããæ°ããæ¹æ³ã§ãïŒ https ïŒ
ãããžã§ã¯ãã«ãŒãã®å€éšã«ã³ã³ããŒãã³ããããããããªã¯ãšã¹ãã®è§£æ±ºã«ãããšã©ãŒãã¹ããŒããããµãŒããŒãã£ã³ã¯ã«react
ããã³ãã«ãããŸãã ãã®ããããµãŒããŒã§Invalid hook call
ãšã©ãŒãçºçããŸãã
ãªã³ã¯ããåŒã®@baldurh context
ã¯webpackã«ãã£ãŠæäŸãããã³ã³ãã€ã«ã«ãŒãïŒãããžã§ã¯ããã£ã¬ã¯ããªïŒãšã¯ç°ãªããŸãã
requireãçºè¡ããŠããã®ã¯åžžã«ãã¡ã€ã«ã®ãã£ã¬ã¯ããªã§ãã
æ£ããã ä»ã®ãšããæ©èœããããã«ããããé©çšããŸããã æçµçã«ã¯ãäŸåé¢ä¿ãäžäœãã£ã¬ã¯ããªã¬ãã«ã§å
±æãããããã«ãã³ãŒãã®æ§é ãå€æŽãããšæããŸãã ãã ãã 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ã¯ãŒã¯ã¹ããŒã¹ã䜿çšããããã«å€æããããšã§åé¡ãåé¿ããããšãã§ããŸããïŒãªããžããªã«å«ãŸããããã±ãŒãžã¯1ã€ã ãã§ããïŒã
ã³ãŒãã./srcãã./package/our-package-name/srcã«ç§»åããyarnã¯ãŒã¯ã¹ããŒã¹ãã»ããã¢ããããŸãã=> https://classic.yarnpkg.com/en/docs/workspaces/
ããã«ãããå ±éã®äŸåé¢ä¿ãæäžäœã®./node_modulesãã©ã«ããŒã«åŒãäžããããã/ package / our-package-name / node_modulesã¯ã»ãšãã©ç©ºã®ãŸãŸã«ãªããããããã¯åé¡ãåé¿ããŸãã
ãããã£ãŠãããã±ãŒãžããªã³ã¯ãããšã次ã«2çªç®ã®ããŒãžã§ã³ã®reactããã«ãããªããªãïŒããã±ãŒãžã®node_modulesãã©ã«ããŒã«ååšããªãããïŒããã¹ãŠãæ£åžžã«æ©èœããŸãã
ç§ã¯åãã¯ãœã®åé¡ãæ±ããŠããŸãã ¬¬ '
è¡åèŠç¯ã«åãããããç§ãã¡ã¯äžè¬çã«çœµåããŸãã
ç³ãèš³ãããŸããããç§ã¯ãã®ãã°ã«è ¹ãç«ãŠãŠããŸããã å®ã¯ãNext.JSã奜ããããŸãã ãããããã®åé¡ã¯éå±ãªã®ã§ã䜿çšã§ããŸããã
å€éšããŒã«ã«ããã±ãŒãžãšnext-transpile-modules
ãšãã«ããã®åé¡ã«çŽé¢ããŠããŸãã
Next.jsã®ææ°ããŒãžã§ã³ã䜿ãç¶ãããã®ã§ãæ ¹æ¬çãªåå ãèŠã€ãã£ãå Žåã¯ãNext.jsã«ããããéä¿¡ããããšããŸãã
[email protected]ãã€ã³ã¹ããŒã«ããåŸãåãåé¡ã«çŽé¢ã
ç§ã®äŸåé¢ä¿ã¯next @ v9.3.1 ã react @ 16.13.0 ã react-dom @ 16.13.0 ããããŠãã¡ããä»ã®å€ãã®ã©ã€ãã©ãªã§ãïŒãã ããnext-i18nextãã€ã³ã¹ããŒã«ããåã¯ãã¹ãŠãæ©èœããŠããŸããïŒã 誰ããåé¿çãæã£ãŠãããªããããã¯çŽ æŽããããããããŸããïŒ+1ïŒ
ãã®å·ãæçš¿ããŠããã ãããããšãããããŸãããã¶ã€ã³ã·ã¹ãã ïŒreactã³ã³ããŒãã³ãã©ã€ãã©ãªïŒããã±ãŒãžã®ã·ã³ããªãã¯ãªã³ã¯ã«ãåé¡ããããŸããã ãŸãã 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
ãé€ããã¹ãŠãã·ã³ããªãã¯ãªã³ã¯ããŸãã ç§ã¯ããã®ããã«ç¬èªã®ãŠãŒãã£ãªãã£ãäœæããŸãããããããgithubã«æçš¿ã§ããŸãããããããããNextJSã§ä¿®æ£ãããŠããã®ãèŠããšããã§ããããç§ã¯ãWebpackãšã€ãªã¢ã¹ãNextJS以å€ã®ãã¹ãŠã®ãããžã§ã¯ãã§æ©èœããçç±ãç解ããããšå€ãã®æéãè²»ãããŸãã:)
PSã ãããæ¬çªãã«ãã«ã©ã®ããã«åœ±é¿ãããã¯ããããŸããããéçºäžã«ã®ã¿äœ¿çšããŸã
if (options.isServer) {
config.externals = ["react", ...config.externals];
}
react
ã¯ãã§ã«å€éšãµãŒããŒåŽã§ãã
config.resolve.alias["react"] = path.resolve(__dirname, ".\\node_modules\\react");
ããã§ã¯åé¡ã¯è§£æ±ºããŸããã
ãã®åé¡ã¯ãã«å¿ããŠãããªãã®äŸåé¢ä¿ã«é¢é£ããŠåã«è¿°ã¹react
ã圌ããæã£ãŠããå¿
èŠããããäžæ¹ã peerDependency
ã«react
ïŒåœŒãã¯ãããå¿
èŠãšããå Žåãšãåå¿-DOMïŒãã
@timneutkens
ãããããããåžžã«åœãŠã¯ãŸããšã¯éããŸããã ç§ã¯ç¢ºãã«ãã¢ã®äŸåé¢ä¿ãšããŠreactãšreact-domãæã£ãŠããŸãã ãã ããããšãã°ã©ã€ãã©ãªãnextjsãããžã§ã¯ãã«ã·ã³ããªãã¯ãªã³ã¯ããå Žåã§ããåé¡ã¯çºçããŸãã 次ã«ãã©ã€ãã©ãªå
ã«node_modules
ãã©ã«ããäœæãããŸãïŒå°ãªããšãããã®ã©ã€ãã©ãªãã©ã«ãã§npm i
ãŸãã¯npm link
ããããšãããå ŽåïŒã
ãã®ã©ã€ãã©ãªãã©ã«ããŒããreactã解決ããããšããã®node_modules
ãã©ã«ããŒå
ã®ãã©ã«ããŒã«è§£æ±ºãããåé¡ã®åå ãšãªãreactã®ãã¥ã¢ã«ã³ããŒãååŸãããŸãã libå
ã®node_modules
ãã©ã«ããŒãåé€ãããã npm link
以å€ã®ãã®ã䜿çšããŠã€ã³ã¹ããŒã«ãããšãã¯ããåäœããŸãïŒãã¢ã®äŸåé¢ä¿ãŸãã¯ãŸã£ããåãreactããŒãžã§ã³ã䜿çšããŠããå ŽåïŒã
ãããã£ãŠãéçºäžã«ããã解決ããã«ã¯ããšã€ãªã¢ã¹åå¿ãå®è¡ããŠãå
šå¡ã«åãããŒãžã§ã³ã䜿çšããããã«åŒ·å¶ã§ããããã«ããå¿
èŠããããŸãã ããã«èšèŒãããŠããåé¡ã®ããã config.externals ...
éšåãè¿œå ããªããšãçŸåšã®NextJSããŒãžã§ã³ã§ã¯å¹æããããŸããïŒå°ãªããšãç§ã«ãšã£ãŠã¯ïŒã
åæ§ã®åé¡ãç§ã«ãèµ·ãã£ãŠããŸãããïŒæœåšçã«ïŒmaterial-uiã©ã€ãã©ãªïŒïŒ10162ã§æŠèª¬ïŒãåå ã§ãä»ã®ãšããäžæçãªä¿®æ£ã¯preserve
npm run clean
ãè¿œå ããããšdev
ã¹ã¯ãªããïŒ
https://github.com/zeit/next.js/issues/10162#issuecomment -612501431
@timneutkensæ¬åœã®åé¡ã¯ããããã®äŸåé¢ä¿ãç¬èªã®depsïŒdepsãšpeer-depïŒãã©ã®ããã«ãªã¹ããããã«é¢ä¿ããŠããããšãç解ããŠããŸããããããããæ°žç¶çã«ä¿®æ£ããããã«ç¬èªã®ã¢ããªã§äœãã§ãããèããŠããŸããïŒ
@ ryan-0ç¹å¥ãªèšå®ã¯ãããŸããïŒ ãããªã¢ã«Uiããã¢éšéãšããŠåå¿ããããšããªã¹ãããŠããªãå Žåãé©ãã§ããããïŒ éåžžã«å€ãreactããŒãžã§ã³ã䜿çšããããäœããã·ã³ããªãã¯ãªã³ã¯ãããããŸããïŒ
ç¹å¥ãªèšå®ã¯ãããŸãã..ã·ã³ããªãã¯ãªã³ã¯ãåå¿ããããŸãã16.13.1
->åé¡ãå
¬å¹³ã«ããåå ãšãªãå¯èœæ§ã®ããä»ã®éšéãããã€ããããŸãããå°ãªããšããã®åçŸã«ããã°ãããããmaterial-ui / coreã«é¢é£ããŠããããã§ãïŒããã䜿çšããŸãïŒïŒ
https://github.com/zeit/next.js/issues/10162
@ ryan-0ããªãã®material-uiãã©ã«ããŒå ã«reactãå«ã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
}
}
Lernamonorepoã«ååšããããŒã«ã«ããã±ãŒãžã§yarn link
ã䜿çšããŠããŸãã ãã®node_modules
ã¯react
ã³ããŒã¯å«ãŸããŠããŸããããmonorepoã«ãŒãã«ã¯å«ãŸããŠããŸãã resolve.alias
ã䜿çšãããŠããéããéããçãããšã¯æããŸããããæ®å¿µãªããããã§ã¯ãããŸããã ã¢ãã¬ãã«ãŒãããreact
ã®ã³ããŒãåé€ããåŸã代ããã«Cannot find module 'react'
ãšã©ãŒãçºçããŸãã
誰ããããã«å¯Ÿããè¯ã解決çãèŠã€ããŸãããïŒ
ãªã³ã¯ããã次ã®ã©ã€ãã©ãªãããã next-transpile-modules
ã䜿çšããŠãconsumerããããžã§ã¯ãã«è¿œå ããŠããŸãã ããã¥ã¡ã³ãã«èšèŒãããŠããããã«ã next.config.json
react
ãšã€ãªã¢ã¹ãè¿œå ããŸããããããã ãã§ã¯äžååã§ããã Reactã®äŸåé¢ä¿ãéè€ããŠãããšãããšã©ãŒããŸã çºçããŠããŸãã
@mweststrateã®relative-deps
ã䜿ã£ãŠã¿ãããšãã§ããŸã
誰ããããã«å¯Ÿããè¯ã解決çãèŠã€ããŸãããïŒ
ãªã³ã¯ããã次ã®ã©ã€ãã©ãªãããã
next-transpile-modules
ã䜿çšããŠãconsumerããããžã§ã¯ãã«è¿œå ããŠããŸãã ããã¥ã¡ã³ãã«èšèŒãããŠããããã«ãnext.config.json
react
ãšã€ãªã¢ã¹ãè¿œå ããŸããããããã ãã§ã¯äžååã§ããã Reactã®äŸåé¢ä¿ãéè€ããŠãããšãããšã©ãŒããŸã çºçããŠããŸãã
ã¯ããäžèšã®ç§ã®æçš¿ãåç §ããŠãã ããããµã³ãã«ã«config.externalsããŒããè¿œå ããå¿ èŠããããŸãããããããšããšã€ãªã¢ã¹ãåã³æ©èœãå§ããŸãã
@johotç§ã¯ããªãã®è§£æ±ºçãè©ŠããŸããããããã¯ç§ã«ãšã£ãŠã¯cannot destructure property 'query' of 'Object(...)(...)' as it is null
ã§ãã ãã®å Žåã«ã¯ããã«ãšããŠèŠãªããžã§ã¯ããããuseRouter
ããnext/router
ã
@aleclarsonãã³ããããããšãã 次ã®ã»ããã¢ããã§åäœããªãå Žåã¯ãè©ŠããŠã¿ãŸãã çŸåšäœ¿çšããŠããŸããïŒ
next-transpile-modules
ãšYarnã䜿çšããŠããå Žåã解決çã¯éåžžã«ç°¡åã§ãïŒ https ïŒ
npm
ã䜿çšããŠããå Žåãç§ã¯ãŸã 解決çãæ¢ããŠããŸãïŒc
ããŠãç§ã®æçµçãªè§£æ±ºçã¯ã yarn link
ããyalc
ã«ç§»è¡ããããšdist
ãã©ã«ããŒã«ã³ããŒããŠãããå€æŽãyalcã¹ãã¢ã«ããã·ã¥ããgulpã¿ã¹ã¯ããããŸãã
'consumer'ã§ã 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
}
ãããã£ãŠãnextã¯tsconfig.json paths
åºã¥ããŠãã¹ã解決ã§ããŸãã 詳现ã¯ãã¡ãã
ç°¡åã«èšããšã yalc
+ next-transpile-modules
ãçµã¿åããããšãããŒã«ã«éçºã®ã»ããã¢ããã倧å¹
ã«æ¹åãããŸããã éè€ããäŸåé¢ä¿ãå¥åŠãªãšã©ãŒã¯ãããŸããã çŽæ¥äœ¿çšããŠã¢ãžã¥ãŒã«ãè¿œå ããè¡åyarn add
ãšããã¢ãžã¥ãŒã«ãçµã¶yalc
ã»ãšãã©åãã§ãã
styled-components
ã«äŸåããããŒã«ã«ã«ãªã³ã¯ãããã©ã€ãã©ãªã䜿çšããŠããå Žåã¯ããããåç
§ããŠãã ããïŒ
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
yarn
ã䜿çšããããã«æŠãïŒ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ã«ããPRhttps ïŒ//github.com/vercel/next.js/pull/8739ã«é¢é£ããŠããããšã確èªã§ã
Rushãšpnpmã䜿çšããmonorepoã»ããã¢ããã䜿çšããŠãããããåè¿°ã®PRãããŒãžãããçç±ããªããªããŸãã ãŸãã httpsïŒ //github.com/vercel/next.js/issues/9022#issuecomment -610255555ã§äœæããã@timneutkensãé©çšãããªããšããç¹ãã次ã®æ§é ã«ãªã£ãŠããŸãã
website
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]ãçŸåšã®
æçµçã«ã¯æ¬¡ã®ããã«ãªããŸããã
library
ã«ãã©ã³ã¹ãã€ã«ããããã®resolve.symlinks = true
ã®WebPACKã®ã³ã³ãã£ã°å
éšã§next.config.js
library
ããèŠæ±ãããå€éšãæäœããŠlibrary/node_modules
ããèŠæ±ãããŸãïŒãµãŒããŒåŽã®ãã«ãã§ã¢ãžã¥ãŒã«ãæ£ãã解決ããããïŒããã¯æå³ãããšããã«æ©èœããŸãããNext.jsãAppleã®ãããªéèŠãªWebãµã€ãã®ããã€ãã«é»åãäŸçµŠããŠããããšãèãããšããããã®å€§ããªãããžã§ã¯ãã§å ±æã³ãŒãã管çããããã«ãã䜿çšãããã¢ããªããžããªã®ããè¯ããµããŒããæåŸ ã§ããŸããïŒ
ç§ã¯ããããããã£ãŠã¿ãŸããããHOCã䜿çšãããšãšã©ãŒãã¹ããŒãããããšãããããŸããããã³ã³ããŒãã³ããã©ãããŒãšããŠäœ¿çšãããšãæ£åžžã«æ©èœããŸãã
誰ããèå³ãæã£ãŠãããªããç§ã¯ããªãããããåçŸã§ãããªããžããªãæã£ãŠããŸãïŒ 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"
}
}
ãããŠã react
ã€ã³ã¹ããŒã«ãããŠããããŒã«ã«ãã§ãã¯ã¢ãŠãMyRepo/library-web-ui
ã«yarn link myUILibrary
ããŸãã
ãœãªã¥ãŒã·ã§ã³ãæçš¿ããŠãããŠããããšã@johot
3ã€ã®ãã¡5ã€ðïŒã¯ãïŒãã¹ãŠã®æãªã©ïŒïŒ
Rush + PNPMã¢ãã¬ãã§@ wasd171ãšåãçµéšã確èªã§ããŸãã æ«å®çã«~9.4.4
ã䜿çšããŸãã
Rush + PNPMãšãŸã£ããåãåé¡ãçºçããŠããŸãð
ããããŸããããã®åé¡ãåŒãèµ·ããéåžžã«æããªãšã©ãŒããããŸããïŒ
import React, { useState } from 'React';
ããã¯ãRã®EACT R EACTã®ä»£ããã«ã次ã®ããã«ãªããŸãã
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ã䜿çšããŠããŸãã æ¢ç¥ã®åé¿çã¯ãããŸããïŒ ïŒãšããã§ãããã¯ããçŽ9.0.6ã§ã¯ãªãã®ã§ãã¿ã€ãã«ãæŽæ°ããŸãããïŒ
åèãŸã§ã«ããããç§ã®çµç¹ãnpm
ããyarn
ã«ç§»è¡ããããšã決å®ããçç±ã®1ã€
ããã¯ä»ãã®ãã©ã³ã¹ãã€ã«ãããã¢ãžã¥ãŒã«ãç§ã«ã¯æ©èœããŸããã
ã¡ãªã¿ã«ã next-transpile-modules
ãšnpm
ã䜿çšããŠãããšãã«ãã®åé¡ãçºçããå Žåã¯ãåé¡ãšèãããã解決çã説æããFAQã»ã¯ã·ã§ã³ãäœæããŸããïŒ https ïŒ
ãããžã§ã¯ãã«ãŒãã«yarnã®ããŒãžã§ã³è§£å床ãæåã§è¿œå ããããšã§ãããã解決ããããšãã§ããŸããã ãããã£ãŠããã¹ãŠã®åå¿äŸåé¢ä¿ãã«ãŒãpackage.json
ã«ç§»åãã代ããã«ã次ã®è¡ãè¿œå ããŸããã
"resolutions": {
"react": "16.13.1",
"react-dom": "16.13.1"
}
åç §ïŒ https ïŒ
ç§ã®å ŽåãããŒã«ã«ãã«ããæ©èœããã®ã«å¯Ÿãã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ã«éåžžã®äŸåé¢ä¿ã§ã¯ãªããpeerDependencyãšããŠReactãå«ããå¿ èŠããããŸãã
ã圹ã«ç«ãŠã°å¹žãã§ãã
next.jsãããžã§ã¯ããå«ãmonorepoããããŸãã storybook
ã€ã³ã¹ããŒã«ããåŸãç¡å¹ãªããã¯åŒã³åºãã§åãåé¡ã«çŽé¢ããŸããã @aenglã®ææ¡ã«åŸã£ãŠåé¡ã解決ããŸããâ resolutions
ãã«ãŒãã¬ãã«package.json
ã«è¿œå ããŸããïŒ
"resolutions": {
"react": "^17.0.1",
"react-dom": "^17.0.1"
}
ãã ããã¯ã©ã€ã¢ã³ããšããã±ãŒãžãè¿œå ããåŸããããè¯ã解決çã«ãªããã©ããã¯ããããŸããã
æãåèã«ãªãã³ã¡ã³ã
ããã«ã¡ã¯ãã®åé¡ã«é¢ããæŽæ°ã¯ãããŸããïŒ ç§ãã¡ã¯ã¢ãã¬ããæã£ãŠããããã®æ£ç¢ºãªåé¡ã«çŽé¢ããŠããŸãã