Omã®çŽ¹ä»

ClojureScriptã³ãŒããŒã§ã¯ããããé·ãéç¥ã£ãŠããŸãããã¹ãŠã®ããŒã¿æ§é ã¯äžå€ã§ãããJavaã§èšè¿°ãããClojureã®å
ã®ã³ã¬ã¯ã·ã§ã³ã«åºã¥ããŠããŸãã çŸåšãææ°ã®JavaScriptãšã³ãžã³ã¯éåžžã«æé©åãããŠãããJVMã®0.4å以å
ã§ãããã®ã³ã¬ã¯ã·ã§ã³ã®ããã©ãŒãã³ã¹ããã芳枬ããŠããŸãã
åæ¢ãåæ¢ãåæ¢ã ããããäžå€ããŒã¿æ§é ã®ããã©ãŒãã³ã¹ã¯JavaScript MVCãšäœã®é¢ä¿ããããŸããïŒ -å¿
èŠäžå¯æ¬ ã§ãã
説æããã®ã¯ç°¡åã§ã¯ãªããããããŸããããããã§ãè©ŠããŠã¿ãŸãã å®éãæ°ããOmã©ã€ãã©ãªã§æäŸãããäžå€ã®ããŒã¿æ§é ã«ãããMVC Backbone.jsãªã©ã®äžè¬çãªJS MVCãã¬ãŒã ã¯ãŒã¯ãããã¯ããã«å¹ççã«ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãïŒæåæé©åãªãïŒã Omã¯ãFacebookã®åªãããã¬ãŒã ã¯ãŒã¯
Reactäžã«æ§ç¯ãããŠããŸãã èããããšããªããªã
ãJSConf EU 2013ã®
ãããªãèŠãããšããå§ã
ããŸããèå³æ·±ãäºå®ã¯ãäžå€ã®ã³ã¬ã¯ã·ã§ã³ã®ããã«ãOmã¯Reactãä¿®æ£ãªãã§äœ¿çšããå Žåãããè¯ãçµæã瀺ãããšãã§ãããšããããšã§ãã
以äžã«ç€ºããã³ãããŒã¯ã¯ãOmãUIãæ§ç¯ããããã®äžçæéã®ã©ã€ãã©ãªã§ããããšã蚌æããããã«äœæããããã®ã§ã¯ãããŸããã ãããã¯ãã°ããŒãã«ã«æé©åã§ããªã決å®ãéåžžã«é »ç¹ã«è¡ãããããšã瀺ãããã«äœæãããŸããã ãŸããçŸä»£ã®ãã¬ãŒã ã¯ãŒã¯ã¯ãå€ãã®å ŽåããŠãŒã¶ãŒãããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªãã決å®ãäžãéã«ãå°éã®ããã¥ã¡ã³ããšãã«ããæäŸããŸãã
ãã¡ãããã¢ããªã±ãŒã·ã§ã³ã®åé¡ã次ã
ã«è§£æ±ºããã®ã¯
é¢åã§ãã ãã ããè€éãªã¬ãã«ã®ã³ã³ããŒãã³ãæœè±¡åãæäŸããOmã®ãããªãã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããŸãã ããã«ãããå€ãã®åçŽã§æéã®ãããæåã®æé©åæ¹æ³ãåãé€ãããšãã§ããŸãã
ãã³ãããŒã¯ã²ãŒã
ãã©ãŠã¶ã§
Om TodoMVCãéããæåã®ãã³ãããŒã¯ãèµ·åããŸãã 200åã®ãªã¹ãã¢ã€ãã ãäœæããSafari 7ã®11ã€ã³ãMacbook Airã§120ããªç§ã§å®è¡ããŸãã
Backbone.js TodoMVCãéããåæ§ã®ãã³ãããŒã¯ãå®è¡ããŸãã ç§ã®ãã·ã³ã§ã¯ãããŒãžã¯çŽ500ããªç§ã§ã¬ã³ããªã³ã°ãããŸããã
ChromeãšFirefoxã§ã¯ãOmã¯Backbone.jsã®çŽ2ã4åã®é床ã§çµæã衚瀺ããŸãã
ãã¹ãŠã®ãªã¹ãã¢ã€ãã ãåãæ¿ããããšãããšãOmã¯ããã«åãæ¿ããŸãããåæ§ã®ã¢ã¯ã·ã§ã³ã§Backbone.jsã¯ãããã«ããªãŒãºããŸãã
ãã®éãã¯ã
requestAnimationFrameã€ãã³ãäžã«OmãããŒãžãåæç»ãããããšæãããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã倧å¹
ã«æé©åã§ããŸãã
ãããã®ãã³ãããŒã¯ã«ã€ããŠãChrome Dev Toolsã®ãããã¡ã€ã©ãŒãèŠãŠã¿ãŸãããã æé©åãããŠããªãBackbone.jsãšæ¯èŒããŠãReact / Omã®åæèšå®ã®åäœã«ã¯å€§ããªéãããããŸãã
åå¿/ OmïŒ

