More than 5 years have passed since last update.
ClojureScript + re-frame å ¥é
ãªããéååã«æžãããã®ãŸãŸã§ããã®ãŸãŸæŸçœ®ãããŠããã®ã§æãåã£ãŠå ¬éããŸãã
ãã ãäžå®å šãã€å€ãèšäºãªã®ã§åèã«ããéã«ã¯æ³šæããŠãã ããã
ClojureScriptã®Redux+Reactã©ã€ã¯ãªãã¬ãŒã ã¯ãŒã¯re-frameã®å ¥éèšäºã§ãã
察象ãšããèªè
äžèšã®ç¥èãããããšãåæã«ããŠããŸãã
- Clojure
- ç°¡åãªReactã®ç¥è
re-frameãšã¯äœãïŒ
Mike Thompsonæ°ãäœã£ããSPAæ§ç¯ãªã©ã«äœ¿ãããã¬ãŒã ã¯ãŒã¯ã§ãã
Reactã®ã©ãããŒã§ããreagentãUIãªã©ã®ããŒã¹ã«ãRedux颚å³ãªäžæ¹åãªããŒã¿ãããŒãã¬ãŒã ã¯ãŒã¯ã远å ãããã®ã§ãã
âŠãšãã£ãŠãããŸã£ãããã£ãŠéšå€è ã«ãšã£ãŠããããã¥ããããåãReduxããããã£ãŠãªãããç°¡åãªre-frameã§äœãããBMIèšç®æ©ãäŸã«èª¬æããŸãã
äœéãšèº«é·ãå
¥åãããš You BMI is XX. ãæŽæ°ããããšããããšãŠãã·ã³ãã«ãªBMIèšç®æ©ã§ãã
ããããã©ããããµãã«re-frameã§åäœããããšãããšãäžèšã®å³ãã芧ãã ããã
1ã3ã®é ã§ããŒã¿ããããŒããŠããã4ã«ãŠãã¥ãŒãäœã£ãã®ã¡ã5ãªã©ã®ã€ãã³ãã§7ãŸã§ã«ãããŠ1ã«ãŸãå·®ãæãããšãã£ãã°ã«ã°ã«ãšããå³ã§ãã
1ã6ã®é ã«è©³çŽ°èª¬æããŸãã
- ããŒã¿ãããŒã®èµ·ç¹ãã¢ããªã®ç¶æ
ãšãªãapp-dbãšåŒã°ããã¢ããªã®ããŒã¿çœ®ãå Žã§ãã
- ã¢ããªã®å¯å€éšãšãªãããŒã¿ã¯ã»ãŒããã«éçµããŠãããšæã£ãŠãã ããã
- ä»åã§ããã°ãã³ã¢ããŒã¿ã¯äœéãšèº«é·ãªã®ã§ãããã«å ¥ã£ãŠãŸãã
- BMIã¯èšç®çµæ (
= äœé / (èº«é· * 身é·)) ãªã®ã§å ¥ããŠããŸããã
- dbãåç
§ããŠ
weightãheightãèšç®ãããŠããŸããïŒèšç®ãšããããããã ã®å€ã®åç §ã§ããâŠïŒãããã«èšç®ãããweightãheightãåç §ããŠbmiãèšç®ãããŠããŸãã- Excel ã§ããã°ããããªæãâã®ç¶æ
ã§ãã
ð image
-
@ããŒã¯ã¯ Clojure ã®deref(ã¢ãã ã®å€å¥ãã)ã§ããdbãèšç®çµæããèªäœãatomãšããŠè¡šçŸãããŸãã- ããå³å¯ã«ãããšã reagentãæäŸããç¹å¥ãªatomã§ãã å€ã®èšç®å ãšãªã£ãatomãæŽæ°ãããéã«èªèº«ãå€ãå€ããç¹å¥ãªatomã§ãã
- Excel ã§ããã°ããããªæãâã®ç¶æ
ã§ãã
- ãããäžèšã®èšç®ã®å€ãçšããŠãã¥ãŒãæ§ç¯ãããŠããŸãã
- ããã§ããèšç®ã®å€ã¯ã¢ãã ãšããŠæäŸãããã®ã§
@ãå¿ èŠã§ãã - ãã¥ãŒã¯Clojureã®ãã¯ã¿ãããããHTMLã®ã¿ã°ã屿§ã®ããã«æžããŠå®çŸ©ããŸãã (Hiccupã¹ã¿ã€ã«:
[:HTMLã¿ã° {:屿§å 屿§å€ ...} ã¿ã°ã®äžèº«])- æ§é ããèŠãã°ãã»ãŒHTMLãšåææ³ã§ãããReact DOMãå®çŸ©ããŠããHTMLã©ã€ã¯ãªDSLãšåææ³ãšãã£ãã»ããæ£ç¢ºã§ãããããªã®ã§ãæ¬ç©ã®HTMLãšã¯ã¡ãã£ãšããé¢ããéšåããããŸãã
- ããã§ããèšç®ã®å€ã¯ã¢ãã ãšããŠæäŸãããã®ã§
- æ§ç¯ããããã¥ãŒã¯å®éã«ç»é¢äžã«è¡šç€ºãããŸãã
- äžèšã1ã4ã®ããã»ã¹ã§ãapp-dbã®å 容ãHTMLã«å€æãããããšãããããŸãã
- ãšããããšã§ãããã§äžåºåãã§ãã
- ãã ããããã ãã§ã¯ãã ã®HTMLã衚瀺ããã ãã®ã¢ããªã«ãªã£ãŠããŸãã®ã§ãapp-dbã®äžèº«ãå€ããäœããå¿ èŠã§ããïŒâãšããã®ã5以éïŒ
- ãŠãŒã¶ã®å
¥åãªã©ã«ããããã¥ãŒã«æžãã
:on-changeãã³ãã©ãããã³ãã©åŒã³åºããçºç«ããŠããŸãã- ã€ãã³ãçºç«ã¿ã€ãã³ã°ã¯å¥ã«ãŠãŒã¶ã®å ¥åã«ãããããã¿ã€ãã®æéãæ¥ããAjaxã®çµæãè¿ã£ãŠãããªã©è²ã ããã§ãããã
- ãã³ãã©å
ã§æ¬¡ã®æ°ããã¢ããªã®ç¶æ
ãšãªãapp-dbãçæããŠããŸãã
- å
·äœçã«ã¯
dbãšãã³ãã©ã®å€2ã€ãåŒæ°ã«åã£ãŠãæ°ããapp-dbãè¿ã颿°ãã€ãã³ããã³ãã©ãšããŠå®è¡ããŸãã - ããšãã°ã
app-dbãæ°ããäœãããæ¢åã®ãã®ãæžãæããã°ãããããªãããšæããã¡ã§ãããClojureã¯ã€ãã¥ãŒã¿ãã«ãªèšèªãªã®ã§ãå€ã®æžãæããšããæŠå¿µããããŸãããå€ãŸãããšå ¥ãæ¿ãã®ã¿å¯èœã§ãã
- å
·äœçã«ã¯
- æ°ããªapp-dbã¯ç¡äºã次ã®app-dbãšããŠçœ®ãæããããŸã 1ã4 ã®ããã»ã¹ãçµãŠãæ°ããapp-dbã®å€ã«åºã¥ããã¥ãŒãæ§ç¯ãããŸãã
äžèšã®ããã»ã¹ãç·æ¬ãããšã
- äœããã®ã€ãã³ã奿©ã§
app-dbãæžãæããã° - ãã¥ãŒãå šéšãã®éãã«æžãæãã
䟿å©ãªä»çµã¿ãçšæããŠããã®ãre-frameãšãããã¬ãŒã ã¯ãŒã¯ã§ãã
ããããçšèªæŽç
- React: JSã®UIã©ã€ãã©ãªãHTMLç¶ã®DSLãæžãããšã«ãããHTMLãç¬èªã¿ã°ã衚瀺ããããšãã§ããã
- Redux: ããReactãšçµã¿åãããŠäœ¿ããããã¬ãŒã ã¯ãŒã¯ã
- ClojureScript: JSã«å€æå¯èœãªClojureã®ãµãã»ããã
- reagent: ClojureScriptã®UIãã¬ãŒã ã¯ãŒã¯ã®äžã€ãReactãClojureã£ãœã颚å³ã«ã©ããããŠããã
- re-frame: æ¬èšäºã§æ±ã£ãŠããClojureScriptã®ãã¬ãŒã ã¯ãŒã¯ã
- app-db: ã¢ããªã®å éšç¶æ
- subs: app-dbããæŽŸçããŠãã坿¬¡èšç®åŠç
å©ç¹ïŒãªãClojureScriptãre-frameã䜿ãã®ãïŒ
jQueryãããã¥ãŒã®ç®¡çãç°¡å
èŠãŠã®éããapp-dbãšããã¢ãã«ãããã¥ãŒããŸã£ããã²ããåºãã ããªã®ã§ãèŠçŽ ããã©ã£ãŠïŒãã£ã€ãããå¿ èŠãããjQueryããéåžžã«æå¿«ã§ãã
ãããªãã¢ããªã巚倧ã«ãªã£ãŠãã©ãã«ã察åŠã§ãããã§ãã
MVCãã¬ãŒã ã¯ãŒã¯ããæ¥œã¡ã
ã¢ãã«ã®å€æŽããã¥ãŒã«åæ ã§ããMVCãã¬ãŒã ã¯ãŒã¯ãäžæææµè¡ã£ãŠããŸããããã¢ãã«ã®ââã®å€ãå€ãã£ãããããã¥ãŒã®ââãæžãæãããšããæç¶ãã¯ãã£ã±ãé¢åã§ãã
ã€ãã¥ãŒã¿ãã«
äžèšã®ã¡ãªããã ãã ãšãJSã§é 匵ãã°ããããããšæãããããªã®ã§ãClojureScript/re-frameç¹æã®ã¡ãªãããè¿°ã¹ãŠãããŸãã
ClojureScriptã¯ãClojureãªã®ã§ãå€(æ°å€ãæååãã»ããããããããªã¹ããªã©)å šãŠãäžå€ã§ãã
å éšæ§é ãçç¥ããŠãã»ã©éªæªãªããšãããªãéããäžåºŠäœã£ãå€ã¯äœãããŠãæžãæããããšã¯ãããŸããã
app-dbã®äžèº«ãæžãæããããšããŠãæžãæããããšã¯ã§ãããæ°ããå€ã«çœ®ãæãããšããæé ãèšèªã¬ãã«ã§ä¿èšŒãããŠããŸããŸãã
ãã®èšèªã¬ãã«ã§å€ãäžå€ãšããæ§è³ªã¯èšèã«ãããªãé¢ã§ãããªãæèãç°¡ç¥åããŠãããŸãã
äžè¬çã«JSã§èšè¿°ãããReduxã§ã¯ãå€ã®ã€ãã¥ãŒã¿ããªãã£ã¯é 匵ã£ãŠç¢ºä¿ããããã§ãããããŸã詳ãããªãã®ã§ãããã©ããããé¢åãã¯ç¥ããŸããããClojureScriptã§ã¯äœãããªããŠãå€ãå šéšäžå€ãªã®ã¯æ°æ¥œã§ãã
ïŒãšã¯ããã€ã€ãåé¢ããããå€ãæžãæããããªãã®ã¯ãæ¢åã®èšèªçµéšè ã«ãšã£ãŠããã©ããããšããé¢ã§ã倧ãã代åããããŸããïŒ
idiomatic: JSXãšããããªã
åãæåãã®JSXãèŠãæãæŠæ ããŠããŸããŸããã
var Hello = React.createClass({
render: function() {
return (
<div>Hello {this.props.name}</div>
);
}
})
ãèŠæ £ããªãäžçŽç©ãå ¥ã£ãŠãã¥ãããïŒã
èšæ³ãç°¡åã«ãããããšã¯ãããJSã«HTMLã®åœ¢ããããšã€ãªã¢ã³ã¢ã³ã¹ã¿ãŒãå ¥ã£ãŠããŠæåŠåå¿ãèµ·ããããã®ã§ãã
äžæ¹ re-frame(ãšããããreagent)ã§ã¯ãèšèªããé£ã³åºãããšãèªç¶ã«åããã®ã衚çŸå¯èœã§ãã
(defnHello[name](let[](fn[name][:div"Hello "name])))ãªããClojureScriptèªäœãJSäžçã§äžèªç¶ãªèšæ³ãã®ãã®ãšããææã¯åãä»ããŠãããŸããã
idiomatic: ãµãŒããµã€ããšã¯ã©ã€ã¢ã³ããµã€ããåãèšèªã§æ§ç¯å¯èœ
ãµãŒããµã€ãã§Clojureã§Web APIãæ§ç¯ãã¯ã©ã€ã¢ã³ããµã€ãã§ClojureScriptã§UIãæ§ç¯ãããšãã£ãããšãå¯èœã§ãã
ææ³ã䌌éã£ãŠããã工倫ããã°äž¡è ã§ã³ãŒãã®ã·ã§ã¢ãå¯èœã§ãã
ãã¯ã
ClojureScriptã¯Clojureã§æžãããã¯ããçšããããšãã§ããŸãã
ClojureScriptã®ã³ã³ãã€ã«æéå®ã§ãããClojureã«ãããJVMã®èœåããã«ã«çšããèšç®ãå¯èœã§ãã
æ®éã«ãã¯ãããã®ããããè€éãªå€éšãã¡ã€ã«ïŒä»æ§æžãšãïŒãã€ã³ã¯ã«ãŒãããããããã€ã³ã¿ãŒããããåç §ããŠãœãŒã¹åãåºããããããšããæãã§æ®éã®JSãã倢ãå€ãã«ãªã£ãŠãŸãã
REPLç°å¢
ClojureScriptã«ã¯figwheelãšãã£ãREPLç°å¢ãæã£ãŠãããEmacsããçŽæ¥ãã©ãŠã¶ã«ç¹ãã§ãã¡ã€ã«å ã®åŒããã©ãŠã¶äžã§è©äŸ¡ãããããã¢ããªãèªåãªããŒããããŠæŒžæ¬¡çã«éçºãããªã©ãå¯èœã«ãªã£ãŠããŸãã
ããã¯éåžžã«åŒ·åã§ãã
REPLã§ããããªåŒãè©äŸ¡ããã€ã€ãã¿ã€ãã³ã°ããšãã¡ã€ã«ãä¿åããŠãä¿åã®ã®ã¡èªåçã«ç»é¢ã«å€æŽãåæ ãããŠããããšãçŽæ¥ç¢ºèªããªããäœæ¥ã§ããŸãã
ç¹ã«re-frameãçšããŠããå Žåã¯ã¢ããªã®ç¶æ ãã©ããããµãã«ãã¥ãŒã«ãªãã®ãéãã«èŠãªããäœæ¥å¯èœã§ãã
æ¬ ç¹ïŒèŠãã¿ã©ãã
æžãåºããšæ¢ãŸããªãã®ã§ããã€ãâŠ
JavaScriptã§ã¯ãªã
ClojureScriptã¯æçµçã«JavaScriptã«ãªããŸãããJSã®äžçåæã®ããŒã«ãã©ã€ãã©ãªãçšããã®ãããé¢åã§ãã
jQuery("#foo-bar").baz()
ãšããããããjQueryã³ãŒãã§ããã
(doto(js/jQuery"#foo-bar")(.baz))ãšããé¢åãªãã®ã«ãªããŸãã (JSäžçã®ã°ããŒãã«ãªããžã§ã¯ãã®äžã«ã¶ãäžãã£ãŠãããã®ã¯ãjs/ãšããããªãã£ãã¯ã¹ãå¿
èŠã)
ãã®ä»ãJSã§é åã ãšæã£ãŠãããã®ãClojureScriptã§ã¯ã«ãŒããåããªããšããJS<=>Clojureã§ã¯ããŒã¿ã®äºææ§ããªããã倿颿°ããŸããå¿ èŠããããšããCommonJSããªããšããçµå±ã¯å€ã§JSé¢é£ã®Webpackåã矜ç®ã«ãªã£ãŠããšããããããJSã§ã¯ãªãæ ã®èŠãã¿ã©ããã¯åºãŠããŸãã
ããããã¯JSã§ããæžããªããšæã£ãããClojureScriptã§æžãå¿ èŠããªããšãæããŸãã
çµå±ã¯jQueryã®ãäžè©±ã«ãªãããšã¯ãã
Reactã®æ¬ ç¹ãšãã£ãã»ãããããããããŸããããæ¢åã®UIã©ã€ãã©ãªãããšãã°Materializeããããã£ããã®ã¯jQueryãéæéæã«ã³ã³ããŒãã³ãã®åæåã®ããã«åŒã°ããå¿ èŠããã£ããããŸãã
// Call initialization function after its mount.
$(".select-box").material_select();
ãŸãããããªãã䜿ããªãšãã話ã§ãããããã«éããæ¢åã®ãã®ãçµã¿èŸŒãããšãããšãããªããã§ãã
æ¢åã®jQueryã®è³ç£ã¯å€§ããã§ãããããããèªåã§äœãReactã®éšåãäœãæãjQueryã«é Œãããšãããã§ãããã
ãšããããšã§ãå¥ã«Reactã䜿ã£ããããšãã£ãŠjQueryãšäžåçžãåããããã§ã¯ãªãã§ãã
ïŒã¹ãã²ããã£ãçã¿åºããããªjQueryã³ãŒããšã¯çžã¯åããŸããããïŒ
倿°ã®åã¯ïŒåºæ¬çã«ïŒãªã
TypeScriptã®ãããªãã®ã§ã¯ãªãã
æ¥æ¬èªã®æ å ±ãå°ãªã
No English Noã人暩ãçŸç¶ãè±èªãèªããªããšå²ãšæ»ããã§ãããã
ãããŠè»œãèªãããšããŠããéšåŸã®çã®ããã«ã©ã€ãã©ãªããã§ããã§ãçããŠããŠäœäœ¿ã£ããæ£è§£ãªã®ãã¯èª°ãæããŠãããªãã£ãŠããã誰ãæããŠâŠã
ã¡ãªã¿ã«äœè ã¯Slackã«ããŸãã®ã§ã話ãåãããšãå¯èœã§ãã
ClojureScriptã¯å£åClojureã§ãã
ClojureScriptã«ã¯Clojureã®æ©èœã®äžéšãããããŸããã
âŠãšæžãããã®ã®ãããã«ã€ããŠã¯ãã¯ã£ãããã£ãŠå šç¶æ°ã«ãªããªãã§ãã
Clojureããç§»æ€ã§ããªãã»ãããªããããªé£ããæ©èœã¯ãããã䜿ããªãããããã
äž»æµã®éçºç°å¢ã§ãããšããã®Emacsãå°é£ãã
Emacsãèšç·Žãšæ £ããå¿ èŠãªãšãã£ã¿ãªã®ã¯ééããããŸããã
æªåé«ãã»ããã¢ããã«é¢ããŠã¯ãSpacemacsã§éçºç°å¢ã»ããã¢ããããã°å²ãšæ¥œã§ãã
Emacs以å€ã®ç·šéç°å¢ã®éžæè¢ããããŸãããå人çã«ããŸã詳ãããªãã§ããïŒEmacsã䜿ãããªãEmacsãããããããŸãïŒ
å€§èŠæš¡ã®ããæ¹ãåãããªã
TODOã¢ããªã¿ãããªãããããªããã®ã§ã¯ãªããè€æ°äººã§è€æ°ç»é¢ã®å€§äœSPAãæ§ç¯ããããŸãããæ¹ãç¥ã£ãŠãã人ã¯å°ãªããšæããŸãã
çµå±ãä»ã®ãšããèªåã§é©åœã«ã«ãŒã«ãšè¶³ããªãéšåäœã£ãŠãã£ãŠãããããããŸããã
ã»ã
- ããããSPAãšãã顿ãã®ãã®ãé£ãããšæã£ãŠããŸãã
- ããšã¯ClojureScriptå šè¬ããã¡ã€ã«ã巚倧ã«ãªããã¡ã§ããAdvanced compilation ãªã©ããªããšãµã€ãºã»ã³ã·ãã£ããªç°å¢ã§ã¯èŸãã§ãããã
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
