SPAã«ãããç¶æ 管ç:颿°åã®ã¢ãããŒããåãå ¥ããããã³ããšã³ãç³»ã¢ãŒããã¯ãã£ã®å€é·
颿°åã®ã¢ãããŒããåãå ¥ããããã³ããšã³ãç³»ã¢ãŒããã¯ãã£ã®å€é·ã«ã€ããŠè§£èª¬ããŸãã
ããã«ã¡ã¯ãå°æïŒ@koba04ïŒã§ãã
æ¬èšäºã§ã¯ãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒä»¥äžãSPAïŒã«ãããç¶æ
管çã«ã€ããŠè§£èª¬ããŸãã
GmailãTwitterã¯ãSPAãšããŠæ§ç¯ãããŠãã代衚çãªWebã¢ããªã±ãŒã·ã§ã³ã§ãããã¹ã ãŒãºãªããŒãžé·ç§»ãSPAã«ãã£ãŠå®çŸããŠããŸãããŸãElectronãPWAïŒProgressive Web AppsïŒã®ç»å Žã«ãããè€éãªã¢ããªã±ãŒã·ã§ã³ãWebã®æè¡ã䜿ã£ãŠæ§ç¯ããå Žé¢ãå¢ããŠããŸããã
ãããã®è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠã¯ãæ¢åã®ããŒãžåäœã§ã®ç¶æ 管çã®èãæ¹ã§ã¯å¯Ÿå¿ãé£ãããªããŸãã
ããã§ä»åã¯ãå ·äœçãªãã¬ãŒã ã¯ãŒã¯ãåãäžããªãããWebããã³ããšã³ãã«ãããç¶æ 管çã®ã¢ãããŒãã«ã€ããŠç޹ä»ããŸãã
- ããã³ããšã³ãã§ã®ç¶æ 管çã®è€éå
- ã¢ãã«ãšãã¥ãŒã«ããåŠçã®åå²
- åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ãçšããå¹ççãªããŒã¿æŽæ°
- Fluxã«ããäžæ¹åãªããŒã¿ã®æµã
- åäžã¹ãã¢ãšäžå€æ§ã«ããäºæž¬å¯èœãªç¶æ 管ç
- ããžãã¯ããç¶æ ãåãé¢ããäžçãå¯èœã«ããDX
- ãŸãšã
ããã³ããšã³ãã§ã®ç¶æ 管çã®è€éå
SPAïŒã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒã¯ãWikipediaã®ãSingle-page applicationãã§äžèšã®ããã«ç޹ä»ãããŠããŸãã
A single-page application (SPA) is a web application or web site that interacts with the user by dynamically rewriting the current page rather than loading entire new pages from a server.
ã€ãŸããæ°ããããŒãžã«ç§»åããéããµãŒãããããŒãžãåèªã¿èŸŒã¿ããã®ã§ã¯ãªããJavaScriptã䜿ã£ãŠåçã«ããŒãžãæžãæããã¢ããªã±ãŒã·ã§ã³ãæããŸãã
ãã®ããããã¿ã³ã®ã¯ãªãã¯ãããã¹ãå ¥åãªã©ã®ã€ãã³ãã«å¯Ÿããéšåçãªç»é¢æŽæ°ã ãã§ãªãããããŸã§ãµãŒããŒãµã€ããæ ã£ãŠããããŒãžã³ã³ãã³ãã®çæããJavaScriptäžã§è¡ãå¿ èŠããããŸãããã®åããµãŒããŒåŽã¯ã¹ããŒãã¬ã¹ã§ã·ã³ãã«ã«ãªããŸãããããã³ããšã³ãã§ã¯ããŸããŸãªè¡šç€ºã®æŽæ°åŠçãå®è£ ããå¿ èŠããããŸãã
URLã®åãæ¿ãããããŒãžå±¥æŽã®ç®¡çã«ã€ããŠã¯ãHistory APIã䜿ããŸãã
SPAã§ã¯ããŒãžé·ç§»æã«ããŒãžå šäœã®åèªã¿èŸŒã¿ãçºçããªããããã·ãŒã ã¬ã¹ãªããŒãžé·ç§»ãå¯èœã§ããã·ãŒã ã¬ã¹ãªããŒãžé·ç§»ã«ã€ããŠã¯ãPortalsãšããæ°ããHTMLèŠçŽ ã®ææ¡ãããããã¡ããæ³šç®ã§ãã
portals/explainer.md at master · WICG/portals · GitHub
ããŒãžã®åäœãè¶ ããç¶æ ã®ä¿æ
SPAã®å ŽåãäžåºŠãµãŒãããããŒãžãèªã¿èŸŒãŸããåŸã¯ãJavaScriptã䜿ã£ãŠå¿ èŠãªããŒã¿ãJSONãªã©ã®åœ¢åŒã§ãµãŒãããååŸããŠã衚瀺å å®¹ãæŽæ°ããŸãã
ããã«ããããµãŒãããååŸããããŒã¿ããŠãŒã¶ãŒå ¥åãªã©ã®ç¶æ ããããŒãžé·ç§»æã«ç Žæ£ããããšãªãä¿æã§ããŸãããã®ããããµãŒããŒãšããåãããããŒã¿éã¯æå°éã«ãªããŸãããŸããããŒãžåäœã§ã¯ãªãããŒã¿åäœã§ããåããããããService Workersãªã©ã䜿ã£ãããŒã¿ã®ãã£ãã·ã¥ãèãããããªããŸãã
SPAã§ã¯ãåããŒãžã®ã©ã€ããµã€ã¯ã«ãè¶ããŠç¶æ ãä¿æããå¿ èŠããããŸããéåžžã®WebããŒãžã®å ŽåãããŒãžé·ç§»ããã°ãã©ãŠã¶äžã®ç¶æ ã¯ãªã»ãããããŸãããSPAã®å Žåã¯ãªã»ãããããŸããããã®ãããç¶æ ã®ã©ã€ããµã€ã¯ã«ããã¥ãŒã®ã©ã€ããµã€ã¯ã«ã«ã€ããŠé©åã«ç®¡çããå¿ èŠããããŸãã
äŸãã°ãããŒãžåãæ¿ãæã«DOMã«å¯Ÿããã€ãã³ããªã¹ããŒã®è§£é€ãå¿ããå Žåã«ã¯ãSPAã§ã¯ã¡ã¢ãªãªãŒã¯ã®åå ãšãªããŸããSPAã§ã¯ãããŒãžåãæ¿ãæã«ãåèªã¿èŸŒã¿ãè¡ãããªããããã¡ã¢ãªãªãŒã¯ããããšã䜿çšã¡ã¢ãªãã©ãã©ãå¢ããŠããŸããŸãããã®ããããã©ãŠã¶ã®DevToolãå©çšããã¡ã¢ãªãªãŒã¯ãçºçããŠããªããã«ã€ããŠã泚æããå¿ èŠããããŸãã
ãã®ããã«ãSPAã®ç»å Žã«ããJavaScriptäžã§è€éãªæŽæ°åŠçãè¡ãå¿ èŠãåºãŠãããããããŸããŸãªã¢ãããŒãã§ãã®åé¡ã解決ããããšããã©ã€ãã©ãªãç»å ŽããŸããã
ã¢ãã«ãšãã¥ãŒã«ããåŠçã®åå²
Backbone.jsã¯ãã¢ããªã±ãŒã·ã§ã³ããã¢ãã«ããšããã¥ãŒãã«åå²ããæ©èœãæäŸãããã¬ãŒã ã¯ãŒã¯ã§ããã¢ãã«ã¯ãèªèº«ã®ç¶æ ãå€åããå Žåã«ã倿Žã€ãã³ããçºè¡ããŸãããã¥ãŒã¯ãã¢ãã«ã®å€æŽã€ãã³ãã賌èªããŠãè¡šç€ºãæŽæ°ããŸãã
ããã¹ãã®å ¥åããã¿ã³ã®ã¯ãªãã¯ãšãã£ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ããããšããã¥ãŒãã¢ãã«ãæŽæ°ããŸãããã®çµæãã¢ãã«ãã€ãã³ããçºè¡ããããã賌èªããŠãããã¥ãŒã®è¡šç€ºãæŽæ°ãããŸãã
Backbone.jsã®æŽæ°ãããŒ
ã€ãã³ããéããŠä»ã®ãªããžã§ã¯ãã«å€æŽãéç¥ãããã¿ãŒã³ã¯ãããªãã¶ãŒããŒãã¿ãŒã³ããšåŒã°ããŸãããã®ããã«ãªããµãŒããŒãã¿ãŒã³ãšããŠã€ãã³ããéããŠãããšãããããšã§ãã¢ãã«ãšãã¥ãŒã®ããžãã¯ãåé¢ã§ããŸãã
ãã®çµæãã¢ãã«ã¯ãã¥ãŒãæèããå¿ èŠããããŸããããã¥ãŒã¯ãç»é¢è¡šç€ºãšã¢ãã«ãæäœããã ãã§ãå®éã®ããŒã¿ã®æŽæ°åŠçã«ã€ããŠã¯ç¥ãå¿ èŠããããŸãããããã«ãããã¢ãã«ãšãã¥ãŒã®è²¬åãåé¢ã§ããŸãã
Backbone.jsã¯ãä»ã«ãã³ã¬ã¯ã·ã§ã³ãã«ãŒã¿ãŒãšãã£ãèŠçŽ ãæã£ãŠããŸãããã¢ããªã±ãŒã·ã§ã³ã®æ§æãšããŠäžå¿ã«ãªãã®ã¯ã¢ãã«ãšãã¥ãŒã§ããããããMVCãšããŠåé¡ãããšãç»é¢è¡šç€ºãè¡ãVïŒãã¥ãŒïŒãšã€ãã³ããåŠçããCïŒã³ã³ãããŒã©ãŒïŒã®éšåãããã¥ãŒïŒäžéšã«ãŒã¿ãŒïŒãæ ã£ãŠããŸãã
ã€ãã³ãã®ç®¡çãè€éã«ãªãåé¡ã
Backbone.jsã®ã¢ãããŒãã§ã¯ãããããã®ã¢ãã«ãšãã¥ãŒããªãã¶ãŒããŒãã¿ãŒã³ã䜿ããã€ãã³ãã§ãããšããããšè¿°ã¹ãŸããã
ãã®å Žåãããã¢ãã«ã®ç¶æ ãå€ãããšããã®ã¢ãã«ã®å€æŽã€ãã³ãã賌èªããŠããå šãŠã®ãã¥ãŒã®æŽæ°åŠçãåŒã°ããŸãããã®ããããã¥ãŒã®æ°ãå¢ããŠæ§é ãè€éã«ãªããšãã¢ãã«ã®ç¶æ ã倿Žãããæã«äœãèµ·ãããïŒã©ã®ãã¥ãŒãæŽæ°ãããã®ãïŒã®ææ¡ãé£ãããªããŸãã
å ããŠãã¢ãã«ãå¥ã®ã¢ãã«ã®å€æŽã€ãã³ãã賌èªããŠåŠçããããšãå¯èœã§ããããã®å Žåã¯ããããã®ã¢ãã«ã®å€æŽã€ãã³ãã賌èªããŠããå šãŠã®ãã¥ãŒãæŽæ°ããããããããææ¡ãé£ãããªããŸãã
ãŸããé¢é£ã®ãããã¥ãŒã ããæŽæ°ãããããã«ããããã«ã¯ããã¥ãŒã现ããåå²ããããããã¢ãã«ã®å€æŽã€ãã³ãã賌èªããåŠçãå®çŸ©ããå¿ èŠããããã³ãŒãéãå€ããªã£ãŠããŸããŸãã
åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ãçšããå¹ççãªããŒã¿æŽæ°
AngularJS1ããVue.jsã¯ãåæ¹åããŒã¿ãã€ã³ãã£ã³ã°ãç¹åŸŽãšãããã¬ãŒã ã¯ãŒã¯ãšããŠç»å ŽããŸãããåæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã§ã¯ãããŒã¿ãã¢ãã«ãšãã¥ãŒéã§ãã¥ãŒã¢ãã«ãšããŠçŽä»ãããã圢ãšãªããŸãã
å ·äœçã«ã¯ããã¥ãŒã¢ãã«ãæã€ããŒã¿ãæŽæ°ãããšå¯Ÿå¿ãããã¥ãŒãæŽæ°ãããŠããã¥ãŒã®å€ãæŽæ°ãããšå¯Ÿå¿ãããã¥ãŒã¢ãã«ãæŽæ°ãããŸãã
åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã®æŽæ°ãããŒ
åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ãå©çšããããšã§ããã¥ãŒãšããŒã¿ãåæããããã®ã³ãŒããæžãå¿ èŠããªããªããŸããããããã®éãããŒã¿ã«é¢é£ã®ãããã¥ãŒã ããæŽæ°ãããããå¹ççã§ããããã¯ãBackbone.jsã®ã¢ãããŒãã§åé¡ãšãªãã现ããç²åºŠã§ã®ãã¥ãŒãšã¢ãã«ã®é¢é£æ§ã®ç®¡çããéçºè ãè§£ãæŸã£ãŠãããŸãã
åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã¯ã管çç»é¢ã®ãããªå ¥åãå€ãã¢ããªã±ãŒã·ã§ã³ã®éçºã楜ã«ããŠãããŸãããã®åé¢ãæé»çã«ã¢ãã«ãšãã¥ãŒãæŽæ°ããããããã¢ããªã±ãŒã·ã§ã³ãè€éã«ãªã£ãŠããå Žåããäœãèµ·ããŠããã®ããã®ææ¡ãé£ãããªããŸããç¹ã«ãè€æ°ã®ãã¥ãŒããåç §ãããŠããã¢ãã«ããããããªå Žåãåé¡ããã£ããšãã®ãããã°ã¯é£ãããªããŸãã
ãã®ã¢ãããŒãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®éçºãç°¡åã«ããŸããããããæäŸããŠãããã¬ãŒã ã¯ãŒã¯ã®å®è£ ã¯è€éã§ãã©ãã¯ããã¯ã¹ã«ãªããã¡ã§ããããã¯ãã¬ãŒã ã¯ãŒã¯ãæ³å®ããäžè¬çãªãŠãŒã¹ã±ãŒã¹ä»¥å€ã®ããšãããããšããå Žåããããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãå¿ èŠã«ãªãå Žé¢ã§ã¯åé¡ãšãªãããšããããŸãã
Fluxã«ããäžæ¹åãªããŒã¿ã®æµã
åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã«ããã现ããç²åºŠã§ã®ãã¥ãŒãšã¢ãã«ã®ç®¡çããéçºè èªèº«ãè¡ãå¿ èŠã¯ãªããªããŸãããã§ããããç¶æ ãæŽæ°ãããæã«äœãèµ·ããã®ãããšããç¹ã«ã€ããŠã¯äŸç¶æç¢ºã§ã¯ãããŸããããããæé»çã«ãªã£ããããããææ¡ãé£ãããªããŸãã
ãããéçºããã¢ãŒããã¯ãã£ãšããŠãFacebookã2014幎ã«çºè¡šããã®ããFluxã§ããFluxã®ç¹åŸŽã¯äžèšã®å³ã«ããéããããŒã¿ã®æµããäžæ¹åã§ããããšã§ãã
![]()
Flux: An application architecture for React utilizing a unidirectional data flow.
Fluxã«ãããŠãæŽæ°ã®ãããŒã¯äžèšã®éãã§ãã
- ãã¥ãŒãã€ãã³ããçºè¡ãã
- ã¢ã¯ã·ã§ã³ãçºè¡ãã
- çºè¡ãããã¢ã¯ã·ã§ã³ããã£ã¹ãããã£ãŒãã¹ãã¢ã«äŒãã
- ããããã®ã¹ãã¢ããåãåã£ãã¢ã¯ã·ã§ã³ãé¢å¿ã®ãããã®ã§ããã°ç¶æ ã®æŽæ°ãè¡ã
- ç¶æ ãæŽæ°ããã¹ãã¢ã¯å€æŽã€ãã³ããçºè¡ãã
- ãã¥ãŒã¯é¢å¿ã®ããã¹ãã¢ã®æŽæ°ã€ãã³ããåããŠè¡šç€ºãæŽæ°ãã
Fluxã®æŽæ°ãããŒ
ãããŸã§ç޹ä»ããã¢ãããŒãã§ã¯ãã¢ãã«ãšãã¥ãŒã®éã§åæ¹åã«ãããšããè¡ãããŠããŸããããŸãåã ã®ãã¥ãŒãšã¢ãã«ãããããã§ãããšããè¡ããããç¶æ ã®ææ¡ãé£ãããªããŸãã
Fluxã§ã¯ããŒã¿ã®æµããäžæ¹åã§ãããããèŠãã¹ããã€ã³ããæç¢ºã«ãªããåæ§æèŠçŽ ã®åœ¹å²ãæç¢ºã«ãªããŸãã
ãŸããå šãŠã®æŽæ°åŠçãã¢ã¯ã·ã§ã³ãšããŠè¡šçŸãããç¹ãFluxã®ç¹åŸŽã§ããå šãŠã®ã¢ã¯ã·ã§ã³ã¯åäžã®ãã£ã¹ãããã£ãŒãçµç±ããŠã¹ãã¢ã«é ä¿¡ãããããããã£ã¹ãããã£ãŒã§çºè¡ãããã¢ã¯ã·ã§ã³ãç£èŠããã°ãã¢ããªã±ãŒã·ã§ã³ã§äœãèµ·ããŠããã®ãã¯äžç®çç¶ã§ãã
ãããŸã§ç޹ä»ããã¢ãããŒãã«æ¯ã¹ããšãèŠçŽ ãå€ãããã®åæžãã³ãŒãã®éãå€ããªããŸããããã¯ãåèŠçŽ ãåçŽåããŠç¶æ 管çã®æµããæç¢ºã«ããããã®ãã¬ãŒããªãã§ããã³ãŒãã¯æžããããããã®åŸèªãŸããæ¹ãå€ããæ¥œã«æžãããããããã®åŸææ¡ããããæ¹ãéèŠã§ãããšããææ³ãèæ¯ã«ãããŸãã
Fluxã§ã¯ãã¢ã¯ã·ã§ã³ãã³ãã³ããã¿ãŒã³ãšããŠå®è£ ããŸããã¢ã¯ã·ã§ã³ã¯çºè¡ããã ãã§ãããçµæã¯åãåããŸãããçµæã¯ã¹ãã¢ã®æŽæ°ã€ãã³ããåãããã¥ãŒãã¹ãã¢ããåãåããŸãã
ã€ãŸããã¢ã¯ã·ã§ã³ãçºè¡ããããã®ã³ãã³ãïŒäžèšã®å³ã§ã¯ActionCreatorïŒãšãçµæãã¹ãã¢ããåãåãããã®ã¯ãšãªãŒã®éšåãç¬ç«ããŸãããã®ãããã³ãã³ããšã¯ãšãªãŒãå®è£ ããéã«ã¯ãããããã®è²¬åã ããæèããã°ãããªããããè€éæ§ãæžããããšãå¯èœã§ãã
Reactãå¯èœã«ããããš
Fluxã§ã¯ãç¶æ ã®å€åãäžæ¹åãªæµãã§è¡šçŸããããšãå¯èœã«ãªããŸããããããããã ãã§ã¯åãã¥ãŒãããããã¹ãã¢ããããŒã¿ãååŸãã圢ã«ãªããã³ãŒãéãå¢å€§ããè€éåããŠããŸããŸãã
åæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã§ã¯ããã¬ãŒã ã¯ãŒã¯ãããŒã¿ãšãã¥ãŒã®äŸåé¢ä¿ãææ¡ããŠããããšã§ãé¢é£ã®ãããã¥ãŒã ããå¹ççã«æŽæ°ããããšãå®çŸããŠããŸããã
ãã®åé¡ã«å¯ŸããŠãReactãã¯ãããšããããã¥ãŒã®ã¬ã€ã€ãŒã§å·®åé©çšãè¡ãã©ã€ãã©ãªãçšããŠè§£æ±ºããæ¹æ³ããããŸãã
Reactã§ã¯ã詳现ã¯å²æããŸãããåã³ã³ããŒãã³ããUI = Component(Data)ãªé¢æ°ãšããŠè¡šçŸã§ããŸãããããã®ã³ã³ããŒãã³ããçµã¿åãããããšã§ããã¥ãŒå
šäœãUI = View(State)ãšãã巚倧ãªé¢æ°ãšããŠè¡šçŸã§ããŸãã
å·®åæŽæ°ã®ä»çµã¿ãæããªãã©ã€ãã©ãªã®å Žåããã¥ãŒå šäœã颿°ãšããŠæ±ããšãåžžã«ãã¥ãŒå šäœã®DOMãæŽæ°ãããŠããŸããŸããããã¯ãããã©ãŒãã³ã¹ãDOMã®ç¶æ ã®ä¿æã§åé¡ãšãªããŸãã
Reactã¯ãååŸã®ã³ã³ããŒãã³ãã®ç¶æ ãæ¯èŒããŠãå·®åã®ã¿ãDOMã«é©çšãããããéçºè ã¯äžèšã®ããã«ãã¥ãŒå šäœã1ã€ã®é¢æ°ãšããŠè¡šçŸã§ããŸãã
ãããã£ãŠãFluxãšReactãçµã¿åãããããšã§ããã¥ãŒã®éšåããã ã®é¢æ°ãšããŠæ±ãããšãå¯èœã«ãªããããããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ å€åãåçŽåã§ããŸããReactèªäœãããŒã¿ã芪ããåã«æž¡ããŠã€ãã³ããåãã芪ã«äŒããäžæ¹åãªæµããšãªã£ãŠãããFluxã¯ãããã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§é©çšãããã®ãšèããããšãã§ããŸãã
ReactãšFluxã®æŽæ°ãããŒ
ã€ãã³ãã®åŠçæ¹æ³
ã¢ã¯ã·ã§ã³ãã¹ãã¢ã«äŒããŠãã¹ãã¢ã®å€æŽã€ãã³ãããã¥ãŒã«äŒããããã®ä»çµã¿ã®å®è£ ã«ã¯ãããã€ãã®ãã¿ãŒã³ããããŸãã
æãäžè¬çãªã®ã¯ããªãã¶ãŒããŒãã¿ãŒã³ã䜿ããåçŽãªã€ãã³ããšããŠãããšãããæ¹æ³ã§ããã®å Žåã¯Node.jsã®æšæºã©ã€ãã©ãªã§ããEventsãªã©ã§å®è£ ã§ããŸãã
ãã©ãŠã¶äžã§ã¯ã€ãã³ããéåæã«é£ç¶çã«çºçããŸãããã®ããè€æ°ã®ã€ãã³ããçµã¿åãããããã€ãã³ãã®æµéãæãããããšãã£ãå¶åŸ¡ãå¿ èŠãšãããå ŽåããããŸãã
ããã§ãRxJSã®ãããªã©ã€ãã©ãªã䜿ããã€ãã³ããã¢ã¯ã·ã§ã³ãObservableã䜿ã£ãŠå¶åŸ¡ããæ¹æ³ããããŸãããã®å ŽåãFluxã®æµãã¯å€ãããŸããã
Cycle.jsã¯ããããããã·ã³ãã«ã«ãã€ãã³ããšã¢ã¯ã·ã§ã³ãã¹ããªãŒã ãšããŠæ±ã£ãŠããã©ã€ãã©ãªã§ãã
åäžã¹ãã¢ãšäžå€æ§ã«ããäºæž¬å¯èœãªç¶æ 管ç
Fluxã¯ã¢ãŒããã¯ãã£ã§ãããFluxãå®è£ ãããã¬ãŒã ã¯ãŒã¯ã¯ãFluxã®çºè¡šåŸããããç»å ŽããŸããããã®äžã§ãçŸåšåºã䜿ãããŠããã®ã¯ãReduxã§ãã
Reduxã¯ãFluxãElmã®èãæ¹ãããŒã¹ã«ãããç¶æ 管çã®ããã®ã©ã€ãã©ãªã§ãã
å ¬åŒãµã€ãã§ã¯ãA predictable state container for JavaScript appsããšç޹ä»ãããŠããŸããç¹åŸŽãšããŠã¯ãPredictableããCentralizedããDebuggableããFlexibleãã®4ã€ãæããããŠããŸãã
ä»ã®Fluxãå®è£ ãããã¬ãŒã ã¯ãŒã¯ãšå€§ããç°ãªãç¹ã¯ãã¹ãã¢ã1ã€ããæããªãããšã§ãããŸãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ã«ã察å¿ã§ããããã«ããªã¯ãšã¹ãæ¯ã«ã¹ãã¢ãäœæã§ããæ§é ã«ãªã£ãŠããŸãã
ç¶æ ãåäžã®JSONãªããžã§ã¯ããšããŠä¿æ
Reduxã§ã¯ã¹ãã¢ã¯1ã€ã§ãããã¹ãã¢ãæã€ç¶æ ã¯å·šå€§ãªJSONãªããžã§ã¯ããšãªããŸãããŸãã¹ãã¢ãæã€ç¶æ ã¯ãã€ãã¥ãŒã¿ãã«ïŒäžå€ïŒãªããŒã¿æ§é ãšããŠæ±ããŸããã€ãŸããç¶æ ãæŽæ°ããéã«ã¯åžžã«ãªããžã§ã¯ããåäœæããŸãã
ç¶æ ãåäžã®JSONãªããžã§ã¯ããšããŠä¿æããã¡ãªããã¯äœã§ããããã
1ã€ã¯ãReduxãç¹åŸŽãšããŠæããŠããPredictableïŒäºæž¬å¯èœïŒã§ããããšã§ããç¶æ ã1ã€ã®ãªããžã§ã¯ãã«éçŽãããŠããããããã®ãªããžã§ã¯ããèŠãã°ãã¢ããªã±ãŒã·ã§ã³ãã©ããªç¶æ ãªã®ããåãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæ£ããã«ãããããããæå³ããªãçµæãç»é¢ã«è¡šç€ºãããŠãããšããããããã¯ãã¥ãŒã®ããžãã¯ã«åé¡ã§ããããšãåãããŸããã€ãŸãView = Application(State)ãšãã圢ã«ãªããŸãã
ããããªãããã¹ãã¢ãåäžã§ã¢ããªã±ãŒã·ã§ã³å šäœã巚倧ãªJSONãªããžã§ã¯ããšããŠè¡šçŸããå Žåãç¶æ ã®æŽæ°åŠçã巚倧ã«ãªã£ãŠããŸãããšãäºæ³ã§ããŸãã
Reduxã§ã¯ ãç¶æ
ãreducerãšåŒã°ãããã¢ã¯ã·ã§ã³ãåããŠç¶æ
ãæŽæ°ãã颿°ãçµã¿ããããããšïŒCompositionïŒã§ãæ§ç¯ããŸãã
reducerã¯äžèšã®ãããªé¢æ°ã§ãã
newState = reducer(state, action);
ããã¯äžèšã®ããã«çµã¿åãããããšãå¯èœã§ãã
const usersReducer = (state, action) => {...};
const itemsReducer = (state, action) => {...};
// ãã¹ããããããšãå¯èœ
const settingsReducer = (state, action) => ({
shortcut: (state.shortcut, action) => {/* ... */},
language: (state.language, action) => {/* ... */}
});
const newState = (state, action) => ({
users: usersReducer(state.users, action),
items: itemsReducer(state.items, action),
settingns: settingsReducer(state.settings, action),
});
/*
newStateã¯äžèšã®ãããªæ§é ãæã£ãStateã«ãªã
newState = {
users: [...],
items: [...],
settings: {
shortcut: {...},
language: {...}
}
}
*/
ããã«ãããFluxã§ã¹ãã¢ãåå²ããããã«ãæŽæ°åŠçã颿°ãšããŠåå²ããããšãå¯èœã«ããŸããããã¯ãFluxã§ã®é£ããã®1ã€ã§ãã£ãæŽæ°æã®ã¹ãã¢éã§ã®æŽæ°é ã®å¶åŸ¡ããreducerã«èŠªåé¢ä¿ãäœãããšã§å¶åŸ¡å¯èœã«ããŸãã
ãŸããç¶æ ãã€ãã¥ãŒã¿ãã«ãªããŒã¿æ§é ãšããŠæ±ããããŒã¿æŽæ°æã«ã¯åžžã«æ°ãããªããžã§ã¯ããè¿ãããšã¯ãUndo/Redoã®å®è£ ãç°¡åã«ããŸããããã«ãã¢ã¯ã·ã§ã³ã§ã®ã¿ç¶æ ãæŽæ°ãããããã€ãã¥ãŒã¿ãã«ãªããŒã¿æ§é ããšããç¹åŸŽã«ãããéå»ã®ä»»æã®ç¶æ ã«æ»ã£ãŠåéãããã¿ã€ã ãã©ãã«ãããã®ã³ã°ããå¯èœã«ãªããŸãã
ç¶æ ãå¯äœçšã®ãªããã ã®é¢æ°
Reduxã¯ãã¢ããªã±ãŒã·ã§ã³ã®å€ãã®éšåããç¶æ ãå¯äœçšãæããªããã ã®é¢æ°ãšããŠå®è£ ããããšãå¯èœã«ããŸããç¶æ ã«ã€ããŠã¯ã巚倧ãªJSONãªããžã§ã¯ãããŠè¡šçŸãããšè¿°ã¹ãŸãããããã§ã¯ãå¯äœçšã¯ã©ãããã°ããã®ã§ããããã
ããã«ã€ããŠã¯ãReduxèªäœã«ã¯çµã¿èŸŒãŸããŠããªããããããŸããŸãªã¢ãããŒãããããŸãã
æ¬èšäºã§ã¯ãã®ãããªãªã³ã¯ã§ã®ç޹ä»ã®ã¿ãšããŸãããèå³ãããã°ããããã®ã¢ãããŒãã確èªããŠã¿ãŠãã ããã
Reduxã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãæ§æããèŠçŽ ã®å€ãã®éšåããã ã®é¢æ°ãšããŠè¡šçŸããããšã§ãäºæž¬å¯èœïŒPredictableïŒã§ããããšãå®çŸããŠããŸãããŸãããã ã®é¢æ°ã§ããããšã§ããã¹ããç°¡åã«æžãããšãã§ããŸãã
ããžãã¯ããç¶æ ãåãé¢ããäžçãå¯èœã«ããDX
Reduxã¯ããã©ãŠã¶ã®DevToolã®æ¡åŒµãšããŠãå ã»ã©è¿°ã¹ãããã«ãä»»æã®éå»ã®ç¶æ ã«æ»ãããããåéãããæ©èœãæäŸããŠããŸãã
ãŸããRedux DevToolsã§ã¯ãèšé²ãããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãã¢ã¯ã·ã§ã³ã®å±¥æŽããJSONãã¡ã€ã«ãšããŠãšã¯ã¹ããŒãã»ã€ã³ããŒãããããšãå¯èœã§ããããã«ãããæå ã§äžå ·åãçºçããå Žåã«ããã®æã®ç¶æ ãèšé²ããŠãä»ã®ã¡ã³ããŒã«å ±æã§ããŸãã
ããã«ããŠãŒã¶ãŒç°å¢ã§ãšã©ãŒãçºçããå Žåã«ããšã©ãŒãçºçãããŸã§ã®ã¢ã¯ã·ã§ã³ã®å±¥æŽãç¶æ ãéä¿¡ããããã䜿ã£ãŠãšã©ãŒãè§£æããããšãå¯èœã§ãã
äžèšã¯ããšã©ãŒãã©ããã³ã°ãµãŒãã¹ã§ããSentryã§ç޹ä»ãããŠãããReduxã®Middlewareã®ä»çµã¿ãå©çšãããšã©ãŒè§£æã®æ¹æ³ã§ãã
Rich Error Reports with Redux Middleware | Product Blog ⢠Sentry
webpackã®ãããªããŒã«ã䜿ãããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãããã©ãŠã¶ã®ãªããŒããªãã«åæ ãããHMRïŒãããã¢ãžã¥ãŒã«ãªãã¬ã€ã¹ã¡ã³ãïŒãå¯èœã§ããHMRãšã¿ã€ã ãã©ãã«ãããã®ã³ã°ãçµã¿åãããããšã§ãæŽæ°åŠçïŒã¢ã¯ã·ã§ã³ã®æµãïŒãèšé²ããããããªããŒãåçããªããã¢ããªã±ãŒã·ã§ã³ã®æŽæ°ããžãã¯ãå®è£ ããããšãå¯èœã«ãªããŸãã
äžèšã¯ããã®ã³ã³ã»ããã衚çŸããPull Requestã§ãã
ãã®ããã«ãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ããå¯èœãªéãç¶æ ãæããªããã ã®é¢æ°ã«ããããšã§ãã¢ããªã±ãŒã·ã§ã³ãäºæž¬å¯èœã«ããã ãã§ãªããéçºãå©ããããŸããŸãªã¢ãããŒããå¯èœã«ãªã£ãŠããŸãã
ãŸãšã
æ¬èšäºã§ã¯ãããã³ããšã³ãã«ãããç¶æ 管çã®å€é·ã«ã€ããŠè§£èª¬ããŸããã
玹ä»ããFluxãReduxã®ãããªã¢ãããŒãã¯ãVue.jsãAngularãšãçµã¿åããããããªã©ãåºãæ¡çšãããŠããŸãã
ãŸããTypeScriptãªã©ã®éçåä»ããè¡ãèšèªã®ååšãéèŠãªãã€ã³ãã§ããFluxãReduxã®ãããªã¢ãããŒãã§ã¯ãå€ãã®éšåããã ã®é¢æ°ãšãªããããå ¥åãšåºåãéèŠã«ãªããŸãããã®éãéçåãã§ãã¯ãè¡ããããšãåæ å ±ãããšã«ããè£å®ãå¯èœã§ããããšã¯ãéçºã®çç£æ§ã«å€§ãã圱é¿ããŸãã
æ¬èšäºã§ã¯åãäžããŸããã§ããããFluxã®ãããªã³ãŒãã®èªã¿ããããéèŠããã¢ãããŒããšã¯å¥ã«ããªã¢ã¯ãã£ããªã¢ãããŒããæ¡çšãããã¬ãŒã ã¯ãŒã¯ãååšããŸãã
èå³ã®ããæ¹ã¯ãäžèšã®ãã¬ãŒã ã¯ãŒã¯ãåç §ããŠã¿ãŠãã ããããããã¯ãæ¬èšäºã§ç޹ä»ããåæ¹åããŒã¿ãã€ã³ãã£ã³ã°ã®æµããããã«é²ãããããªã¢ãããŒããåã£ãŠããŸãã
Webãã©ãŠã¶ãšãããã©ãããã©ãŒã ã®é²å
SPAã®ç»å Žã«ãããWebã¢ããªã±ãŒã·ã§ã³ã§ãããŒãžãšããå¶éãè¶ ãã衚çŸãç¶æ 管çãå¯èœã«ãªããŸããã
ãã®åé¢ããããŸã§ã¯èããå¿ èŠã®ãªãã£ããç¶æ ããšã¯äœãã«ã€ããŠèããå¿ èŠãåºãŠããŸãããããã«ã¯ãURLãããã©ãŠã¶ã®ãã¹ããªãã¹ã¯ããŒã«äœçœ®ãšãã£ããããŸã§ãã©ãŠã¶ã«ä»»ããŠãããã®ãå«ãŸããŸãã
ãŠãŒã¶ãŒã«ãšã£ãŠãããŒãžããšããæŠå¿µã¯å€ãããååšããŸãããŠãŒã¶ãŒã®æåŸ ãè£åããªã圢ã§ããããã®ãç¶æ ãã管çãããããŸã§ã®Webã®äœéšãå£ãããšãªãããªãããªãŠãŒã¶ãŒäœéšãæäŸããå¿ èŠããããŸãã
ãã®ããã«è€éåããç¶æ 管çãè¡ãããã«ã颿°åã®èãæ¹ãåäžè²¬ä»»ã®æ³åã«æ²¿ã£ãã¢ãããŒããããã³ããšã³ãã§ã䜿ãããããã«ãªããŸããããããšåæã«ãéçºããµããŒãããããã®ã¢ã€ãã¢ãéçºããŒã«ãçºå±ããŠããŸãããä»ããã¬ãŒã ã¯ãŒã¯ãéçºããŒã«ãæäŸããããšã¯ãåœããåã®ãã®ãšããŠèªèãããŠããŸãã
ãã©ãŠã¶ãšãããã©ãããã©ãŒã ãé²åããŠããŸããService WorkersãWebAssemblyãªã©ããã©ãããã©ãŒã ãšããŠã®å¯èœæ§ãéžæè¢ãã©ãã©ããšåºãã£ãŠããŸãããããã¯èšèšã«å€æ§ãªéžæè¢ãæäŸããŸãããã®ãããããããã¯ããåºãèŠç¹ã§ããã³ããšã³ãã®ã¢ãŒããã¯ãã£ãèããå¿ èŠãããã§ãããã
ææ°çã¯Angular.jsã§ã¯ãªããAngular(https://angular.io/)ã§ããâ©




