ãã«ããŸãŒã³ã¯ãåããã¡ã€ã³ã§è€æ°ã®next.jsã¢ããªãå®è¡ã§ããåªããæ©èœã§ãããnext.jsã®ãã¹ãŠã®éšåã§åãå ¥ããããããŒã¹ãã¹ãå®çŸ©ããããšã¯ã§ããŸããã çŸåšãã¢ããªã«åå空éãä»ããããšãã§ããªããããããŸããŸãªã¢ããªã®ããŒãžã«åãååãä»ããããšã¯ã§ããŸããã
next.config.jsãã¡ã€ã«ã§basepath
ãæ§æã§ããããã«ãããã ãã®æ§æã®ãããã§ãnext.jsã®ãã¹ãŠã®éšåïŒã«ãŒã¿ãŒããªã³ã¯ãéçã¢ã»ãããªã©ïŒãããŒã¹ãã¹ãèªèããèªåçã«çæãããŠæ£ãããã¹ã«äžèŽããŸãã
1ã€ã®ä»£æ¿æ¹æ³ã¯ãå¿
èŠãªãã¹ãŠã®ããŒãžãããŒã¹ãã¹ã«äžèŽãããã©ã«ããŒã«ãã¹ãããããšã§ãã ããã¯ã«ãŒãã£ã³ã°ã«é¢ãã1ã€ã®å°ããªåé¡ã解決ããç§ã®ããŒã¹ãã¹ã®ã»ãšãã©ã1ã¬ãã«ã®ãã¹ã§ã¯ãªãããéåžžã«éãã§ãã
2çªç®ã®æ¹æ³ã¯ããªã¯ãšã¹ãã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'
}
ç§ã®æèŠã§ã¯ãããã2ã€ã®å€æ°ã«åå²ããå¿ èŠããããŸãã
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
倿°ãå
éšçã«ä¿æããããšã¯ã§ããŸããããŠãŒã¶ãŒã¯å¿
èŠãªãã®ãããæ£ç¢ºã«å®çŸ©ããå¿
èŠããããŸãã
ã¢ã»ããéšåã§ã¯ãããã2ã€ã®å€æ°ãäžç·ã«æäŸããŠãåé¡ãããŸããã
ã«ãŒãã£ã³ã°ãªã©ã«ã¯ãåå¥ã«å¿
èŠã§ãã
ãŸãã¯ãæ§æãã¡ã€ã«ã§äžç·ã«æäŸããŠãããnext.jsã³ãŒãããŒã¹ã§åå²ããããšãã§ããŸãã ãã®å ŽåãassetPrefixã¯ç§ãæããŠããæ£ããååã§ã¯ãããŸããã
å¯äœçšãšããŠãããã¯ã³ãŒãã®å€æŽãå°ãªããªããŸãã
ãããã®2ã€ã®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
äžèšã®ææ¡ã«ã€ããŠãã£ãŒãããã¯ããå¯ããã ããïŒ //github.com/zeit/next.js/issues/4998#issuecomment -414978297
@tomaswitekçŸåšã®assetPrefix
ã§äœãæ£ç¢ºã«æ©èœããªãã£ããã¯ããããŸãããããã¯ã"assetPrefix":"https://static.trulia-cdn.com/javascript"
ãããæåŸ
ã©ããã«æ©èœããŸãã
ãŸããäžè¬çã«ãåããã¡ã€ã³ã§è€æ°ã®ãŸãŒã³ïŒã¢ã€ã©ã³ããšåŒã³ãŸãïŒã䜿çšããŠãããã¢ã€ã©ã³ãéã®çžäºéçšæ§ãè€éã«ãªããããåã¢ã€ã©ã³ãã®ãbasePathingãã¯æãæµ®ãã³ãŸããã§ããã tatã«ã€ããŠããå°ã詳ãã説æããŸãã
ã€ãŸãã2ã€ã®å³¶A
ãšB
ãããããã®äž»ãªã¢ã€ãã¢ã¯ã1ã€ã®Webãµã€ããšã¯ã¹ããªãšã³ã¹ã®äžéšãšããŠå³¶ããå³¶ãžãšç§»åãããŠãŒã¶ãŒã®éææ§ã§ãã ãããã£ãŠãå³¶ã®éã«ã¯ãªã³ã¯ãããã¯ãã§ãã æ¬¡ã«ãå±éã®åé¡ãšã¢ããªã±ãŒã·ã§ã³ã®åé¡ããããŸãã
å±éã®æžå¿µãšã¢ããªã±ãŒã·ã§ã³ã®æžå¿µâã¢ããªã±ãŒã·ã§ã³ã¯ã©ãã«å±éã§ããããããããçä¿¡httpèŠæ±ãåŠçããæ¹æ³ãç¥ã£ãŠããã ãã§ãâå¿çã§ããã«ãŒããèšå®ããŸããã
ã©ããã«ãããã€ãããå Žåâç°ãªããã¡ã€ã³ãç°ãªãããŒãã§ããå¯èœæ§ããããçè«çã«ã¯ç°ãªãbasePathã§ããå¯èœæ§ãããããããã·ãŸãã¯ãã®ä»ã®ææ®µãä»ããŠã¢ããªã«å¯ŸããŠééçã«ãªããŸãã
ã¢ã€ã©ã³ãéã®ã¯ãã¹ãªã³ã¯âã¢ã€ã©ã³ãã®ç²Ÿç¥ãåå¥ã®å±éå¯èœãªãšã³ãã£ãã£ãšããŠç¶æããããã«ãç°ãªãã¢ã€ã©ã³ãéã§å
éšå®è£
ã®ç¥èãæŒæŽ©ããããšã¯ãããŸããã
ãããã£ãŠãå³¶ããäºãã®ããŒãžãåç
§ããããã®æè¯ã®æ¹æ³ã¯ãä»ã®å³¶ãæ¶è²»ããããã«å©çšå¯èœãªã«ãŒãããšã¯ã¹ããŒãããããšã§ãïŒ_ãããŠnextjsã®äžçã§ã¯ãã«ã¹ã¿ã ã®<IslandALink>
çš®é¡ã®ã³ã³ããŒãã³ãã奜ãŸããããã§ã仿¹_ïŒã
ãããŸã§ã®ãšãããããã¯ãã¹ãŠç°¡åã§ãããã¹ãŠã®å³¶ã¯åããã¡ã€ã³ãå
±æãã絶察ãã¹ã®ã»ããïŒ /path1
ã path2
ãªã©ïŒãæã£ãŠãããšæ³å®ããŠããŸãã ããããã°ã2çªç®ã®å³¶ã¯ãã®ãã¹ã®ãªã¹ããã€ã³ããŒãããå®å®ããããã«ããã«äŸåããŸãã åæã«ãåã¢ã€ã©ã³ããäžäœäºææ§ãç¶æããããã®æå°éã®èŠä»¶ã§ãïŒãšã«ããWebã§ã¯è¯ãããšã§ãïŒ:)
ãããã€ã¡ã³ãåºæã®basePathã远å ãããšãã·ã¹ãã å šäœã®è€éããèªåçã«å¢å ããŸããåã¢ã€ã©ã³ãã¯ãç¬èªã®ãããã€ã¡ã³ãbasePathãèªèããŠããïŒãããŠããããæç€ºããŠããïŒå¿ èŠããããŸããïŒ ããã§ã¯ãçŸåšã®åäœãšã©ã®ããã«éãã®ã§ããããã ãŸãã¯ãã¢ã€ã©ã³ãAã¯ãã®å±éãã¹ã«ãšããããªãå¿ èŠããããŸããïŒ ããã§ã¯ãå³¶Bã¯ãå³¶Aãèªåèªèº«ã«ã€ããŠç¥ã£ãŠããããšããç¥ããªãã®ã§ãå±éãããå³¶Aãã©ã®ããã«èŠã€ããã®ã§ããããã ãŸãã¯ããããã€ããããã¹ãŠã®ã¢ã€ã©ã³ãã®basePathãä»ã®ãã¹ãŠã®ã¢ã€ã©ã³ãã«æäŸããå¿ èŠããããŸããïŒ ãããŠãç©äºãå±éããçŸä»£çãªæ¹æ³ã§ã¯ãæ°ããå³¶ã远å ããå¿ èŠããããšãã«ãã¹ãŠã®å³¶ãåå±éããããšãæå³ããŸãã
ãããšããç©èªã®ãã®éšåãã©ã®ããã«æ³åããŸãããïŒ
ããããšãããããŸããã
^ããã¯æã®ã³ãŒããŒã®åã«æžãããã®ã§ãããã®ããããã®éšåã«ã€ããŠãã£ãšéŠå°Ÿäžè²«ãã説æãå¿ èŠãªå Žåã¯ç§ã«ç¥ãããŠãã ããã :)
ãŸããç§ã®åé¡ã確èªããããã«æéãå²ããŠãã ãã£ãçããã«æè¬ããŸãã
@timneutkensã¯ãassetPrefix
ã¯basePath
ãããåªå
ãããŸããããã¯ãæåã«èª¬æãããšããã§ãã 倿Žããå¿
èŠã®ãããã¡ã€ã«ã®æ°ã確èªããåŸã2çªç®ã®æ¹æ³ã®æ¹ãã¯ãªãŒã³ã ãšæããŸããã ãã ããæåã®ãœãªã¥ãŒã·ã§ã³ã«ããŒã«ããã¯ããŸãã ãããå®å
šã«åé¢ããŠãããããŸã£ããåé¡ãããŸããã ç§ã¯ãã 倧声ã§èããŠããŸããã
ããªãã®è©³çްãªçãã®ããã®@alexindigoThx ã ããªãã®è³ªåã«çããŠã¿ãŸãããð
çŸåšã®assetPrefixã§äœãããŸããããªãã£ãã®ãããããªã
ããã§2ã€ã®åé¡ããããŸãã
assetPrefix
ã®çŸåšã®å®è£
ã§ã¯ããããã·ã«ãŒãã£ã³ã°ãéçãã¡ã€ã«ãªã©ãããã«èª¿æŽããå¿
èŠããããŸãã basePath
å°å
¥ããããšã§ããã®èª¿æŽãæžããããšãã§ããŸãã @timneutkensããã§ã«è¿°ã¹ãããã«ã basePath
ãæäŸããå¿
èŠããªããããäœããã¬ãŒããããããè€éããå¢ãããšã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ã©ãã«ãããã€ã§ãããããããŸãã
ãã¡ãããããã§ãåãç®æšããããŸãã çŸåšã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãassetPrefixesãåçã«å®çŸ©ããŠããŸãã ãããã·ã«ãããªã¯ãšã¹ãããããŒãä»ããŠæäŸãããŸãã
ããã§ã¯ãçŸåšã®åäœãšã©ã®ããã«éãã®ã§ããããã
ã«ãŒã¿ãŒã¯contextPathãèªèããã«ã¹ã¿ã ã³ãŒãã®éãæžãããŸãã
åã¢ã€ã©ã³ãã¯ãããèªäœã®ãããã€ã¡ã³ãbasePathãç¥ã£ãŠããïŒãããŠããããæç€ºããïŒå¿ èŠããããŸããïŒ ãŸãã¯ãã¢ã€ã©ã³ãAã¯ãã®å±éãã¹ã«ãšããããªãå¿ èŠããããŸããïŒ
ããã§ããå¿ èŠã¯ãããŸããã éçºè ã¯ããã§èªç±ãæã€ã¹ãã§ãã AssetPrefixãšåãæ¹æ³ã§basePathãåçã«æäŸã§ããã¯ãã§ãã
ããã§ã¯ãå³¶Bã¯ãå³¶Aãèªåèªèº«ã«ã€ããŠç¥ã£ãŠããããšããç¥ããªãã®ã§ãå±éãããå³¶Aãã©ã®ããã«èŠã€ããã®ã§ããããã ãŸãã¯ããããã€ããããã¹ãŠã®ã¢ã€ã©ã³ãã®basePathãä»ã®ãã¹ãŠã®ã¢ã€ã©ã³ãã«æäŸããå¿ èŠããããŸããïŒ ãããŠãç©äºãå±éããçŸä»£çãªæ¹æ³ã§ã¯ãæ°ããå³¶ã远å ããå¿ èŠããããšãã«ãã¹ãŠã®å³¶ãåå±éããããšãæå³ããŸãã
ãã¶ããbasePathãã«ãŒããšã¯ã¹ããŒãã«è¿œå ããããšãã§ããŸãã ç¥ããŸããã basePath倿°ããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«ãšã£ãŠéèŠã§ãããšèšã£ãŠããããã§ã¯ãããŸããã ããã¯ããªãã«ãšã£ãŠæåã®è§£æ±ºçã§ã¯ãªãããã§ãã ããããããã¯ãŸã£ããåé¡ãããŸããã éèŠãªã®ã¯ã assetPrefix
ã ãã䜿çšã§ããå³¶ã§ã¯äœãå€ãããªããšããããšã§ãã ãšã«ããç¬èªã®ã«ãŒãã£ã³ã°ãããããã§ãã ãŸãŒã³éã®ã¯ãã¹ãªã³ã¯ã¯ãç§ãã¡ã®ãããžã§ã¯ãã«ãšã£ãŠãéèŠã§ã¯ãããŸãããç§ãã¡ã®ãŸãŒã³ã¯æ¬åœã«ç¬ç«ããŠããŠãäºãã«åé¢ãããŠããŸãã
ãããŠãç©äºãå±éããçŸä»£çãªæ¹æ³ã§ã¯ãæ°ããå³¶ã远å ããå¿ èŠããããšãã«ãã¹ãŠã®å³¶ãåå±éããããšãæå³ããŸãã
çç±ãããããŸããã äžéšã®ãŸãŒã³ã«ã¯basePathããããäžéšã«ã¯ãªãããšãæ³åã§ããŸãã ãŸããäžéšã®ã¢ããªã¯ããã«ããŸãŒã³ãèšå®ãããŠããªããŠãbasePathæ§æã䜿çšããå¯èœæ§ããããŸãã
@alexindigo plsã¯ãnext.jsã«ãã£ãŠã¬ã³ããªã³ã°ããã2ã€ã®å®éã®å³¶ã®URLãæäŸããŠãå®éã®åäœã確èªã§ããŸããïŒ èŠã€ããããšããŸãããããã¡ã€ã³ã§_next
ãªã¯ãšã¹ãã®ããããŒãžãèŠã€ãããŸãã
ãã¹ãŠã®å³¶ã®æ§æã¯åãã§ããïŒ
"assetPrefix":"https://static.trulia-cdn.com/javascript"
@tomaswitek
çŸåšã®ãããžã§ã¯ãã§ã¯ãè€æ°ã®ãã¡ã€ã³ããµããã¡ã€ã³ãæäœã§ããŸããã ïŒãã¡ã€ã³å¶éãšã¯ã€ã«ãã«ãŒãSSLèšŒææžãªãïŒ
ãããããã§ããªãã¯å€å žçãªæå³ã§CDNã䜿çšããŸããããåã¢ããªããçŽæ¥ãã§ãããããã¢ã»ããã«äŸåããŸããïŒ ããã§ããã
åäžãã¡ã€ã³ã§ã®assetPrefixã®çŸåšã®å®è£ ã§ã¯ããããã·ã«ãŒãã£ã³ã°ãéçãã¡ã€ã«ãªã©ã§ããã«èª¿æŽãå¿ èŠã§ããbasePathãå°å ¥ããããšã§ããã®èª¿æŽãæžããããšãã§ããŸãã @timneutkensããã§ã«è¿°ã¹ãããã«ãbasePathãæäŸããå¿ èŠããªããããäœããã¬ãŒããããããè€éããå¢ãããšã¯ãããŸããã
ãšããã§ãããã¯ããããããã®æ©èœã远å ããªãã§ãã ãããã§ã¯ãããŸããã§ãã:)ããã¯ãã£ãšäŒŒãŠããŸããâãããããç§ãã¡ã¯ãã®ã¢ãããŒããããå šäœçã«èããããšãã§ããŸãã:)
ããã§ããå¿ èŠã¯ãããŸããã éçºè ã¯ããã§èªç±ãæã€ã¹ãã§ãã AssetPrefixãšåãæ¹æ³ã§basePathãåçã«æäŸã§ããã¯ãã§ãã
ã¯ãã ãã ããå³¶ã®éã«ãªã³ã¯ããªãå Žåã«ã®ã¿æ©èœããŸãã ãããŠããããããªãã®ãŠãŒã¹ã±ãŒã¹ã®ããã«èãããŸãã åæã«ã100ïŒ ç¬ç«ããŠããå Žåãã¹ã¿ã³ãã¢ãã³ã¢ããªã±ãŒã·ã§ã³ã®éãŸãã§ã¯ãªããäœãããããå³¶ã«ããã®ããçè§£ããã®ã«èŠåŽããŠããŸããïŒ :)
ãã¶ããbasePathãã«ãŒããšã¯ã¹ããŒãã«è¿œå ããããšãã§ããŸãã
ã«ãŒãã®ãšã¯ã¹ããŒãã¯ãã«ãæã«è¡ãããbasePathã¯ãããã€æã«å®çŸ©ãããåãã³ãŒãã¢ãŒãã£ãã¡ã¯ãïŒstageãpreprodã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ã倿Žããã«ãå€ããå°ãªããã¢ãŒãã«ããã²ãŒã·ã§ã³ãããããŸããã ãã°ã€ã³ã«ã¯ãå®å
šã«ã«ã¹ã¿ã ã®ãœãªã¥ãŒã·ã§ã³ãããããã§ãã
ãã®ã³ã¡ã³ãã§ããªãã®ãã¹ãŠã®è³ªåã«çããããšãé¡ã£ãŠããŸãð
ãšããã§ãããã¯ããããããã®æ©èœã远å ããªãã§ãã ãããã§ã¯ãããŸããã§ãã:)ããã¯ãã£ãšäŒŒãŠããŸããâãããããç§ãã¡ã¯ãã®ã¢ãããŒããããå šäœçã«èããããšãã§ããŸãã:)
確ãã«ãnext.jsã«è§Šããå¿ èŠããªã解決çãèŠã€ããã®ã¯çŽ æŽãããããšã§ãð
ã¯ãã ãã ããå³¶ã®éã«ãªã³ã¯ããªãå Žåã«ã®ã¿æ©èœããŸãã ãããŠããããããªãã®ãŠãŒã¹ã±ãŒã¹ã®ããã«èãããŸãã åæã«ã100ïŒ ç¬ç«ããŠããå Žåãã¹ã¿ã³ãã¢ãã³ã¢ããªã±ãŒã·ã§ã³ã®éãŸãã§ã¯ãªããäœãããããå³¶ã«ããã®ããçè§£ããã®ã«èŠåŽããŠããŸããïŒ :)
ç§ã¯ãå³¶ãã®è§£æ±ºçãæ¢ããŠãããšæžãããèšã£ããããããšã¯ãããŸããã @timneutkensãšãã£ãããããšãããåé¡ã«ã€ããŠèª¬æããŸãããTimã®çãã¯åºæ¬çã«next.js
ã¯ããŒã¹ãã¹ããµããŒãããŠããŸããã ãããŠå°ãã°ãŒã°ã«ããåŸãç§ã¯ãããæ¢ããŠããã®ã¯ç§ã ãã§ã¯ãªãããšã«æ°ã¥ããŸããã ã ããå°ãè²¢ç®ã§ãããšæããŸããã ãã®åŸããã£ã ã¯ç§ã«ãã£ãŒãããã¯ãäžããããã«ããªãã«pingããŸããããããŠç§ã¯ããªãã®ãã£ãŒãããã¯ã«ãšãŠãæè¬ããŠããŸãã
ã«ãŒãã®ãšã¯ã¹ããŒãã¯ãã«ãæã«è¡ãããbasePathã¯ãããã€æã«å®çŸ©ãããåãã³ãŒãã¢ãŒãã£ãã¡ã¯ãïŒstageãpreprodãprodããã¹ãç°å¢ãªã©ïŒã
ãã«ãæã«ã«ãŒãããšã¯ã¹ããŒãããŠä»ã®ã¢ã€ã©ã³ãã§äœ¿çšã§ããããã«ããå Žåãæãç°¡åãªæ¹æ³ã¯ãæ§æã§basePathãããŒãã³ãŒãã£ã³ã°ããããšã§ãã ç§ã¯ããªãã®äž»åŒµãçè§£ããŸãã å察ã«ãããã¯æ¬åœã«ãã®ãããªåé¡ã§ããïŒ ã¢ããªãç°ãªããã¡ã€ã³ãããŒãã«ãããã€ããããšããç°å¢ããšã«åãbasePathã䜿çšããããšãã§ããŸãã
ãã¯ãã@tomaswitek :)
ãbasePathãæ©èœã«é¢ããç§ã®çµéšã§ã¯ããã®è€éããéåžžã«éšããŠããã®ã§ãéåžžã¯ãç¹å®ã®åé¡ã1ã€æ±ããããšãªãããã®ãããªãã®ãå®è£
ããæ¹ãããã§ãããã
ãããããããè€æ°ã®è§åºŠããèŠãŠããŸãã ãã£ãŒãããŒãžã«ã¢ãããŒãããæ¹æ³ãšåæ§ã«ãè€æ°ã®ãŠãŒã¹ã±ãŒã¹ã®æŠèŠã説æãããããããã¹ãŠ1ã€ã®åäžã«ãããã©ããã確èªããŸãã ãã¬ãŒã ã¯ãŒã¯ã®ïŒã¡ãžã£ãŒãªïŒããŒãžã§ã³éã§äºææ§ã®ãªãæ©èœãããã®ã§ãéåžžã«é¢åã§ã:)
ã¢ããªãç°ãªããã¡ã€ã³ãããŒãã«ãããã€ããããšããç°å¢ããšã«åãbasePathã䜿çšããããšãã§ããŸãã
ãã®ãbasePathããã«ãŒãã£ã³ã°ã³ãŒãã®äžéšã§ãããœãªã¥ãŒã·ã§ã³ã§åé¡ãªãããã«æããŸããããã¯ãæåã«è¿°ã¹ããã®ã§ããããšãã°ã pages
ãã£ã¬ã¯ããªå
ã®ãµããã©ã«ããŒã®ããã«ïŒãšããã§ããã®ã¢ãããŒãã¯ãéžæããéçºè
ã«éç¥ãããŸãïŒ basePathã¯ããªãããŸããããŸãïŒã ããããããªããæ¢ããå¯äžã®ããšã¯ãã¢ã»ãã_next
å
éšnextjsãã¹ãæ§æã§ããªãããšã§ãã
ãããŠãããã¯ç§ãã¡ãããå°ãªãé·æçãªå¯äœçšã§è§£æ±ºã§ããããçãåé¡ã®ããã«èãããŸãã
ãŸããã¢ã»ããããšã«assetPathãæ§æã§ããå ŽåïŒããšãã°ãããçš®ã®next.configãããã䜿çšïŒã®ããã«ãããã«é²åããå¯èœæ§ããããŸããããã«ãããã¢ããªéã§ã¢ã»ãããå ±æã§ããããã«ãªããããã©ãŒãã³ã¹ãªã©ãåäžããŸãã
ãããŠããã®æ©èœã®ããã®ãªãŒãã³PRããããŸãã ;ïŒ/ cc @timneutkensã¯ããã®åç¬ã«æ»ãæéã®ããã§ãã :)
ãããããã«è¿œå ããäºå®ããªãå Žåã¯ããããå®è¡ããŠæ©èœããExpressããŒã¹ã®server.jsã®äŸãreadmeã«è¿œå ã§ããŸããïŒ ç§ã¯ãããã®åé¡ã«æµ®ããã§ããããã€ãã詊ããŸããããããããæ©èœãããããšãã§ããŸããã§ããã ããããšãã
ããã«ã¡ã¯@ccarseç§ã¯ãã§ã«æ¬çªç°å¢ã§äœ¿çšããŠããäœæ¥çšãã©ãŒã¯ãæã£ãŠããŸãïŒ //github.com/panter/next.js/pull/2
ãŸãããã®æ©èœã®PRãéãããã«æéãè²»ããæºåãã§ããŠããŸãã
@timneutkens @alexindigoãã®åé¡ã解決ããä»ã®æ¹æ³ã¯ãããŸããïŒ
ç§ãã¡ãå¿
èŠãšããªãå Žåã¯basePath
èšå®ããããªãã¯ãplsã¯ç§éã«äœ¿çšããŠãæå°éã®äŸäžããããšãã§ããŸãassetPath
ïŒ
ç§ã®äŒç€Ÿãããã«å察ããŠããŸãã
åŸæ¥ã®ã¢ããªãã»ã¯ã·ã§ã³ããšã«ãã£ãããšåŒãç¶ããNext.jsã«çœ®ãæããŠããŸãã
ç°¡åãªäŸãšããŠïŒ
| URL | ã¢ããª|
| --- | --- |
| example.com | ã¬ã¬ã·ãŒ|
| example.com/shop | 次ãž|
| example.com/search | ã¬ã¬ã·ãŒ|
| example.com/members | 次ãž|
ã€ãŸããåNext.jsã¢ããªå ã§ãã¹ãŠã«ãã¬ãã£ãã¯ã¹ãä»ããå¿ èŠããã
Nowã䜿çšããŠããªãããã now.json
ã«ãŒãã£ã³ã°ãå©çšã§ããªãããšã«ã泚æããŠãã ããã ãã¡ã€ã³å
šäœã®åã«ç¬èªã®ããŒããã©ã³ãµãŒãé
眮ãããµããã¹ã«åºã¥ããŠãã©ãã£ãã¯ãã«ãŒãã£ã³ã°ããŸãã
ã«ã¹ã¿ã ãµãŒããŒïŒhapiïŒã䜿çšããŠããã®ã§ãããã§äœæãããã®ãã«ã¹ã¿ã ãµãŒããŒå ã§ã掻çšã§ããã°äŸ¿å©ã§ãã
now.config.json
èšå®ã®çµã¿åãããããããšåãããšãå®çŸããããã«äœ¿çšã§ãããã€ã¯ããããã·ã®äœ¿çšããããããããŸããããæ£ããçµã¿åããã¯ãŸã ããããŸããã
Nowv2ã§ãã¹ããããŠããè€æ°ã®éçã«ãšã¯ã¹ããŒããããNext.jsã¢ããªã§åãåé¡ãçºçããŠãããšæããŸãã
| URL | ã¢ããª|
| -| -|
| example.com | 次ãž|
| example.com/dashboard | 次ãž|
äºæ³ã©ãããã«ãŒãã¢ããªã¯åé¡ãªãåäœããŸãã ãããã2çªç®ã®ãã®ã§ã¯ç©äºãããŸããããªãã çŸåšã next/link
ãã©ããããŠããŸãããããã assetPrefix
ãšçµã¿åããããšãåé¡ã®ã»ãšãã©ã解決ãããŸãã
export default ({ children, href, ...rest }) => (
<Link href={process.env.NODE_ENV === "production" ? `/dashboard${href}` : href} {...rest}>
{children}
</Link>
);
ãã ããããã¯prefetch
å£ããŸããããã¯ãééã£ãURLã§.js
ãã¡ã€ã«ãæ€çŽ¢ããããšããããã§ãã
çŸåšã®åé¿çã¯prefetch
ãç¡å¹ã«ããããšã§ãããããã¯çæ³çã§ã¯ãããŸããã
ããã®ç¶æ³ã¯ã©ãã§ããïŒ
ãŸããããã«é¢ããæŽæ°ãæ¢ããŠãã ããã
@timneutkensã³ãã¥ããã£ã«èå³ãããã°ãPRãéãããã«æéã
ããã«å¯Ÿãã解決çãå¿ èŠã§ã
ãã®ææ¡ã廿¢ããæ°ããAPIãéããªãå°å ¥ããäºå®ã§ãã
ããã圱é¿ãåããŸãã ãµããã£ã¬ã¯ããªãã¹ã®äžã§æ¬¡ã®ãããžã§ã¯ããå®è¡ããå¿ èŠããããŸãã å ¬åŒæ©èœã楜ãã¿ã«ããŠããŸãã ETAã¯ãããŸããïŒ
API
ããã§ãããã¯ã©ãã§ããïŒ ïŒD
ã¹ã¬ãããã¹ãã ããªãã§ãã ãããåé¡èªäœã«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ã§ã
@timneutkens
ææ¡ãããããã¯ãããŒã¹ãã¹ã®åé¡ãã©ã®ããã«è§£æ±ºãããã«ã€ããŠã詳现ãæããŠããã ããŸããïŒ
ãŸãã Router.push('/about')
ãããªã«ãŒã¿ãŒãªãã€ã¬ã¯ããããã¯ã«çœ®ãæããããŸããïŒ
ãæéãããã ãããããšãããããŸãð
ãªã³ã¯ããã³ã³ããŒãã³ããå¿ èŠã«ãªããããã«ãŒã¿ãŒAPIã倿ŽãããŸãã ãã®æç¹ã§ãURLèªäœã«çžå¯Ÿãã¹ã䜿çšã§ããŸãã
ãã€è§£æ±ºçãåŸãããšãã§ãããããŸãã¯å°ãªããšãããã«å¯Ÿããåé¿çã«ã€ããŠã®æŽæ°ã¯ãããŸããïŒ
æŽæ°ãæçš¿ãã代ããã«ãæåã®åé¡ã§ðã䜿çšããŸãã
@ MMT-LDããªãã®è§£æ±ºçã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãããä»ã§ã¯ãã¹ãŠã®ãªã³ã¯ã¯ãªãã¯ãŸãã¯ã«ãŒã¿ãŒããã·ã¥ã€ãã³ãã§ããŒãžããªããŒããããŸãâ¹ïž
@Zertzã®ãœãªã¥ãŒã·ã§ã³ã詊ããŸããããå®ç§ã«æ©èœããŸããã
ãŸããåºåãã¡ã€ã«ãããªãã§ããããããã¹ã«ã³ããŒããããšã§ã prefetch
åé¡ãä¿®æ£ã§ããŸããã
https://github.com/fand/MDMT/blob/master/scripts/copy-preload.js
...ããã¯æ±ãããªãã¯ã§ããããšã«ããæ©èœããŠããŸãð€ª
@nicholasbraun
ããã§ããªã³ã¯ã¯ãªãã¯ãŸãã¯ã«ãŒã¿ãŒããã·ã¥ã€ãã³ãããšã«ãããŒãžããªããŒããããŸãâ¹ïž
ç§ã¯ãã®åé¡ãæ±ããŠããŸãããããªã³ã¯ã§ãasããã©ã¡ãŒã¿ã䜿çšããŠä¿®æ£ããããããªã³ã¯ã¯å
éšãã¡ã€ã«ãæããŸããããasãã¯ãã¹ã«é¢é£ããŠããŸã
äŸãã°ïŒ
<Link href={"/${item.link}"} as={"./${item.link}"}>
@nicholasbraun
ããªãã®è§£æ±ºçã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãããä»ã§ã¯ãã¹ãŠã®ãªã³ã¯ã¯ãªãã¯ãŸãã¯ã«ãŒã¿ãŒããã·ã¥ã€ãã³ãã§ããŒãžããªããŒããããŸãâ¹ïž
ããã¯ç§ãæå³ããããšã®äžçš®ã§ãã ããã¯ã¡ã¢ãªããã§ã....ãããã以äžããå¿ èŠãªãã®ã«å°éã§ããªããšç¢ºä¿¡ããŠããŸãã
// 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 ïŒ ãŸãã
æŽæ°ïŒã«ã¹ã¿ã ã«ãŒã¿ãŒãäœæããäœããã®æ¹æ³ã§ããã©ã«ãã®ã«ãŒã¿ãŒã亀æããããšã§ãããå®è£ ã§ãããã©ãããèããŠããŸããããäžå¯èœãªããã§ããNext.jsã¯ã«ãŒã¿ãŒãããŒãã³ãŒãããŸããããšãã°ããã¡ããåç §ããŠãã ããã ãŸããã«ãŒã¿ãŒãã亀æããã ããã§ååã ãšã¯æããŸããã ãã®æ©èœã¯ãããããNext.jså šäœã§ãµããŒããããå¿ èŠããããŸãã
ãã®åé¡ã¯2017幎ããçºçããŠããŸãããåé¿çã¯ãããŸããïŒ ãŸãã¯ãbasePathãªã¯ãšã¹ããžã®å ¬åŒã®å¿çã§ããïŒ
ãããã£ãŠã https ïŒ 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ã«éããããããããªãã§ãããäžæããLink
ã³ã³ããŒãã³ãã§ã¯ãhrefã/subdir/example
ã«èšå®ããŠãããããNext.jsãpages/subdir/example.js
ããŒãžã®ãã³ãã«ããªã¯ãšã¹ãããŠããã®ãäžæè°ã§ã¯ãããŸããã
ããŠãåé¡ã®ããããªãã§ããã¯äžçã®çµããã®ããã«ã¯èãããŸãããïŒUXã¯ããªãéãã§ããïŒãç§ãã¡ã®ã¢ããªã§ã¯ãNext.js9ã®åçã«ãŒãã£ã³ã°ã䜿çšããŠããããç¶æ³ãæªåããŸãã ãã®ããã«ã¯ã 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
ãã«ããŒã®åé¡ã§ããããŸã/subdir/post/[id]
èŠæ±ããŠãããšãã«Next.jsã®ã«ãŒã¿ãŒãæ··ä¹±ãããŠããŸããã®ãããªãã¡ã€ã«ããã£ã¹ã¯äžã«ååšããªãå Žåã®
ãã®ã¹ã¬ããã«ã¯å¥ã®äŸã httpsïŒ //github.com/zeit/next.js/issues/4998#issuecomment -521189412ããããšããŠã®ã¿ãã¬ãã£ãã¯ã¹ãä»ããŸãïŒç°¡ç¥åïŒã
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
ãšããã§ã ææ¥ã¯ã¡ããã©1幎ã§ãã®å·ãéããŸããð
æ¯èŒçã¯ã€ã«ããªã¢ã€ãã¢ã®1ã€ã¯ã src/pages
ãããªããŒãžãäœæããããããé©åãªå Žæã«ã·ã³ããªãã¯ãªã³ã¯ããããšã§ãã äŸãã°ïŒ
myapp.example.com
ã«ãããã€ããã«src/pages
ãpages
ã·ã³ããªãã¯ãªã³ã¯ããŸãexample.com/myapp
ã«ãããã€ããã«src/pages
ãpages/myapp
ã·ã³ããªãã¯ãªã³ã¯ããŸãã«ã¹ã¿ã ã®<Link>
ã³ã³ããŒãã³ããšassetPrefix
ãçµã¿åããããšãæ©èœããå¯èœæ§ããããŸããã詊ãåæ°ããããŸããðã
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
basePath
ãµããŒãã«é²å±ã¯ãããŸããïŒ :)
@nicholasbraun
ããã§ããªã³ã¯ã¯ãªãã¯ãŸãã¯ã«ãŒã¿ãŒããã·ã¥ã€ãã³ãããšã«ãããŒãžãfrowning_faceããªããŒãããŸãã
ç§ã¯ãã®åé¡ãæ±ããŠããŸãããããªã³ã¯ã§ãasããã©ã¡ãŒã¿ã䜿çšããŠä¿®æ£ããããããªã³ã¯ã¯å éšãã¡ã€ã«ãæããŸããããasãã¯ãã¹ã«é¢é£ããŠããŸã
äŸãã°ïŒ
<Link href={"/${item.link}"} as={"./${item.link}"}>
ããªãã¯ç§ã®æ¥ãæã£ãïŒ :)ïŒïŒ
ç§ã¯Router.push(`/route`, `${process.env.BASE_PATH}route`);
ã§ãåãããšãããŠããŸã
@nicholasbraun
ããã§ããªã³ã¯ã¯ãªãã¯ãŸãã¯ã«ãŒã¿ãŒããã·ã¥ã€ãã³ãããšã«ãããŒãžããªããŒããããŸãâ¹ïž
ç§ã¯ãã®åé¡ãæ±ããŠããŸãããããªã³ã¯ã§ãasããã©ã¡ãŒã¿ã䜿çšããŠä¿®æ£ããããããªã³ã¯ã¯å éšãã¡ã€ã«ãæããŸããããasãã¯ãã¹ã«é¢é£ããŠããŸã
äŸãã°ïŒ
<Link href={"/${item.link}"} as={"./${item.link}"}>
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ã次ã®9ãã¡ã€ã«ããŒã¹ã®ã«ãŒãã£ã³ã°ã§ã¯æ©èœããŸããã /route/[id]
ã ${process.env.BASE_PATH}/route${id}
ã¯ãã®ãšã©ãŒãã¹ããŒ
ãã®ã³ã¡ã³ãã¯åé¡ãéåžžã«ãã説æããŠããŸãã
ç§ã¯æ°äººã®äººã ãããã§ã®è§£æ±ºçãããªãã§ãããã©ã®ããã«å£ããã«ã€ããŠè°è«ããã®ãèŠãŸãããã ç§ãã¡ã«ãšã£ãŠããã1ã€ã®éèŠãªåé¡ããããŸãã
next9ã§ã¯ã href
assetPrefixã䜿çšãããšã next
åžžã«ãµãŒããŒã«ãŒããå®è¡ããŸãã ç§ã¯ãã®å·ã§ãããèµ·ãã£ãŠããããšããã¢ããè€è£œãªããžããªãäœæããŸããã
ããã¯ããã¹ãŠã®ã«ãŒãã§åäœæããããããåºæ¬çã«Apolloã¯ã©ã€ã¢ã³ããã£ãã·ã¥ãç Žå£ããŸãã
å®è£
ã¯ãassetPrefixã®ãªãåºã«ãªãããŒãžhref
ãæ¬¡ã®ã«ãŒãhref
ïŒassetPrefixãå«ãïŒãšæ¯èŒããŠãããšæããŸã-çµæãšããŠæ·±ãã«ãŒãã«ãªããŸãã
ããšãã°ãhref /prefix/page
ïŒåºã«ãªãããŒãžã¯/page
ïŒã䜿çšããŠããŠã次ã®href
ã«ãŒãã/prefix/page/[id]
ïŒãã¬ãã£ãã¯ã¹ããªããš404ã«ãªãããïŒããã¯å®å
šã«ç°ãªãã«ãŒãã§ãããæµ
ãã«ãŒãã¯äžå¯èœã§ãã
ãšã¯ã¹ãã¬ã¹ã«ãŒãã§ãã®åã§åé¿çã調ã¹ã
äœ¿çšæ basePathã§ããhref
å°éå
·ãæã€ã³ã³ããŒãã³ãã§ã¯ãããªãã§ãããæ©èœããŠããŸããã
PLZã¯basePathãšããªãã§ããããµããŒãããŠããŸãã
ç§ã¯æ¬åœã«ããã䜿ãããšãã§ããŸããã åäžã®ãµãŒããŒãœãŒã¹ããè€æ°ã®ã¢ããªãå®è¡ããŠããŠããããããç¬èªã®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幎åŸãç§ã¯æ°ããã¢ããªã«åãçµãã§ãããæšå¹Žãšåãåé¿çãå®è¡ããå¿ èŠããããŸã...ãæ¬çªç°å¢ã«å¯Ÿå¿ãããreactfwã«ã¯ã¡ãã£ãšææ ®ãã¹ãã§ãã ããŒã¹ãã¹ã¯ããã©æ©èœã§ããå¿ èŠããããŸãã
ããã«é¢ããæŽæ°...æšå¹Žãã®é ãç§ã¯ãã®åé¡ã«ééããŸããã 1幎åŸãç§ã¯æ°ããã¢ããªã«åãçµãã§ãããæšå¹Žãšåãåé¿çãå®è¡ããå¿ èŠããããŸã...ãæ¬çªç°å¢ã«å¯Ÿå¿ãããreactfwã«ã¯ã¡ãã£ãšææ ®ãã¹ãã§ãã ããŒã¹ãã¹ã¯ããã©æ©èœã§ããå¿ èŠããããŸãã
ãããæçš¿ããŠäœãæåŸ ããŠããã®ãããããŸããã
Next.jsã¯ç§ã®ããŒã ïŒ5人ïŒã«ãã£ãŠãã«ã¿ã€ã ã§äœæ¥ãããŠãããåæã«å€ãã®æ©èœã«åãçµãã§ããŸãã æšå¹Žãç§ãã¡ã¯ãããã«åãçµã¿ãŸããïŒ
Next.jsã¢ããªã±ãŒã·ã§ã³ïŒæ°èŠããã³æ¢åïŒã广çã«å€§å¹ ã«å°ãããé«éã«ããã¹ã±ãŒã©ãã«ã«ããŸãã
æ©èœã«å¯Ÿãããè³æãã衚æãããå Žåã¯ããããå¯èœã§ãã æåã®ã¹ã¬ããã§ðæ©èœã䜿çšããŸãã
basePath
ãçµã¿èŸŒã¿æ©èœã§ããã¹ãã ãšããããšã«ã¯ééããªãåæããŸãã ããã¯ãã§ã«ããŒããããäžã«ãããç§ã¯æåã®PRãæžããŸãããããã¯ãã¹ã¬ãããèªã¿è¿ãããšã§ç¢ºèªã§ããŸãã
PRã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ãã®æ©èœã®å®çŸã«çµæžçã«è²¢ç®ãããå Žåã¯ã enterprise @ vercel.comãŸã§ãæ°è»œã«ãé£çµ¡ãã ããã
ããã®ã¹ããŒã¿ã¹ã¯äœã§ããïŒ ç§ãã¡ã¯æ¬åœã«ããã«äŸåããŠããŸãïŒ/
@Sletheren basePathã®ãµããŒãã¯çŸåšå®éšçãªãã®ã§ãããowmã®ãªã¹ã¯ã§äœ¿çšããŠãã ããã
@Sletheren basePathã®ãµããŒãã¯çŸåšå®éšçãªãã®ã§ãããèªå·±è²¬ä»»ã§äœ¿çšããŠãã ããã
cf. ïŒ9872
@martpieç§ã¯ãã§ã«ãããèŠãŸããããã®ããã«ã ç§ã®å Žåã basePath
ã¯1ã€ã ãã§ã¯ãªããè€æ°ã®basePathã«ãªãå¯èœæ§ããããŸããããã¯ãããŸããŸãªãURLããä»ããŠã¢ããªãæäŸãããã«ãæã«basePath
ãèšå®ããããšã¯ãªãã·ã§ã³ã§ã¯ãªãããã§ãïŒåäžã®æååã§ã¯ãªããã¹ã®é
åããµããŒãããããïŒ
@timneutkensæŽæ°ããŠããã ãããããšãããããŸãã å¥ã®ã¢ããããŒããæäŸããŠããã ããŸãããã ããã¯ç§ãã¡ã«ãšã£ãŠéèŠãªæ©èœã§ãããç¥ãå¿ èŠããããŸã...
ããã¯äŒæ¥ã®ã¿ã«ãªããŸããïŒäŒæ¥ã®å¶æ¥ã«é£çµ¡ããããšãžã®èšåã¯ãããããã®èç«ã¡ãåŒãèµ·ãããŸããïŒïŒ
PRã«ãããšãããŒããããäžã«ããããã§ãããäºåºŠãšåé€ãããããšã¯ãããŸããã äžèªç±ãªãªãŒãã³ãœãŒã¹ããŒãžã§ã³ããã©ã³ãã ãªå¶æ¥æ åœè ãšä»»æã®äŸ¡æ Œã«ã€ããŠæ°é±é亀æžããåŸãå®å šã«ãµããŒããããå¥ã®ããŒãžã§ã³ãªã©ãä»åŸæ°ãæã§é©ããæããããšãªãããã®æ©èœãä»ããæ§ç¯ããŠãå®å šãã©ããã瀺ãããšãã§ããŸããïŒ
çããã¯å€ãã®æ©èœã«åãçµãã§ããã誰ããåªå
é äœãæã£ãŠããããšãçè§£ããŠããŸãããããã«å°ããªã»ããã¢ããã§ããããã·ããå¿
èŠããããŸããæ¬¡ã«ãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ãããµãŒãã¹ããšã«å°çšã®basePath
å²ãåœãŠãŸãã Nextã§è€æ°ã®ãµãŒãã¹ã®æ§ç¯ãéå§ããåã«ããã®æ©èœãå®å
šãªãªãŒãã³ãœãŒã¹ãšããŠå©çšå¯èœã«ãªãå¯èœæ§ãç¥ãå¿
èŠããããŸãã ããã§ãªããã°ãNextã«ããã«æéãæè³ããã®ã¯ãªã¹ã¯ãé«ãããŸãã
ãçè§£ãšãæèŠããå¯ãããã ãããããšãããããŸãã
FWIWãç§ã¯ãããæ©èœããããã«ãªããŸããããããŠä»ã®äººã®ããã«ïŒ
ãããnext.config.js
å
¥ããŠãã ããïŒ
module.exports = {
experimental: {
basePath: '/custom',
},
}
次ã«ããµãŒããŒãåèµ·åããWebãµãŒããŒããã«ãŠã§ã¢ãé©åã«ã»ããã¢ããããå¿ èŠããããŸããã
ã«ã¹ã¿ã ãã¹ãä»ããŠãã¹ãŠã®ãªã¯ãšã¹ãããã£ããããŸãã 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ããªãã¯ç§ã®æçš¿ã誀解ããŠãããšæããŸãã
çŸåšã®ãšãããããšã³ã¿ãŒãã©ã€ãºNext.jsããŒãžã§ã³ãã¯ãããŸããã ç§ã¯ãå€éšäŒæ¥ããã®ãããªæ©èœãããçãæéã§æ§ç¯ããããã®ã³ã³ãµã«ãã£ã³ã°ã«ãéãæãããã«æãå·®ã䌞ã¹ãå€ãã®æ©äŒã«ã€ããŠèšåããŠããŸããã ããšãã°ããŸãŒã³ã®ãµããŒãã¯Truliaãšå ±åã§æ§ç¯ãããŸããã
ãã®æ©èœã¯ãŸã äœæ¥äžã§ãããããŒããããäžã«ãããŸãã Next.jsã®ãšã³ã¿ãŒãã©ã€ãºããŒãžã§ã³ã¯ãªããšèšã£ãããã«ãäœæ¥äžã®ãã¹ãŠã®æ©èœã¯ãªãŒãã³ãœãŒã¹ã§ãã ç§ã¯é£çµ¡ãåŒã³ããããã£ãŠããªãããã©ãæã ã¯ããŒããããäžã§ã€ã³ãã¯ãã®ããäœåã®è€æ°ã®åªå é äœãæã£ãŠãã[email protected]ãããªãã¯Next.js.ã®ãšã³ã¿ãŒãã©ã€ãºãµããŒããè°è«ãããšãã/å¯èœãªéãããã®æ©èœãå¿ èŠãªå Žå
@timneutkens txã¯ãè¿
éãªå¯Ÿå¿ãšçŽ æŽããã察å¿ãæäŸããŸãã æ¬¡ã«ããã¹ãŠãå
¥åã§ããŸã:)
ãããããããçµæãåºãç¶ããŠãã ããïŒ
ããŒã¹ãã¹ã®ãµããŒãã¯çŸåšnext@canary
ãããå®éšçãªãã®ã§ã¯ãããŸããã ãŸããªãå®å®ãããã£ã³ãã«ã«ãªããŸãã
ç§ã¯ããã«ããªãé
ããŠããŸããããããæåã§åŠçãã代ããã«ãå®éã®HTML <base>
ã䜿çšããããšãæ€èšããŸãããïŒ
ããŒã¹ãã¹ã®ãµããŒãã¯çŸåš
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)
ããŒã¯ããŠã³ã§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ãšãããã¬ãã£ãã¯ã¹ãä»ããã¢ã»ããã䜿çšããããã®æ¬¡åã®ãœãªã¥ãŒã·ã§ã³ã§ãã _app.tsx
ã«<CSSVariables>
ã³ã³ããŒãã³ããäœæãã€ã³ããŒãã远å ããŸããããã«ãããCSS倿°ãå«ãã°ããŒãã«ãªã€ã³ã©ã€ã³<style>
èŠçŽ ãæ¿å
¥ãããã¹ã¿ã€ã«ã·ãŒãå
šäœã§äœ¿çšã§ããããã«ãªããŸãã
ããšãã°ã <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 ïŒ
ãã®æ©èœã®å®çŸã«çµæžçã«è²¢ç®ãããå Žåã¯ã enterprise @ vercel.comãŸã§ãæ°è»œã«ãé£çµ¡ãã ããã