ãã®ãããžã§ã¯ãã¯çŽ æŽãããèŠããŸãã ç§ã¯æ°ãããããžã§ã¯ããäœæããã€ããã§ãnext.jsãcreate-react-appãããã³razzleã®éã§ãã©ã®ãããªã¡ãªãããããã®ãââããŸãã¯é·æçã«ã¯äœãæåã§ããã®ããèããŠããŸããã ç§ã¯æ¬åœã«SSRã欲ããã®ã§ãCRAã¯ããããåé¡å€ã§ãã nextã§ã¢ããªãäœæãããã®ãããžã§ã¯ããçºèŠããŸããã ããŸãããã°ãããã¯ãããå°ããã®ã«è¯ãå Žæã§ãããé·æçã«äœãæåãã«ã€ããŠããã€ãã®èããåŸãããšæã£ãŠããŸããã
æ£è§£ã¯ãããã¯ããªããšããªãã®æ°ãããããžã§ã¯ãã®ããŒãºã«äŸåãããšããããšã§ã誰ããåæãããšæããŸãã
ç§ã®ç¥ãéããNext.jsã¯ãZEITãšã³ã·ã¹ãã ã®äžéšãšããŠãªãã·ã§ã³ã§äœ¿çšã§ããå®å šãªãã¬ãŒã ã¯ãŒã¯ã§ããïŒ ãŸãã¯ãã©ãããã©ãŒã ïŒ äžæ¹ãã©ãºã«ã¯ã¯ããã«ãããã«ã§ãã ãããã£ãŠãå¿ èŠã®ãªãæ©èœã¯å«ãŸããŠããŸããããå¿ èŠã«ãªãå¯èœæ§ã®ããæ©èœããæçµçã«å¿ èŠã«ãªãå¯èœæ§ã®ããæ©èœãå«ãŸããŠããªãããšãäºå®ã§ãã
ç§ã以åã«Next.jsã䜿çšããããšãæ€èšããŸããããç§ãèç«ãããããã€ãã®å°ããªè©³çŽ°ããããŸããã ããšãã°ãNext.jsã¯HTMLåºåãé©åã«çž®å°ããŸããïŒããã¯ããã»ã©éèŠã§ã¯ãªãããšã¯ããã£ãŠããŸãããããã¯ç§ã«ãšã£ãŠã¯å€§ããªåé¡ã§ããïŒã ãŸããstyled-jsxãšCSS-in-JSã䜿çšããŸãããç§ã¯StyledComponentsã奜ã¿ãŸãã ããã«ãæ°ãããããžã§ã¯ãã§ã¯ãã«ãŒãã£ã³ã°ã¯å¿ èŠãããŸããã§ããïŒãŸã ðïŒã
æåŸã«ããããŠå¹žéãªããšã«ãããããã®ãµã³ãã«ãããžã§ã¯ãããã¹ãããåŸãç§ã¯RazzleãèŠã€ããŠäœ¿çšããããšã«ãªããŸããã å®éãç§ã¯å¿ èŠãªããã€ãã®ã¢ãžã¥ãŒã«ãšæ©èœãå«ãRazzle Material UI StyledExampleãšãããµã³ãã«ãããžã§ã¯ãã®äœæããå§ããŸããã ããã§ãã»ãšãã©æ¥ç¥ããã«æ°ãããããžã§ã¯ãã«åãçµãããšãã§ããŸãã åãæ©èœãŸãã¯ãããã®ããã€ããå¿ èŠãªå Žåã¯ãåè¿°ã®ãªããžããªãèªç±ã«äœ¿çšããŠãã ããã
ããããšã@knipferrc
åæ§ã®çµéšãããRazzleãäœæããããšã«ãªããŸããã
çŽ6ãæåãNext.jsããªãªãŒã¹ãããçŽåŸã«å·šå€§ãªã¢ããªãèµ·åããŸãããããã£ãŒã³ã倧ããããŠåŠçã§ããŸããã§ããã ãã©ã¡ãŒã¿åãããã«ãŒãã£ã³ã°ã®äŸïŒã€ãŸãã /user/:id
ïŒã®PRãæåéãæåºããŸããã ã«ãŒãå€æŽæã«getInitialPropsãèµ·åããããšã«é¢é£ããå¥åŠãªãã°ãåå ã§ã1é±éã®äœæ¥ã倱ã£ãããšãèŠããŠããŸãã çµå±ã®ãšãããNext.jsã¯å€ãã®éåžžã«éèŠãªæ±ºå®ãäžããŸãïŒã€ãŸããã«ãŒãã£ã³ã°ãããŒã¿ãã§ããããã©ã«ããŒæ§é ãããã³ã¹ã¿ã€ã«èšå®ïŒã ããããè¯ããæªããã¯ãæ§ç¯ããŠããã¢ããªã±ãŒã·ã§ã³ã®çš®é¡ã«å®å
šã«äŸåããŸãã çµå±ã®ãšãããå®éã«ã¯ãã¹ãŠã®ã«ãŒãããµãŒããŒã¬ã³ããªã³ã°ããå¿
èŠã¯ãªãïŒ2ã€ã ãïŒãããŒãžå
šäœããªããŒããã代ããã«ã¯ã©ã€ã¢ã³ãã®ããŒãç¶æ
ãå¿
èŠã§ãããã«ãŒãå€æŽã®éã«ã°ããŒãã«ç¶æ
ããªãŒãç Žæ£ããããããŸããã§ããã ããã¯ãReact-Router 4ãã¹ã©ã€ã¹ããããã³ä»¥æ¥ã®æè¯ã®ãã®ã§ãããšããç§ã®æèŠãšçžãŸã£ãŠãNext.jsããããžã§ã¯ãã«é©åã§ã¯ãªãã£ãããšãæå³ããŸããã
ãã£ãšå®å®ãããã®ãæ¢ããŠãNYTã®kytãããžã§ã¯ãã«ç§»ããŸããã ããã¯çŽ2ãæéã¯ååã§ãããã1ïŒã¢ããªãæé·ããã«ã€ããŠãã«ãæéããã¡ããã¡ãé
ããªãïŒ> 45ç§ïŒã2ïŒkytã®SCSSã«ãŒã«ããããžã§ã¯ãã«é©åã§ã¯ãªãã£ãã3ïŒkytã®ãã°ãèŠã€ãããŸããïŒéåžžã«å€ãã®çµµæåïŒããªãè¿·æã§ãã ããã§ãç§ã¯kytã®ããèããããé«éãªä»£æ¿åã«åãçµã¿å§ããããšã«ããŸãããããŠãããŒãµã«HMRãšNext.jsãšåæ§ã®æ§æAPIïŒããã°create-react-app-ssr
ïŒã䜿çšããŸããã
ãã¹ãŠãèªãããŠå®äºãããšããã¬ãŒã ã¯ãŒã¯ã«ã»ãšãã©äŸåããªããã«ãã·ã¹ãã ãäœæãããã®ã¬ãã«ã®æœè±¡åããããžã§ã¯ãã®ããŒãºã«ããé©ããŠããããšã«æ°ä»ããŸããã ããã¬ãŒã ã¯ãŒã¯ã«ãšããããªãããšã¯ãRazzleãAngularãVueãRaxãPreactãInfernoãReact-XPãRN-WebãReason-ReactããããŠ_ç§ã«ãšã£ãŠæãéèŠãªããš_ã次ã«æ¥ããã®ã¯äœã§ã100ïŒ åäœããããšãæå³ããŸãã ç§èŠãé©å¿æ§ã¯ãRazzleãšç§ãèŠãä»ã®ã»ãšãã©ãã¹ãŠãšã®éã®éèŠãªå·®å¥åèŠå ã§ãã Razzleã䜿çšãããšãããã°æçš¿ã§äœãã«ã€ããŠèªãã ãããã©ãŒã¯ãäœæããããbabel-transform / webpack config / parallel build systemãè¿œå ãããããŠãããããšãè©ŠããŠã¿ãããšãã§ããŸãã ãªãã§ïŒ Nextãšã¯ç°ãªããRazzleã¯ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããCRAãšã¯ç°ãªããRazzleã䜿çšãããšãåºç€ãšãªãæ§æããã©ãŒã¯ããã«æ¡åŒµã§ããŸãã ããã¯ç§ãåŠã³ãæããå®éšããããžãã¹ãè¡ãæ¹æ³ã«ãšã£ãŠéåžžã«å€§ããªãã®ã§ãã
Razzleã®æè»æ§ãšäžå¯ç¥è«ã¯ãç§ãšç§ã®ããŒã ã«ãã§ã«å ±ãããŠããŸãã
razzle.config.js
ã®10è¡æªæºã®ã³ãŒããå€æŽããããšã§ãã¢ããªãéšåãããŒãã100ïŒ
TypeScriptã«æ®µéçã«ç§»åããŸãããã©ãºã«ã®æªæ¥ãã 2æ¥åããCRAã«SSRãµããŒããè¿œå ãããã¯ãReactCoreããŒã ã®ããŒããããã®äžäœ15ã®ToDoãšããŠèšåãããŸããã SSRãµããŒããCRAã«è¿œå ãããå ŽåãRazzleã¯ãã¯ãååšããå¿ èŠããªããããããŸãã..._ãããŠç§ã¯ããã§å®å šã«ã¯ãŒã«ã§ã_ã ãããèµ·ãããŸã§ãRazzleã¯ãµãŒããŒã¬ã³ããªã³ã°ããããŠãããŒãµã«JavaScriptçšã®ãã¬ãŒã ã¯ãŒã¯ã«ãšããããªããã«ãããŒã«ãšããŠåé²ããŸãã
ããïŒïŒ çŽ æŽãããè¿ä¿¡ãããããšãããããŸããã
ããã«ã¡ã¯JaredãRazzleã䜿çšããŠSPAAngularãããžã§ã¯ããSSRã«å€æããæ¹æ³ãããããããŸããã
ãã®æ¹æ³ã«ã€ããŠã®ãã³ããã¬ã€ããæããŠãã ããã ã©ããããããšãã
RazzleAngularãœãªã¥ãŒã·ã§ã³ã®å Žåã¯+1ã https://github.com/jaredpalmer/razzle/issues/1109
æãåèã«ãªãã³ã¡ã³ã
ããããšã@knipferrc
åæ§ã®çµéšãããRazzleãäœæããããšã«ãªããŸããã
çŽ6ãæåãNext.jsããªãªãŒã¹ãããçŽåŸã«å·šå€§ãªã¢ããªãèµ·åããŸãããããã£ãŒã³ã倧ããããŠåŠçã§ããŸããã§ããã ãã©ã¡ãŒã¿åãããã«ãŒãã£ã³ã°ã®äŸïŒã€ãŸãã
/user/:id
ïŒã®PRãæåéãæåºããŸããã ã«ãŒãå€æŽæã«getInitialPropsãèµ·åããããšã«é¢é£ããå¥åŠãªãã°ãåå ã§ã1é±éã®äœæ¥ã倱ã£ãããšãèŠããŠããŸãã çµå±ã®ãšãããNext.jsã¯å€ãã®éåžžã«éèŠãªæ±ºå®ãäžããŸãïŒã€ãŸããã«ãŒãã£ã³ã°ãããŒã¿ãã§ããããã©ã«ããŒæ§é ãããã³ã¹ã¿ã€ã«èšå®ïŒã ããããè¯ããæªããã¯ãæ§ç¯ããŠããã¢ããªã±ãŒã·ã§ã³ã®çš®é¡ã«å®å šã«äŸåããŸãã çµå±ã®ãšãããå®éã«ã¯ãã¹ãŠã®ã«ãŒãããµãŒããŒã¬ã³ããªã³ã°ããå¿ èŠã¯ãªãïŒ2ã€ã ãïŒãããŒãžå šäœããªããŒããã代ããã«ã¯ã©ã€ã¢ã³ãã®ããŒãç¶æ ãå¿ èŠã§ãããã«ãŒãå€æŽã®éã«ã°ããŒãã«ç¶æ ããªãŒãç Žæ£ããããããŸããã§ããã ããã¯ãReact-Router 4ãã¹ã©ã€ã¹ããããã³ä»¥æ¥ã®æè¯ã®ãã®ã§ãããšããç§ã®æèŠãšçžãŸã£ãŠãNext.jsããããžã§ã¯ãã«é©åã§ã¯ãªãã£ãããšãæå³ããŸããããã£ãšå®å®ãããã®ãæ¢ããŠãNYTã®kytãããžã§ã¯ãã«ç§»ããŸããã ããã¯çŽ2ãæéã¯ååã§ãããã1ïŒã¢ããªãæé·ããã«ã€ããŠãã«ãæéããã¡ããã¡ãé ããªãïŒ> 45ç§ïŒã2ïŒkytã®SCSSã«ãŒã«ããããžã§ã¯ãã«é©åã§ã¯ãªãã£ãã3ïŒkytã®ãã°ãèŠã€ãããŸããïŒéåžžã«å€ãã®çµµæåïŒããªãè¿·æã§ãã ããã§ãç§ã¯kytã®ããèããããé«éãªä»£æ¿åã«åãçµã¿å§ããããšã«ããŸãããããŠãããŒãµã«HMRãšNext.jsãšåæ§ã®æ§æAPIïŒããã°
create-react-app-ssr
ïŒã䜿çšããŸããããã¹ãŠãèªãããŠå®äºãããšããã¬ãŒã ã¯ãŒã¯ã«ã»ãšãã©äŸåããªããã«ãã·ã¹ãã ãäœæãããã®ã¬ãã«ã®æœè±¡åããããžã§ã¯ãã®ããŒãºã«ããé©ããŠããããšã«æ°ä»ããŸããã ããã¬ãŒã ã¯ãŒã¯ã«ãšããããªãããšã¯ãRazzleãAngularãVueãRaxãPreactãInfernoãReact-XPãRN-WebãReason-ReactããããŠ_ç§ã«ãšã£ãŠæãéèŠãªããš_ã次ã«æ¥ããã®ã¯äœã§ã100ïŒ åäœããããšãæå³ããŸãã ç§èŠãé©å¿æ§ã¯ãRazzleãšç§ãèŠãä»ã®ã»ãšãã©ãã¹ãŠãšã®éã®éèŠãªå·®å¥åèŠå ã§ãã Razzleã䜿çšãããšãããã°æçš¿ã§äœãã«ã€ããŠèªãã ãããã©ãŒã¯ãäœæããããbabel-transform / webpack config / parallel build systemãè¿œå ãããããŠãããããšãè©ŠããŠã¿ãããšãã§ããŸãã ãªãã§ïŒ Nextãšã¯ç°ãªããRazzleã¯ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããCRAãšã¯ç°ãªããRazzleã䜿çšãããšãåºç€ãšãªãæ§æããã©ãŒã¯ããã«æ¡åŒµã§ããŸãã ããã¯ç§ãåŠã³ãæããå®éšããããžãã¹ãè¡ãæ¹æ³ã«ãšã£ãŠéåžžã«å€§ããªãã®ã§ãã
Razzleã®æè»æ§ãšäžå¯ç¥è«ã¯ãç§ãšç§ã®ããŒã ã«ãã§ã«å ±ãããŠããŸãã
razzle.config.js
ã®10è¡æªæºã®ã³ãŒããå€æŽããããšã§ãã¢ããªãéšåãããŒãã100ïŒ TypeScriptã«æ®µéçã«ç§»åããŸãããã©ãºã«ã®æªæ¥ãã 2æ¥åããCRAã«SSRãµããŒããè¿œå ãããã¯ãReactCoreããŒã ã®ããŒããããã®äžäœ15ã®ToDoãšããŠèšåãããŸããã SSRãµããŒããCRAã«è¿œå ãããå ŽåãRazzleã¯ãã¯ãååšããå¿ èŠããªããããããŸãã..._ãããŠç§ã¯ããã§å®å šã«ã¯ãŒã«ã§ã_ã ãããèµ·ãããŸã§ãRazzleã¯ãµãŒããŒã¬ã³ããªã³ã°ããããŠãããŒãµã«JavaScriptçšã®ãã¬ãŒã ã¯ãŒã¯ã«ãšããããªããã«ãããŒã«ãšããŠåé²ããŸãã