éçãµã€ãïŒ 1ããã³2 ïŒããã¹ãããããã®ãã©ãããã©ãŒã ãšããŠã¯ã©ãŠãã¹ãã¬ãŒãžã䜿çšããæ¹æ³ã«ã€ããŠã¯ãã§ã«èª¬æããŸããã ä»æ¥ã¯ããªããžããªã«åºã¥ããŠçŸä»£ã®ãµã€ãããã¹ãããæ¹æ³ã«ã€ããŠã話ããŸãããªããžããªã¯ãä»æ¥äººæ°ã®ããã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã¢ãããŒãã«åºã¥ããŠããŸãã
ã¢ãããŒããšããŠã®SPA
ç¥èªSPAã¯ãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãïŒãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ãïŒã®ç¥ã§ãã ç矩ã«ã¯ããã©ãŠã¶ã§ã¯ã©ã€ã¢ã³ãåŽã§çŽæ¥å®è¡ããã1ããŒãžã®ãµã€ããæãããã«äœ¿çšãããŸãã ããåºãæå³ã§ãSPAïŒãSPIããšç¥ãããããšããããŸã-ãåäžããŒãžã€ã³ã¿ãŒãã§ã€ã¹ãïŒã¯ãWebéçºã«ãããã¢ãããŒãå šäœãæå³ããä»æ¥ã§ã¯ããã«æ®åããŠããŸãã ãã®ã¢ãããŒãã®æå³ã¯äœã§ããïŒãªã人æ°ãé«ãŸã£ãŠããã®ã§ããïŒ
é ãããå°ãå§ããŸãããã ä»æ¥ãæãäžè¬çãªã¿ã€ãã®ãµã€ãã¯ããã¡ããããµãŒããŒåŽã§ããŒãžçæãè¡ãããåçãµã€ãã§ãã éçºè ã«ãšã£ãŠæãããªãã¹ãŠã®ã¢ã¡ããã£ãåããŠããããïŒåãªã¯ãšã¹ãã¯æåããããŒãžãäœæããŸãïŒããã®ãããªãµã€ãã¯é¡§å®¢ã«ãšã£ãŠæ¬åœã«é çã®çš®ã«ãªãããšããããŸãã 以äžã¯ã圌ããçŽé¢ããäžäŸ¿ãã®å®å šãªãªã¹ãã§ã¯ãããŸããã
- äžéšã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã¯ã©ã€ã¢ã³ããæåŸã«å ¥åããããŒã¿ãå«ããã©ãŒã ãè¿ãããšãã§ããŸãããæ€èšŒã®ããã«ããŒãžããªããŒãããå¿ èŠãããããããµã€ãã§ã®äœæ¥ãäžå¿«ã«ãªããŸãã
- ãµãŒããŒåŽã®ããŒãžçæã«ã¯ãæ·±å»ãªã¯ãŒã¯ããŒãã䌎ããŸãã
å€ãã®å Žåã説æãããŠããåé¡ã¯æ¬¡ã®ããã«è§£æ±ºãããŸããããŒãžã¯åŒãç¶ããµãŒããŒåŽã§çæãããŸãããå°ããªJavaScriptã¹ã¯ãªããã¯ã¯ã©ã€ã¢ã³ãåŽã§å®è¡ãããããšãã°ããµãŒããŒã«éä¿¡ããåã«ãã©ãŒã ãæ€èšŒã§ããŸãã äžèŠãããšãã解決çã¯æªããããŸããããæ¬ ç¹ããããŸãã
- 以åã«ããã³ããšã³ããšããã¯ãšã³ãã®æ©èœãæ確ã«åé¢ãããŠããå ŽåïŒããã¯ãšã³ãããã¥ãŒãšããžãã¯ãçæããããã³ããšã³ãã衚瀺ãæ åœããŸãïŒãããžãã¯ã¯ããã³ããšã³ãã§è€è£œãããŸãã
- ãã¥ãŒãçæããã³ãŒãã¯åžžã«è€è£œããå¿ èŠãããããã®ããã«åé¡ããããŸãïŒã³ããŒãšè²Œãä»ããããŒã¯ã¢ããã®äžäžèŽãå£ããã»ã¬ã¯ã¿ãŒãã³ãŒãã®ç¶æã®å°é£ãªã©ã
ãã¡ãããããªãã¯ãããã¹ãŠã§çããããšãã§ããŸãã ããããå€ãã®å ŽåãSPAã¢ãããŒãã¯ã¯ããã«å¹æçã§ãã
ãã®ã¢ãããŒãã®èŠ³ç¹ããèŠããšããµã€ãã¯ããŒãžã®ã»ãããšããŠã§ã¯ãªããåãHTMLããŒãžã®ç¶æ ã®ã»ãããšããŠç解ãããŸãã ç¶æ ãå€åãããšãããŒãžèªäœããªããŒãããã«æ°ããã³ã³ãã³ãã®éåæããŒããçºçããŸãã
SPAã¯å€å žçãªæå³ã§ã®ãµã€ãã§ã¯ãªãããã©ãŠã¶ã§ã¯ã©ã€ã¢ã³ãåŽã§å®è¡ãããã¢ããªã±ãŒã·ã§ã³ã§ãã ãããã£ãŠããŠãŒã¶ãŒã®èŠ³ç¹ããã¯ãäœéãŸãã¯äžå®å®ãªã€ã³ã¿ãŒãããæ¥ç¶ïŒã¢ãã€ã«ããã€ã¹ãããµã€ãã衚瀺ããå Žåãªã©ïŒã§ãã£ãŠããæäœã®é床ã«ã»ãšãã©åé¡ã¯ãããŸããã ãŸãããµãŒããŒããã¯ã©ã€ã¢ã³ããžã®ããŒã¯ã¢ããã§ã¯ãªããããŒã¿ïŒäž»ã«JSON圢åŒïŒãšãã®ãµã€ãºãå°ãããšããäºå®ã«ãããäœæ¥ã®é«éæ§ã確ä¿ãããŸãã
æè¿ãSPAã®äœæãšäœ¿çšãå€§å¹ ã«ç°¡çŽ åããèå³æ·±ãæè¡çãœãªã¥ãŒã·ã§ã³ãšãµãŒãã¹ãæ°å€ããããŸãã ãããã®ããã€ãããã詳现ã«æ€èšããŸãããã
BAASïŒãµãŒãã¹ãšããŠã®ããã¯ãšã³ãïŒ
ã¯ã©ã€ã¢ã³ãåŽã§ã€ã³ã¿ãŒãã§ãŒã¹ãã¬ã³ããªã³ã°ããããŒãžããªããŒãããã«ãªã¯ãšã¹ããéä¿¡ããã ãã§ãµãŒããŒãšå¯Ÿè©±ããããšãå¯èœã«ããæè¡ã¯é·ãéååšããŠããŸããã ããšãã°ã XMLHttpRequest APIã¯2000幎ã«ç»å ŽããŸããã ãããããããã®ãã¯ãããžãŒã®äœ¿çšã«ã¯å°é£ã䌎ããŸããããªã¯ãšã¹ãã®èš±å¯ãšããŒã¿ãžã®ã¢ã¯ã»ã¹ã®æ©èœãå®è£ ããããã¯ãšã³ããæžãçŽãå¿ èŠããããŸããã
ä»æ¥ãå€æ°ã®BaaSãµãŒãã¹ã®ç»å Žã«ããããã¹ãŠãéåžžã«ç°¡åã«ãªããŸããã BaaSãšããç¥èªã¯ãBackend as a Serviceã®ç¥ã§ãã BaaSãµãŒãã¹ã¯ãWebã¢ããªã±ãŒã·ã§ã³éçºè ã«æ¢è£œã®ãµãŒããŒã€ã³ãã©ã¹ãã©ã¯ãã£ïŒéåžžã¯ã¯ã©ãŠãã«é 眮ïŒãæäŸããŸãã ãããã®ãããã§ããµãŒããŒã³ãŒãã®èšè¿°ã«ãããæéïŒãããŠå€ãã®å ŽåããéãïŒãç¯çŽã§ããã¢ããªã±ãŒã·ã§ã³èªäœã®æ¹åãšãã®æ©èœã®éçºã«éäžã§ããŸãã BaaSã䜿çšãããšãä»»æã®æ©èœã»ãããåããä»»æã®ããã¯ãšã³ããã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãµã€ãã«æ¥ç¶ã§ããŸããé©åãªã©ã€ãã©ãªãããŒãžã«è¿œå ããã ãã§ãã
ããšãã°ã MongoLabãµãŒãã¹ã䜿çšãããšãMongoDBã¯ã©ãŠãããŒã¿ããŒã¹ãWebã¢ããªã±ãŒã·ã§ã³ããã³Webãµã€ãã«æ¥ç¶ã§ããŸãã
ãã1ã€ã®èå³æ·±ãäŸã¯FireBaseã§ãã ãã®ãµãŒãã¹ã¯ããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³åãã®ã¯ã©ãŠãããŒã¿ããŒã¹ããã³APIã§ãã ç¹ã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã®ããŒã¿äº€æããªã¢ã«ã¿ã€ã ã§æŽçã§ããŸããJavaScriptã©ã€ãã©ãªãããŒãžã«æ¥ç¶ããã€ãã³ããæ§æããŠããŒã¿ãå€æŽããã ãã§ãã FireBaseã«åºã¥ããŠããã£ããããŠãŒã¶ãŒã¢ã¯ãã£ããã£ãã£ãŒããªã©ãç°¡åã«å®è£ ã§ããŸãã
èå³æ·±ãã泚ç®ã«å€ããBaaSãµãŒãã¹ã®äžã§ãã匷調ãã䟡å€ããããŸãã
- ããã¯ãšã³ãã¬ã¹ã¯ãããããçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ã«æ¢è£œã®ã¯ã©ãŠããµãŒããŒã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸãããã©ãããã©ãŒã ã§ãã ãã®æ¯æŽã«ããããŠãŒã¶ãŒç®¡çããŠãŒã¶ãŒããŒã¿ã¹ãã¬ãŒãžããªã¢ã«ã¿ã€ã ã¡ãã»ãŒãžã³ã°ãéç¥ãäœçœ®æ å ±ããã¡ã€ã«ç®¡çãªã©ããµã€ãã«è¿œå ã§ããŸãã
- Syncanoã¯ãFirebaseãšæ©èœã䌌ãŠãããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³çšã®APIãæäŸãããµãŒãã¹ã§ãã
- QuickBloxã¯ããã·ã¢ã®éçºè ã«ããé¢çœããªã補åã§ãïŒ Habréã«é¢ãã詳现ãªèšäºãåç §ããŠãã ãã ïŒã
BaaSãµãŒãã¹ã®ç°¡åãªæŠèŠãããã«ãããŸã ã
ã¯ã©ãŠãã¹ãã¬ãŒãžã¯å€éšããã¯ãšã³ããšããŠã䜿çšã§ããŸãã ããã«ãããããšãã°ããã¡ã€ã«ç®¡çæ©èœãWebã¢ããªã±ãŒã·ã§ã³ããµã€ãã«çµ±åã§ããŸãã
ã¹ãã¬ãŒãžãå€éšããã¯ãšã³ããšããŠäœ¿çšããå ŽåãèªèšŒãšã³ã³ãã³ãã®æäœãšãã2ã€ã®éèŠãªç¹ã«ç¹ã«æ³šæããå¿ èŠããããŸãã èªèšŒããŒïŒããŒã¯ã³ïŒã¯ãauth.selcdn.ruãžã®ãªã¯ãšã¹ãã䜿çšããŠååŸã§ããŸãã
次ã«ããã¹ãŠã®ããŒã¿åŠçèŠæ±ã§X-Auth-TokenããããŒã®å€ãšããŠæå®ããå¿ èŠããããŸãã ãããã®èŠæ±ãžã®å¿çã«ã¯ãå€ã*ãã®Access-Control-Allow-OriginããããŒãå«ãŸããŸããããã«ãããä»»æã®å€éšãã¡ã€ã³ãããªããžããªã«ã¢ã¯ã»ã¹ã§ããŸãã
ã¹ãã¬ãŒãžAPIã䜿çšããWebã¢ããªã±ãŒã·ã§ã³ã®äŸã¯ããã©ãã®ã£ã©ãªãŒã§ã ïŒæ¢ã«èª¬æããŸãããGitHubã®ãªããžããªãåç §ããŠãã ããïŒã
HTML5 History API
åçãµã€ãã®åããŒãžã«ã¯ç¬èªã®URLããããŸãã SPAã¯ãURLãå€æŽããã«ããŒãžã®ç¶æ ãå€æŽã§ããããã«é 眮ãããŠããŸãã ãã ãããã®å Žåãåé¡ãçºçããŸãããŠãŒã¶ãŒã¯ãªã³ã¯ãä¿åããŠããã以åã«ã¢ã¯ã»ã¹ããã»ã¯ã·ã§ã³ã«æ»ãããšãã§ããŸããã ããã解決ããæ¹æ³ã¯ããã€ããããŸãã
ãŸããããã·ã¥ãã©ã°ã¡ã³ãïŒãïŒãèšå·ã®åŸã«æ¥ããªã³ã¯ã®éšåïŒã䜿çšã§ããŸãã ããã·ã¥ãã©ã°ã¡ã³ãã«ã¯ã以åã®ç¶æ ã埩å ã§ããããŒãžã®ãä»®æ³ãã¢ãã¬ã¹ãå«ãŸããŠããŸãã ãŠãŒã¶ãŒãããŒãžããªããŒããããšãããã·ã¥å€ãèªã¿åã£ãåŸãJavaScriptã³ãŒããå¿ èŠãªããŒã¿ãããŠã³ããŒããã察å¿ããã»ã¯ã·ã§ã³ã衚瀺ããŸãã ãã®ãªãã·ã§ã³ã¯å€ãã®ãµã€ãã§äœ¿çšãããŠããŸããããã®ãããªURLïŒããšãã°ãã example.com/base /#ïŒ/ Section1 / page2ãïŒã¯ããŸãèªç¶ã«èŠããªãããšã«æ³šæããŠãã ããã ããã«ããããã¯2ã€ã®ãšã³ãã£ãã£ã§æ§æãããŸããWebãµãŒããŒããããŒãžãèŠæ±ããããå®éã®ãã¢ãã¬ã¹ãšãè«çã»ã¯ã·ã§ã³ã瀺ããä»®æ³ãã§ãã
次ã«ã HTML5 History APIã䜿çšã§ããŸã ïŒ Habréã®èšäºãåç §ããŠãã ãã ïŒã History APIã䜿çšãããšãçŸåšã®ãã¡ã€ã³å ã®ããŒãžURLãå®å šã«å€æŽããããšãã§ããŸãããªããŒãããå¿ èŠã¯ãããŸããã ãã®APIããµããŒããããã©ãŠã¶ã§ã¯ãããŒãžã®èªã¿èŸŒã¿ã«äœ¿çšãããURLãšJavaScriptããæå®ãããURLã«éãã¯ãããŸããã
å±¥æŽAPIé¢æ°ã®åŒã³åºãã¯ããã€ãã£ããã©ãŠã¶ãŒã®ãã¿ã³ãé²ãããšãæ»ããããã³å±¥æŽã«ãé¢é£ä»ããããŠããŸãããæ»ãããã¿ã³ãã¯ãªãã¯ãããšããã©ãŠã¶ãŒã¯popstateã€ãã³ããããªã¬ãŒããJavaScriptã³ãŒãã§åŠçã§ããåã®ã»ã¯ã·ã§ã³ã衚瀺ãããŸãã ãããã©ã®ããã«æ©èœãããã¯ãããšãã°ããã§ç¢ºèªã§ããŸã ã
ãµã€ãã§èª¬æãããŠããURLã¹ããŒã ã䜿çšããã«ã¯ãããã«å¿ããŠWebãµãŒããŒãæ§æããå¿ èŠããããŸãã ååšããªãããŒãžã®ä»£ããã«ãã¡ã€ã³SPAããŒãžãè¿ãããããšã確èªããå¿ èŠããããŸã-éåžžãããã¯index.htmlã§ãã ãã®å Žåãã¯ã©ã€ã¢ã³ãã®ãã©ãŠã¶ã¯JavaScriptãããŒãããçŸåšã®ããŒãžã¢ãã¬ã¹ã«åºã¥ããŠç®çã®ãµã€ããã¡ã€ã«ãæ¢ã«æç»ããŸãã
nginxèšå®ã§ã¯ãããã¯æ¬¡ã®ããã«èšè¿°ãããŸãã
location / {rewriteã* /index.html; }
SPAãGitHubããŒãžããªããžããªãªã©ã®ãµãŒãã¹ã§ãã¹ããããŠããå Žåãèšå®ã¯ã³ã³ãããŒã«ããã«ã§èšå®ããå¿ èŠããããŸãã
æ€çŽ¢ãšã³ãžã³æé©å
SPAã®æ€çŽ¢ãšã³ãžã³ã€ã³ããã¯ã¹ã¯å¥ã®åé¡ã§ãã ãµã€ããã¯ã©ã€ã¢ã³ãåŽã§å®å šã«çæãããå Žåãã€ã³ããã¯ã¹ä»ããäžååã«ãªããŸããããã®ç¹ã«é¢ããŠæè¿æ¹åãããŠããŸãããã€ã³ããã¯ã¹äœææã«ããããåŸã ã«JavaScriptãå®è¡ãå§ããŠããŸãã
ãã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯æ¬¡ã®ãšããã§ããããŒãžã®ã¹ãããã·ã§ããã¯ãããå°çšã«çæãããŸãã ããŒãžã¯ãHTML5 History APIã䜿çšãããã©ããã«å¿ããŠç°ãªãæ¹æ³ã§çæããå¿ èŠããããŸãã
ããã·ã¥ãã©ã°ã¡ã³ãã®å Žåã GoogleãšYandexã¯åãã¢ãããŒããæäŸããŸãããå®ãã¢ãã¬ã¹ãšãä»®æ³ãã¢ãã¬ã¹ãåé¢ããã«ã¯ããïŒãã®ä»£ããã«ãïŒïŒãã䜿çšããŸãã æ€çŽ¢ãããã¯ããã®ãããªåºåãèšå·ãä»ãããªã³ã¯ãèŠãŠãURLã§ç¹å¥ãªã¯ãšãªãã©ã¡ãŒã¿ãŒã_escaped_fragment_ãã䜿çšããããã·ã¥ã®åŸã«ç¶ãã¢ãã¬ã¹ã®äžéšããã®äžã«å ¥ããŸãã
WebãµãŒããŒã¯ããã®ãããªãªã¯ãšã¹ããç¹å¥ã«åŠçããããããã€ã³ããã¯ã¹ãäœæã§ããããã«å®å šãªHTMLããŒãžãã¬ã³ããªã³ã°ããå¿ èŠããããŸãã ïŒæšæºã®ãïŒãã®åŸã®URLã®éšåã¯HTTPãªã¯ãšã¹ãã®äžéšã§ã¯ãªãããããããå¿ èŠã«ãªããŸããïŒãŸããç¹å¥ãªã¡ã¿ã¿ã°ïŒäžèšã®ãªã³ã¯ãåç §ïŒã䜿çšããããšãæšå¥šãããŸãã äžéšã®ããŒãžã«ã¯ãïŒïŒãã®ãªã³ã¯ãå«ãŸããŠããªãå ŽåããããŸãã
ã¢ãã¬ã¹æå®ã«å®å šãªURLã䜿çšãããŠããå Žåããµã€ããã€ã³ããã¯ã¹å¯èœã«ããã®ã¯ããã«ç°¡åã§ããæå®ãããã¢ãã¬ã¹ã«å¯Ÿå¿ãããµãŒããŒäžã§ããŒãžãçæããã ãã§ãã ãµã€ãã蚪åãããããã¯ãã³ã³ãã³ããå«ãããŒãžãåãåããæ£åžžã«ã€ã³ããã¯ã¹ãäœæããŸãã
ãµã€ãããã©ãŠã¶ãŒã§éããŠããå ŽåãããŒãžã¯æåã«HTMLããŒã¯ã¢ããã«åŸã£ãŠè¡šç€ºããã次ã«JavaScriptãäœçšããŸãã ãªã³ã¯ãããã«ã¯ãªãã¯ããŠããããŒãžã¯ãªããŒããããŸããã ãã®åäœã¯ããªã³ã¯ãã¯ãªãã¯ããŠã€ãã³ããã€ã³ã¿ãŒã»ãããããã€ãã£ãåäœããã£ã³ã»ã«ããããšã§å®è£ ã§ããŸãã ãã®å Žåããããã¯ãªã³ã¯ïŒãhrefãå±æ§ïŒããã©ãããã¹ãŠã®é·ç§»ãå¶åŸ¡ããå¿ èŠã«å¿ããŠã€ãã³ããåŠçã§ããŸãã
ãŸãããã®ã¢ãããŒãã«ããããµã€ãã®èªã¿èŸŒã¿é床ãæé©åã§ããããšã«æ³šæããŠãã ããïŒææ°ã®ãã©ãŠã¶ã¯ããµãŒããŒããã®HTMLãããé«éã«ã¬ã³ããªã³ã°ããJavaScriptã¹ã¯ãªããã®èªã¿èŸŒã¿ã解æãDOMã«ããããŒãžã®ã¬ã³ããªã³ã°ã«éåžžããæéãããããŸãã
DOMãšçŽæ¥æ©èœããJavaScriptã³ãŒãã®ã¿ã䜿çšããŠHTMLããŒãžãçæããã«ã¯ã©ãããã°ããã§ããïŒ ãããè¡ãã«ã¯ããã€ãã®æ¹æ³ããããŸãã
ãŸãã PhantomJS ïŒããã¯APIã§ç®¡çãããããããããããã¬ã¹ãWebKitããŒã¹ã®ãã©ãŠã¶ãŒïŒãã€ã³ã¹ããŒã«ããããŒãžã¹ãããã·ã§ãããçæããããã«æ§æã§ããŸãïŒå®éã®äŸãåç § ïŒã
第äºã«ã prerenderããŒã«ãŸãã¯Prerenderer.ioãµãŒãã¹ã䜿çšã§ããŸããããããPhantomJSã«åºã¥ããŠããŸãã
第äžã«ãäžéšã®ææ°ã®ãã¬ãŒã ã¯ãŒã¯ïŒããšãã°DerbyJSãReact ïŒã§ã¯ããã®é¢æ°ã¯æ¢ã«å®è£ ãããŠããŸãïŒããã®äŸãåç §ããŠãã ããïŒ react-server-example ïŒã
ã¹ã宿æ³æœèš
SPAããã¹ãã§ããçŸä»£ã®ã€ã³ã¿ãŒãããã«ã¯å€ãã®ãµã€ãããããŸãã æã人æ°ã®ãããã®ãèããŠãã ããã
Dropbox
æãç°¡åãªãªãã·ã§ã³ã¯ã Dropbox㧠SPAããã¹ãããããšã§ãã ãããè¡ãã«ã¯ãDropboxãããªãã¯ãã£ã¬ã¯ããªã«SPAçšã®ãã£ã¬ã¯ããªãäœæãããã®äžã«å¿ èŠãªãã¡ã€ã«ããã¹ãŠé 眮ããŠãããindex.htmlãã¡ã€ã«ãéžæããããŠã¹ã®å³ãã¿ã³ãã¯ãªãã¯ããŠã³ã³ããã¹ãã¡ãã¥ãŒãåŒã³åºããŸãã ã¡ãã¥ãŒã§ããDropboxâå ±æãªã³ã¯ããéžæããŸãã ãã®åŸããªã³ã¯ãäœæãããã¯ãªããããŒãã«ã³ããŒãããŸããããã«ããããã©ãŠã¶ãä»ããŠã¢ããªã±ãŒã·ã§ã³ã䜿çšã§ããããã«ãªããŸãã
æè¿ãDropboxã§ãµã€ãããã¹ãããæ©èœãæ¡åŒµããè©Šã¿ãè¡ãããŸããïŒããã«ã€ããŠã¯ãããšãã°ãã¡ããã芧ãã ãã ïŒã ãã ãããããã¯äž»ãªåé¡ã解決ããŸãããDropboxã¯ããããªãã¯ãªã³ã¯ã«éåžžã«å³ããïŒå®å šãªãããã¯ãŸã§ïŒãã©ãã£ãã¯å¶éããããŸãã ãããã£ãŠã説æãããŠãããªãã·ã§ã³ã¯ãå人ãååã«SPAã瀺ãããã«ã®ã¿æšå¥šã§ããŸãã
GithubããŒãž
GitHub Pagesã¯ãéçãµã€ãããã³SPAããã¹ãããããã®ç¡æãµã€ãã§ãã GitHubããŒãžã§SPAããã¹ãããã«ã¯ãGitHubã§SPAã®ãªããžããªãäœæããProject Pagesã®gh-pagesãã©ã³ããŸãã¯User / Organization Pagesã®masterãã©ã³ãã«éçãã¡ã€ã«ãé 眮ããå¿ èŠããããŸãã è¡ããããã¹ãŠã®å€æŽã¯ããã®ãªããžããªã«ã³ãããããå¿ èŠããããŸãã ãã詳现ãªæ å ±ã¯ã å ¬åŒããã¥ã¡ã³ãã«ãããŸã ã
ããããã«ãŒã³
ããããã«ãŒã³ -æ°ãããµãŒãã¹ã§ããããã§ã«éåžžã«äººæ°ããããŸãã
åç»é²ãŠãŒã¶ãŒã«ã¯ã10 MBã®ç©ºããã£ã¹ã¯å®¹éãæäŸãããŸãã SPAãé 眮ããã«ã¯ãå¿ èŠãªãã¡ã€ã«ããã¹ãŠã¢ããããŒãããŸãã ãã®ãµãŒãã¹ã¯ãJSãHTMLãCSSãèªåçã«çž®å°ããCDNãæ¥ç¶ããŸãã
ãã¬ãã¢ã ã¢ã«ãŠã³ãã¯æé¡5ãã«ã§ãã ææã¢ã«ãŠã³ãã®ææè ã¯ãããŸããŸãªè¿œå æ©èœãå©çšã§ããŸã-ç¹ã«ãç¬èªã®ãã¡ã€ã³ãæ¥ç¶ããããŸããŸãªå€éšãµãŒãã¹ãæ¥ç¶ããŸãã
ã»ã¬ã¯ã¿ãŒã¹ãã¬ãŒãž
åœç€Ÿã®ã¯ã©ãŠãã¹ãã¬ãŒãžã¯ãSPAããã¹ãããããã®äŸ¿å©ãªãã©ãããã©ãŒã ã§ãã äžè¬ã«ãSPAã®é 眮æé ã¯ã以åã®æçš¿ã®ããããã§æ¢ã«èšè¿°ããéçãµã€ããé 眮ããæé ãšã»ãšãã©å€ãããŸããã 次ã®æé ãå«ãŸããŸãã
- ãããªãã¯ã³ã³ããã®äœæãšãã¡ã€ã³ã®ã¢ã¿ããïŒäžèšã®ãªã³ã¯ã¯ãã¹ãŠã詳现ã«èª¬æããŠããŸãããããã«ã€ããŠã¯è©³ãã説æããŸããã
- ç¹å¥ããŒãžã®ã«ã¹ã¿ãã€ãºïŒã»ããã¢ããæé ãæè¿æ¹åãããŸããã ååšããªãããŒãžã®åŠçãã«ã¹ã¿ãã€ãºãããã1ã€ã®ãªãã·ã§ã³ãè¿œå ããŸããïŒããšã©ãŒ404ïŒããŒãžãïŒã ããã§ãååšããªãããŒãžãèŠæ±ãããšãã«è¡šç€ºããããã¡ã€ã«ãæå®ããå¥ã®URLãžã®ãªãã€ã¬ã¯ãã¯è¡ããªãäžæ¹ã§ããã®ããŒãžã®å¿çã³ãŒãïŒ200ãŸãã¯404ïŒãèšå®ã§ããŸãã
ããã«ãããå®å šãªURLã䜿çšã§ããŸãïŒHistory APIã»ã¯ã·ã§ã³ãåç §ïŒã
ä»ã®ãµã€ãïŒäžèšã®ãã®ãå«ãïŒã«å¯Ÿããåœç€Ÿã®ã¹ãã¬ãŒãžã®ééããªãå©ç¹ã«ã¯ãäœã³ã¹ãã§æè»ãªæ¯æãã·ã¹ãã ïŒåºå®æéãªããæ¯æãã¯ä¿åãããããŒã¿ãšçºä¿¡ãã©ãã£ãã¯ã®éã«å¯ŸããŠã®ã¿è«æ±ãããŸã- ããã§èšç®ã§ããŸã ïŒãããã³CDNã®å¯çšæ§ã³ã³ããããã³ãã¡ã€ã«ã®ã¢ããããŒããã©ã¡ãŒã¿ãèšå®ããããã®æè»ãªã·ã¹ãã ã
ãããã«
ãã®èšäºã§ã¯ãã¹ãã¬ãŒãžãåäžããŒãžãµã€ãããã¹ãããããã®ãã©ãããã©ãŒã ãšããŠäœ¿çšããå¥ã®åŽé¢ã«ã€ããŠèª¬æããŸããã ãããããªãã®åœ¹ã«ç«ã€ããšãé¡ã£ãŠããŸã
æ¢ã«åœç€Ÿã®ã¹ãã¬ãŒãžæœèšã䜿çšããŠSPAããã¹ãããŠããå Žåã¯ãçµéšãå°è±¡ãå ±æããŠãã ããã
äœããã®çç±ã§ããã«ã³ã¡ã³ããæçš¿ã§ããªãèªè ã¯ãç§ãã¡ã®ããã°ã«åå ããŠãã ãã ã