Backbone.jsïŒ

ç§ã®æèŠã§ã¯ãReact / Omã°ã©ãã¯ãã°ããŒãã«ãªæé©åãšæ¹åã®æ©äŒãã¯ããã«å€ãããšã瀺ããŠããŸãã
ããããŸããããã°ãããä»äºã§ãïŒ ããããããã§ã... 3ã€ã®äž»èŠãªãã©ãŠã¶ã®çç£æ§ã2ã4ååäžãããšããäºå®ã ãããå€ãã®äººã®é¢å¿ãåŒãã¯ãã§ãã ç¹ã«ãäžå€ã®ããŒã¿æ§é ã®ãããã§ãã®ã¬ãã«ã«éããŠããããšãèæ
®ããŠãã ããã Twitterã§30ã40åã®å¢å ã¯ãããŸããã
次ã«ã2çªç®ã®Omãã³ãããŒã¯ãè©ŠããŠãã ãã-200åã®èŠçŽ ãäœæãã5åãã¹ãŠåãæ¿ããŠããåé€ããŸãã MacBookã®Safari 7ã§ã¯ããã¹ãŠ5msçšåºŠã§çºçããŸãã
次ã«ãBackbone.jsãå®è¡ããŸãã æåã«ãã¹ãŠã®ã¢ã€ãã ãåé€ããŠããã2çªç®ã®ãã³ãããŒã¯ãè©ŠããŠãã ããã ç§ã®ãã·ã³ã§ã¯ãSafariãã©ãŠã¶ãŒã§4200ããªç§å®è¡ãããŸããã
ããã¯ã©ã®ããã«å¯èœã§ããïŒ -ã·ã³ãã«ã
Omã¯ã»ãšãã©äžèŠãªäœæ¥ãè¡ããŸããã ããŒã¿ããã¥ãŒãã³ã³ãããŒã©ãŒããžãã¯ã¯çžäºæ¥ç¶ãããŠããŸããã ããŒã¿ãå€æŽãããšããããã«ããŒãžãã¬ã³ããªã³ã°ããããšã¯ãããŸããã requestAnimationFrameã€ãã³ããŸã§åæç»ã®å€æŽãåã«å»¶æããŸãã åºæ¬çã«ãOmã¯ãã©ãŠã¶ãšããŠGPUãšããŠåäœããŸãã
å€ãã®JS MVCã¢ããªã±ãŒã·ã§ã³ã¯Backbone.js TodoMVCã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã«åŸããã¢ãã«ãšãã¥ãŒã®å€æŽãããã³LocalStorageã§ã®ã¢ããªã±ãŒã·ã§ã³ç¶æ
ã®ã·ãªã¢ã«åãªã©ãä»ã®ç¬ç«ããéšåããªã³ã¯ããŠãããšæ³å®ããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãé©åã«æ§ç¯ããããã«å¿
èŠãªãµããŒããæäŸãããã¬ãŒã ã¯ãŒã¯ã¯ãããã§ãã å®éãã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã¯æååãã³ãã¬ãŒããCSSã»ã¬ã¯ã¿ãŒãããã³DOMã®çŽæ¥æäœã«åºã¥ããŠããããããã®ç¶æ³ã¯é©ãããšã§ã¯ãããŸããã Omã¯ãå Žææåã®ããã°ã©ãã³ã°ã¹ã¿ã€ã«ããã®ä»ã®æœåšçãªããã©ãŒãã³ã¹ã®è匱æ§ã®å
åããã¹ãŠæ®ããŠããŸãã
ãã¡ãããReactã§Backbone.jsãŸãã¯ãæ°ã«å
¥ãã®JS MVCãã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããŸãããããã¯
倧ããªã¡ãªããã® è¯ãçµã¿åããã§ãã ãã ããã€ãã³ãæåã®MVCã·ã¹ãã ã¯ä¿¡ããŠããŸããã ãããŠãäžèšã®ãã³ãããŒã¯ã¯ãããè£ä»ããŠããŸãã ã¢ãã«ãšãã¥ãŒãåé¢ããããšã¯ãæåã®éèŠãªã¹ãããã«ãããŸããã
ããããçŸåšã®JS MVCãã¬ãŒã ã¯ãŒã¯ã®ãã¡ã³ãããã«ã¯ãã€ãã£ãã®JavaScriptãšjQueryã®ã¿ã䜿çšããããšãä¿¡ãã人ã
ã«ãäœããã®èãã®çç±ãäžããããšãé¡ã£ãŠããŸãã äžèšã§ã¯ãããè€éãªã€ã³ã¿ãŒãã§ãŒã¹ãæ§ç¯ããããã«ãé
ãããŒã¿æ§é ã䜿çšããJavaScriptã³ã³ãã€ã«èšèªã競åä»ç€Ÿãããæçµçã«é«éã§ããããšã瀺ããŸããã æè¯ã®çµæã®ãªã¹ãã®äžçªäžã«ããã®ã¯ãä»ã®ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ãšåãæ©èœãåãã
Om TodoMVC ã
æ倧 260è¡ã®ã³ãŒãïŒãã¹ãŠã®ãã³ãã¬ãŒããå«ãïŒã63Kã®gzipå§çž®ããã軜éåã§ãïŒããã«ã¯ãReact-27KãæšæºClojureScriptã©ã€ãã©ãªã core.asyncãã«ãŒãã£ã³ã°ã©ã€ãã©ãªãããã³Google Closureã®ããã€ãã®ãã«ããŒïŒã
JavaScriptéçºè
ã®æ¹ã¯ãReactãããèŠãŠãã ããã å°æ¥ãReactã
moriãªã©ã®æ°žç¶çãªããŒã¿æ§é ã®äœ¿çšãæäŸããã©ã€ãã©ãªã«ãªã³ã¯ãããšãJavaScriptã¢ããªã±ãŒã·ã§ã³ãOmãæäŸããæè»ã§éåžžã«ãã調æŽãããã¢ãŒããã¯ãã£ã«å°ãããšãã§ãããšæããŸãã äžå€ã®ããŒã¿æ§é ã¯ããå€ãã®ã¬ãŒãããžãçæãããšããäºå®ã«ãããããããçŸä»£ã®éçºè
ããã®åé¡ã«å¯ŸåŠããããšãæåŸ
ããŠããŸãã ãŸãããã±ããã«å
¥ããŠæã¡éã¶ããã€ã¹ã®ããã©ãŒãã³ã¹ã¯åžžã«åäžããŠããŸãã
æè¡çãªèª¬æãç¶ããŸãã
ä»çµã¿
DOMããªãŒã®å€æŽãšã¯ãšãªã¯ããã©ãŒãã³ã¹ã®å€§ããªè匱æ§ã§ãããReactã¯è¡šçŸåãç ç²ã«ããŠãããã®å Žæããã€ãã¹ããã¢ãããŒãã䜿çšããŸãã é©åã«èšèšããããªããžã§ã¯ãæåã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãããå
éšãèŠããšãæ©èœããã°ã©ãã®å®çšæ§ã®èŠ³ç¹ããäœæããããœãŒã¹ã衚瀺ãããŸãã DOMããªãŒã®ä»®æ³ããŒãžã§ã³ãçæããã¢ããªã±ãŒã·ã§ã³ã§å€æŽãçºçãããšããã«ãOmã¯DOMããªãŒã®ä»®æ³ããŒãžã§ã³éã®å€æŽãå®æçã«ããŒã¯ããŸãã å®éã®DOMããªãŒã«å¿
èŠãªæå°éã®å€æŽãååŸããããã«äœ¿çšãããŸãã
Reactã«ã¯ãã³ã³ããŒãã³ãã«ãã£ãŠè¡šãããä»®æ³DOMã®éããèšç®ããããã«äœ¿çšããããããªãéèŠãªé¢æ°shouldComponentUpdateããããŸãã falseãè¿ãå ŽåãReactã¯ãã®ã³ã³ããŒãã³ãã®åãèšç®ããŸããã ãããã£ãŠãReactã¯ä»®æ³DOMããªãŒãåŸã
ã«æ§ç¯ããŠãå€æŽãå¿
èŠãªèŠçŽ ã«é¢ããããŒã¿ãååŸããŸãã
JavaScriptéçºè
ã¯éåžžããªããžã§ã¯ããšé
åãå€æŽãããããshouldComponentUpdateã®ããã©ã«ãã®å®è£
ã¯æ§ãããããŸãã ãããã£ãŠãå€æŽãããã³ã³ããŒãã³ãã®ããããã£ã確èªããã«ã¯ããªããžã§ã¯ããšé
åãæåã§ç¢ºèªããå¿
èŠããããŸãã
JavaScriptãªããžã§ã¯ãã䜿çšãã代ããã«ãOmã¯ClojureScriptã®ããŒã¿æ§é ã䜿çšããŸããããã¯ããåãã®ãšãããå€æŽã§ããŸããã ããã«åºã¥ããŠããªã³ã¯ãåçãã©ããã®æéãã§ãã¯ã䜿çšããŠãshouldComponentUpdateãå®è£
ããã³ã³ããŒãã³ããæäŸã§ããŸãã ããã¯ãå€åããæ§é ã察æ°æéã§ãã€ã§ã決å®ã§ããããšãæå³ããŸãã
ãããã£ãŠãsetStateã®ãããªæäœã¯å¿
èŠãããŸãããsetStateã¯ãããªãŒããŒããžã®å¹ççãªæŽæ°ãšãåªãããªããžã§ã¯ãæåã¹ã¿ã€ã«ããµããŒãããããã«äœ¿çšãããŸãã Omã§ããªãŒããŒããæŽæ°ããå Žåã¯ãããããã€ã³ãããéå§ããæ¹ãåžžã«é«éã§ãããªããªããéäžã§ãªã³ã¯ãæ¯èŒããã ãã ããã§ãã
ãŸããããªãŒã®æäžéšããåžžã«åæç»ãããããæŽæ°ã®çµã¿åããã¯ç°¡åã«å®è£
ã§ããŸãã Reactã¯ãããã®ã±ãŒã¹ãåŠçããããã«èšèšãããŠãããããReactãšã®è€åæŽæ°ã®ãµããŒãã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããã
æåŸã«ãããŒã¿ã®åéšåã«ã¯åžžã«åæUIç¶æ
ããããããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®éèŠãªç¶æ
ãåçŽã«ã·ãªã¢ã«åã§ããŸãã Om UIã®ç¶æ
ã¯åžžã«ã·ãªã¢ã«åå¯èœã§ãããããã·ãªã¢ã«åãããã³ã«ã«é¢ããå¿é
ã¯ãããããŸããã
ãŸããOm UIã¯ããã«ã¹ããŒã¿ã¹ãè¿ããŸãã ä»»æã®ç¶æ
ãã¡ã¢ãªã«ç°¡åã«ä¿åã§ãããã€ã§ã奜ããªãšãã«æ»ãããšãã§ããŸãã ClojureScriptã®ããŒã¿æ§é ã¯ã¡ã¢ãªå
±æã䜿çšããŠå®è£
ããããããããã¯ã¡ã¢ãªã®å¹ççãªäœ¿çšã§ãã
æçµçãªèã
çµè«ãšããŠãJavaScript MVCãã¬ãŒã ã¯ãŒã¯ã®çŸåšã®äžä»£ã«ã¯ãå°æ¥å€ãã®å¯èœæ§ããããšã¯æããŸããã 座ã£ãŠèãããšãReact / Omã«äŒŒããã®ãåŸããããšæããŸãã ããã«ãããã·ã³ãã«ããããã©ãŒãã³ã¹ãè¡šçŸåã®æé©ãªãã©ã³ã¹ãå®çŸã§ããŸãã ãããŸã§ç¥ãããŠããªãã£ããã®ã¯äœããããŸãã...ãã©ãŠã¶ããªã¢ãŒãã§ããŒãžãã¬ã³ããªã³ã°ããæ段ãšããŠèªèããããã«ãŽããä¿åããã®ããããã°ããã¹ãŠããã£ãšéãåäœããŸãã ããªãã¿ã®ããã§ããã ã¯ããã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ããã°ã©ãã³ã°ã®ããã«ã