翻蚳è ããïŒ David Heinemeyer Hanssonã¯ã圌ãšåœŒã®Ruby on RailsããŒã ãç¬èªã®Javascriptãã¬ãŒã ã¯ãŒã¯ãéçºããçç±ã«ã€ããŠçãããã¹ããæžããŸããã å ã®ããã¹ãã¯ ãæ°ãããããžã§ã¯ãã®ãªããžããªã«é 眮ãããŸã
2æ4æ¥æŽæ° ïŒå ã®èšäºã¯Basecampããã°ã§å ¬åŒã«å ¬éãããŸããã ãªãªãžãã«ãšã¿ã€ãã«ãžã®ãªã³ã¯ãæŽæ°
Basecampã§å€ãã®JavascriptãäœæããŸãããçŸä»£çãªæå³ã§ã®ãJavaScriptã¢ããªã±ãŒã·ã§ã³ãã®äœæã«ã¯äœ¿çšããŸããã ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã¯ãµãŒããŒåŽã®HTMLãã¬ã³ããªã³ã°ããjavascriptã¹ãã©ãã·ã¥ã远å ããŠãããã«åœãå¹ã蟌ã¿ãŸãã
ãããé倧ãªäžæå²©ã®éã§ãã Basecampã¯ããã€ãã£ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãå«ãå€ãã®ãã©ãããã©ãŒã ã§å®è¡ãããRuby on Railsã§äœæãããåäžã®ã³ã³ãããŒã©ãŒããã¥ãŒãã¢ãã«ã®ã»ãããåããŠããŸãã åäžã®å ŽæããæŽæ°ãããå ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ãæã€ããšã¯ããµããŒããããŠããå€ãã®ãã©ãããã©ãŒã ã«ãããããããå°ããªããŒã ãããŸãæ©èœããããšãä¿èšŒããããã®éµã§ãã
ããã«ãããå€ãè¯ãæä»£ã®ããã«ãçç£æ§ãé«ããããšãã§ããŸãã 忣ã·ã¹ãã ã®æœè±¡åã®å±€ã«ãšããããããšãªããäžäººã®ããã°ã©ããŒãããªãã®é²æ©ãéããããšãã§ããæä»£ã«æ»ããŸãã 誰ããèæ¯ããµãŒããŒåŽãã¯ã©ã€ã¢ã³ãäžã®Javascriptã¢ããªã±ãŒã·ã§ã³çšã®JSONãçæããã ãã«å¶éããŠãããšèããããã«ãªãåã®æä»£ã
ããã¯ãããå Žæã®äžéšã®äººã ã«ãšã£ãŠããã®ãããªã¢ãããŒãã«æå³ããªããšããæå³ã§ã¯ãããŸããã ããããBasecampãªã©ã®å€ãã®ã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ãžã®äž»ãªã¢ãããŒããšããŠãããã¯äžè¬ã«åçŽããšçç£æ§ã®èгç¹ããã¯åŸéã§ãã
ãŸããããã¯ã1ããŒãžã®JavaScriptã¢ããªã±ãŒã·ã§ã³ã®é åžãå©çããããããªãã£ãããšãæå³ãããã®ã§ã¯ãããŸããã ãããã¯ãé床ãããåçãªã€ã³ã¿ãŒãã§ãŒã¹ãããã³ããŒãžå šäœã®ãªããŒãã®èªç±ããããããŸããã
ãŸããBasecampã«ãã®ãããªæèŠãæ±ããŠããŸããã ãŸãã§çŸ€ãã®æèŠã«åŸã£ãŠãããã®ããã«èŠããããã«ãã¯ã©ã€ã¢ã³ãã¬ã³ããªã³ã°ã§ãã¹ãŠãæžãçŽãããã¢ãã€ã«ã§å®å šã«ãã€ãã£ããªã¢ããªã±ãŒã·ã§ã³ã«åãæ¿ããŸããã
ãã®æ¬²æ±ãã TurbolinksãšStimulusãšããäºéã®ãœãªã¥ãŒã·ã§ã³ã«ã€ãªãããŸããã
ã¿ãŒããªã³ã¯ã¢ãããåºæ¿ããŠã³
è¬èãªJavaScriptãã¬ãŒã ã¯ãŒã¯ã§ããStimulusã«é²ãåã«ãTurbolinksã®ç®çã«ã€ããŠç°¡åã«èª¬æããŸãã
Turbolinksã¯ãGitHubã§éçºãããããããpjaxããæ¥ãŠããŸãã åºæ¬çãªèãæ¹ã¯å€ãããŸããã ããŒãžå šäœã®ãªããŒããé ãããã«èŠããã®ã¯ããã©ãŠã¶ããµãŒããŒããéä¿¡ãããHTMLãåŠçããã®ãé£ããããã§ã¯ãããŸããã ãã©ãŠã¶ã¯æ¬åœã«åªããŠãããé«éã§ãã éåžžãHTMLã³ã³ãã³ããé¡äŒŒã®JSONããã倧ãããšããäºå®ãéèŠã§ã¯ãããŸããïŒç¹ã«gzipãèæ ®ïŒã ããããäž»ãªçç±ã¯ãCSSãšJavascriptãååæåããããŒãžã«åé©çšããå¿ èŠãããããšã§ãã ãã¡ã€ã«ããã£ãã·ã¥ãããŠãããã©ããã«é¢ä¿ãªãã é©åãªCSSãšJavaScriptãµã€ãºãããå Žåãããã¯é ããªãå¯èœæ§ããããŸãã
ãã®ååæåãåé¿ããããã«ãTurbolinksã¯ãåäžããŒãžã¢ããªã±ãŒã·ã§ã³ããããè¡ãããã«ãããã»ã¹ãäžå®ã«ä¿ã¡ãŸãã ããããåºæ¬çã«ãããã¯ç®ã«èŠããªãããã»ã¹ã§ãã ãªã³ã¯ããã£ããããAjaxçµç±ã§æ°ããããŒãžãèªã¿èŸŒã¿ãŸãã ãµãŒããŒã¯ãŸã å®å šãªHTMLããã¥ã¡ã³ããè¿ããŸãã
ãã®æŠç¥ã ãã§ãã¢ããªã±ãŒã·ã§ã³ã®ã»ãšãã©ã®ã¢ã¯ã·ã§ã³ãéåžžã«é«éã«ããããšãã§ããŸãïŒãµãŒããŒã100ã200ããªç§ã§å¿çã§ããå Žåãããã¯ãã£ãã·ã³ã°ã§å¯èœã§ãïŒã Basecampã®å Žåãããã«ããããŒãžããã²ãŒã·ã§ã³ã3åã«å éãããŸããã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ãåäžããŒãžã¢ããªã±ãŒã·ã§ã³ã®ã»ãšãã©ã®é·æã§ãã£ãå¿çæ§ãšãã€ãããºã ãéåžžã«æããŸãã
ããããTurbolinksã¯ã¹ããŒãªãŒã®ååã«ãããŸããã å šããŒãžã®å€æŽã¬ãã«ã®äžã«ã¯ãåäžããŒãžå ã®ãã€ããŒã¢ããããŒãããããŸãã èŠçŽ ã®è¡šç€ºãšé衚瀺ãã¯ãªããããŒããžã®ã³ããŒãtodoãªã¹ããžã®æ°ãããšã³ããªã®è¿œå ãããã³ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã§è¡ããã®ä»ã®æäœã
Stimulusã®åãBasecampã¯ããŸããŸãªã¹ã¿ã€ã«ãšãã¿ãŒã³ãçµã¿åãããŠãããã®æ©èœã远å ããŸããã ã³ãŒãã®äžéšã¯jQueryã«ãããåæ§ã®ãµã€ãºã®éšåã¯ããã©JavaScriptãšãã倧ããªãªããžã§ã¯ãæåã·ã¹ãã ã«ãããŸããã ãããã¯ãã¹ãŠãããŒã¿åäœå±æ§ã«äŸåããŠãæç€ºçãªã€ãã³ãåŠçãéããŠé£æºããŸããã
ãã®ãããªæ°ããã³ãŒãã远å ããã®ã¯ç°¡åã§ããããå®å šãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãªããããã€ãã®æ¢åã®èªå®¶è£œã¹ã¿ã€ã«ãšãã¿ãŒã³ã䞊è¡ããŠãããŸããã ããã«ãããã³ãŒããåå©çšããæ°ããéçºè ã«äœããã®çµ±äžçãªã¢ãããŒããæããããšãé£ãããªããŸããã
Stimulusã®3ã€ã®ã³ã¢ã³ã³ã»ãã
Stimulusã¯ããããã®ãã¿ãŒã³ã®ãã¹ãããã³ã³ãããŒã©ãŒãã¢ã¯ã·ã§ã³ãã¿ãŒã²ãããšãã3ã€ã®åºæ¬æŠå¿µãäžå¿ãšãããããããªå°ããªãã¬ãŒã ã¯ãŒã¯ã«ã©ããããŸãã
æå³ããHTMLãåŸã ã«æ¹åããããã«èšèšãããŠããŸãã ãã®ãããåçŽãªãã³ãã¬ãŒãã䜿çšããŠãã©ã®åäœãããã«åœ±é¿ãããã確èªã§ããŸãã 以äžã«äŸã瀺ããŸãã
<div data-controller="clipboard"> PIN: <input data-target="clipboard.source" type="text" value="1234" readonly> <button data-action="clipboard#copy">Copy to Clipboard</button> </div>
ãããèªãã§ãäœãèµ·ãã£ãŠãããã«ã€ããŠããªãè¯ãã¢ã€ãã¢ãåŸãããšãã§ããŸãã åºæ¿ã«ã€ããŠäœãç¥ãããã³ã³ãããŒã©ãŒèªäœã®ã³ãŒããèŠãªããŠãã ããã¯ã»ãšãã©æ¬äŒŒã³ãŒãã«äŒŒãŠããŸãã ããã¯ãããã«ã€ãã³ããã³ãã©ãŒãã¶ãäžããå€éšJavaScriptãã¡ã€ã«ãããHTMLã®äžéšãèªã¿åãããšãšã¯å€§ããç°ãªããŸãã ãŸããå€ãã®ææ°ã®JavaScriptãã¬ãŒã ã¯ãŒã¯ã§å€±ããããšã³ãã£ãã£ã®åé¢ãæäŸããŸãã
ã芧ã®ãšãããStimulusã¯HTMLã®äœæã«ã€ããŠå¿é ããŠããŸããã ããããçŸåšã®HTMLããã¥ã¡ã³ãã«ããã¯ããŸãã ãŸããã»ãšãã©ã®å ŽåãHTMLã¯ãããŒãžãããŒãããïŒæåã®åŒã³åºãïŒããDOMã倿ŽããAjaxãªã¯ãšã¹ããä»ããŠãµãŒããŒã«ã¬ã³ããªã³ã°ãããŸãã
åºæ¿ã¯ãæ¢åã®HTMLããã¥ã¡ã³ãã®æäœã«çŠç¹ãåœãŠãŠããŸãã ããã¯ãèŠçŽ ãé衚瀺ãã¢ãã¡ãŒã·ã§ã³åããŸãã¯åŒ·èª¿è¡šç€ºããCSSã¯ã©ã¹ã远å ããããšãæå³ããå ŽåããããŸãã ããã¯ãã°ã«ãŒãå ã®èŠçŽ ãåé 眮ããããšãæå³ããå ŽåããããŸãã å Žåã«ãã£ãŠã¯ãèŠçŽ ã®ã³ã³ãã³ããæäœããããšãæå³ããŸããããšãã°ãã³ã³ãã³ããšå ±ã«ãã£ãã·ã¥ãããŠããUTCæéãããŒã«ã«ã«å€æããŠãŠãŒã¶ãŒã«è¡šç€ºããããšã§ãã
ãã®ãããªå ŽåãStimulusã§æ°ããDOMèŠçŽ ãäœæããå¿ èŠããããŸãããäœæã¯èªç±ã§ãã å°æ¥çã«ã¯ãããã«ç°¡åã«ããããã«ç ç³ã远å ããããšããããŸãã ãããããããã¯äºæ¬¡çãªã·ããªãªã§ãã äž»ãªçŠç¹ã¯ãèŠçŽ ã®äœæã§ã¯ãªãæäœã§ãã
Stimulusãšã¡ã€ã³ã¹ããªãŒã JavaScriptãã¬ãŒã ã¯ãŒã¯ã®éã
ããã«ãããStimulusã¯ã»ãšãã©ã®ææ°ã®JavaScriptãã¬ãŒã ã¯ãŒã¯ãšã¯å€§ããç°ãªããŸãã ãããã®ã»ãšãã©ãã¹ãŠããäœããã®ãã³ãã¬ãŒãèšèªãä»ããŠJSONãDOMèŠçŽ ã«å€æããããšã«çŠç¹ãåœãŠãŠããŸãã ã»ãšãã©ã®å Žåããããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãJSONãããã³ãã¬ãŒããžã®ã¬ã³ããªã³ã°ã«ãã£ãŠäœæãããèŠçŽ ã®ã¿ã§æºãããã空çœããŒãžãäœæããŸãã
åºæ¿ã¯ç¶æ ã®åé¡ãç°ãªããŸãã ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãJavaScriptãªããžã§ã¯ãå ã®ç¶æ ãç¶æãããã®ç¶æ ã«åºã¥ããŠHTMLãã¬ã³ããªã³ã°ããæ¹æ³ããããŸãã åºæ¿ã¯æ£å察ã§ãã ç¶æ ã¯HTMLã«ä¿åããããããããŒãžã倿Žãããã³ã«ã³ã³ãããŒã©ãŒãç Žæ£ã§ããŸããããã£ãã·ã¥ãããHTMLãå衚瀺ããããšããã«ã³ã³ãããŒã©ãŒãååæåãããŸãã
ããã¯å€§ããç°ãªããã©ãã€ã ã§ãã ææ°ã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããçµéšè±å¯ãªJavaScriptéçºè ã®å€ããã¢ãã¯ãäœæãããšç¢ºä¿¡ããŠããŸãã ãããããããç§ãæŸã£ãŠãããŠãã ããã ã¢ããªã®æžŠãç¶æããããã«å¿ èŠãªè€éããšåŽåãããšãã°React + Reduxã«æºè¶³ããŠããå ŽåãTurbolinks + Stimulusã¯é åçã§ã¯ãããŸããã
ãããäžæ¹ã§ãäœæ¥ããŠãããã®ãçŸä»£ã®ãã¯ãããžãŒã«å«ãŸããŠããè€éããã¢ããªã±ãŒã·ã§ã³ã®åé¢ã®ã¬ãã«ãå¿ èŠãšããªããšæããŠãããªããç§ãã¡ã®ã¢ãããŒãã«æããèŠãã ãã§ãããã
çŸå®äžçããã®åºæ¿ãšé¢é£ããã¢ã€ãã¢
Basecampã§ã¯ããã®ã¢ãŒããã¯ãã£ãBasecampã®ããã€ãã®ããŒãžã§ã³ãä»ã®ã¢ããªã±ãŒã·ã§ã³ã§æ°å¹Žé䜿çšããŠããŸãã GitHubã¯åæ§ã®ã¢ãããŒãã䜿çšããçŽ æŽããã广ããããããŸããã ããã¯ãææ°ã®Webã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«èŠãããã«ã€ããŠã®äž»æµã®çè§£ã«ä»£ãããã®ã§ããã ãã§ãªããé©ãã»ã©ç«¶äºåããããŸãã
å®éãRuby on Railsãè¡ã£ããšãã«Basecampã«ãã£ãç§å¯ã®ææã®ããã«èŠããŸãã çŸä»£ã®äžè¬çãªã¢ãããŒãã¯éåžžã«åçŽã§ãããããå°ãªãåŽåã§ããå€ãã®ããšãã§ãããšæããŠããŸãã
ããã«ãéžæããå¿ èŠãããããŸããã åºæ¿ãšã¿ãŒããªã³ã¯ã¯ãä»ã®ããéãã¢ãããŒããšé£æºããŠéåžžã«å¹æçã§ãã ã¢ããªã±ãŒã·ã§ã³ã®80ïŒ ãè€éãªã€ã³ã¹ããŒã«ã«åãŸããªãå Žåã¯ã2ã³ã³ããŒãã³ããã«ãã詊ããŠãã ããã æ¬¡ã«ãã¢ããªã±ãŒã·ã§ã³ã®å®éã®æ©æµãåããéšåã«éæ©ãé åããŸãã
Basecampã§ã¯ãå¿ èŠã«å¿ããŠãããè€éãªã¢ãããŒããããã€ã䜿çšããŸãã ã«ã¬ã³ããŒæ©èœã¯ã¯ã©ã€ã¢ã³ãåŽã®ã¬ã³ããªã³ã°ã䜿çšããŸãã ç§ãã¡ã®ããã¹ããšãã£ã¿ãŒãTrixã¯ãå®å šã«çµã¿ç«ãŠãããã¯ãŒãããã»ããµã§ãããStimulusã³ã³ãããŒã©ãŒã®æã®ããã«ã¯æå³ããããŸããã
代æ¿ã®æžéãã¬ãŒã ã¯ãŒã¯ã®ãã®ã»ããã¯å¯èœãªéãã§ãã ãã®åçŽãªã¢ãã«ã§ããŸãæ©èœããã»ãšãã©ã®çžäºäœçšã«ã€ããŠãèŠæ±ãšå¿çã®ãã©ãã€ã å ã«ãšã©ãŸãããšã 次ã«ãæå€§ã®å¹æãéæããããšãçã«ããªã£ãŠããé«äŸ¡ãªããŒã«ã䜿çšããŸãã
ãŸã第äžã«ãããã¯ãããåŽåéçŽçãªäž»æµã®ã¢ãããŒãã䜿çšããŠããã倧ããªããŒã ãšã«ãã¬ããžãç«¶ãããå°ããªããŒã ã®ããã®ããŒã«ã®ã»ããã§ãã
圌ã«ãã£ã³ã¹ãäžããŠãã ããïŒ
GiHubãããžã§ã¯ããžã®ãªã³ã¯