ããªããæ°ãããããžã§ã¯ãã«ç§»ããããšæ³åããŠã¿ãŸãããã ãŸãã¯ãä»äºãå€ããŠãããžã§ã¯ãã«ã€ããŠèããã ãã§ãã ããªãã¯è·å Žã«åº§ã£ãŠããããŒãžã£ãŒãããªãã®ãšããã«æ¥ãŠãæãæ¯ã£ãŠ...ããã«ããããžã§ã¯ãããŒãžãéããã¢ãã¿ãŒãæã§çªããŠããä»åŸã®ã€ãã³ãXã«ã€ããŠã®ã€ã³ãã©ãŒããŒããæ¿å
¥ããããã«èŠæ±ããŸãã ãã®äžã§ããªãã¯...äœããã¹ããïŒ ã©ãããå§ããŸããïŒ ãã€ã³ãã©ãŒããŒããäœæããã«ã¯ïŒ é©åãªãã³ãã¬ãŒãã¯ã©ãã«ãããŸããïŒ ãããŠãä»ã®åé¡ã®æµ·ã
ã«ããã®äžã«ã¯ããããã®ããã»ã¹ãæŽçããæ¹æ³ãSPAãæºåããããã«äœæããããŒã«ã«ã€ããŠã®ã¹ããŒãªãŒããããŸãã ããã«ãLive Coding / Hot Reloadã®å®è£
ã®æè¡çãªè©³çŽ°ãããã³VirtualDomãšReact with Angularã«ã€ããŠãå°ã説æããŸãã
å§ããŸãããã ãã®ãããããã§ã¯ãããžã§ã¯ããæ®ãããŠããŸããããŒã ãªãŒããŒã¯ããªããžããªã®å ŽæãæããŠãããREADME.mdãèªãã§ãããã§çµããã§ãã
README.md
ããã¯ãããžã§ã¯ãã«æ²¡é ãããšãã®åºçºç¹ã§ãããåºæ¬çãªæ
å ±ãæäŸããŸãïŒ
- ã€ã³ã¹ããŒã« -ããã§ã¯ãããã¶ã€ããŒãã§ãã§ããããã«ãããžã§ã¯ããéå§ããæ¹æ³ããã¹ãŠèª¬æããŸãã
- èµ·å -ãããžã§ã¯ããèµ·åããããã®åºæ¬çãªã³ãã³ãã®äŸã
- èµ·åãªãã·ã§ã³ -ãã¹ãŠã®å¯èœãªãã©ã¡ãŒã¿ãŒãšãã®èª¬æã®ãªã¹ãã
- ãæåã®ã¹ãããã -å®éãããã¯æ£ããã»ã¯ã·ã§ã³ã§ãã
- UIãããã¯ã®ã¯ã€ãã¯æ€çŽ¢-ã¢ããªã±ãŒã·ã§ã³ãæºåããããã®ããŒã«ã®èª¬æã
- ããªã«ïŒ ã©ãïŒ ãã€ïŒã-ãããžã§ã¯ãæ§é ã®ç°¡åãªèª¬æã
- UIãããã¯ã®äœæ-UIãããã¯ã®äœææ¹æ³ã«é¢ããæå°éã®æ
å ±ã
- ãã¢ããªã±ãŒã·ã§ã³ããžãã¯ããŸãã¯ã€ãã³ãåŠçã®æ€çŽ¢å Žæã
- äŸ/ã¹ã¯ãªãŒã³ãã£ã¹ã-äŸä»ãã®å®éšã»ã¯ã·ã§ã³ã
gitlabã€ã³ã¿ãŒãã§ãŒã¹ã§ã®è¡šç€ºäŸ ãã¹ãŠã«ã€ããŠã®ãã¹ãŠã¯çŽ5åããããŸãã READMEããåŠã¶æãéèŠãªããšïŒå¿
èŠãªåé¡ã解決ããã«ã¯ïŒ
- NodeJS / npmãã€ã³ã¹ããŒã«ããŸãã
- ãããžã§ã¯ããªããžããªã®ã¯ããŒã³ãäœæããŸãã
npm install
ããã³npm start
å®è¡ããŸãã- ãã©ãŠã¶ãŒã§ãããžã§ã¯ããéããå³äžé
ã®ãã¹ãã€ãããã¯ãªãã¯ããŸãã ;]
ããããé çªã«èŠãŠã¿ãŸãããã
èšçœ®
ç§ãã¡ã¯éåžžã«é·ãéãããéçºã䜿çšããŠããŸããããã®ãããå€ãã®éšåïŒããªã声ãšããããããã¿ã¹ã¯ããŠãŒãã£ãªãã£ãUIã³ã³ããŒãã³ããªã©ïŒãå¥ã
ã®npmãŸãã¯jamããã±ãŒãžãšããŠéçºãããŠããŸãã ãã®ã¢ãããŒãã«ããããããžã§ã¯ãéã§å¯èœãªéãã³ãŒããåå©çšã§ããããŒãžã§ã³ç®¡çïŒsemverã«ããïŒãå¯èœã«ãªããŸããããã«ãã¿ã¹ã¯å°çšã®åããã±ãŒãžã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãçµã¿ç«ãŠãããšãã§ããŸãã ãããŠæãéèŠãªããšã¯ãã¬ã¬ã·ãŒã§ã¯ãªããããã±ãŒãžã¯ç¬ç«ããŠãããæçµçã«ã¯åªãããªãŒãã³ãœãŒã¹ã«ãªãå¯èœæ§ãããããšãç¥ã£ãŠããŸãã
ããã«ã
postinstall
ãªã©ã®npmããã¯ã䜿çšããããšãå¿ããªãã§ãã ããã ããã䜿çšããŠã次ã®ãããªgitããã¯ãã€ã³ã¹ããŒã«ããŸãã
- äºåã³ããã-ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã®ç¢ºèªïŒESLintïŒ;
- äºåããã·ã¥-ãã¹ããå®è¡ããŸãã
- ããŒãžåŸ
npm install
ããã³jam install
ãŸãã
æåŸã®ããã¯ã¯å¥åŠã«æãããããããŸããããåçã«æŽæ°ãããå€æ°ã®ããã±ãŒãžãæäœããå Žåããããªãã«ã¯æ¹æ³ããããŸããã
git pull
ãšå
¥åãããšãéçºè
ã¯çŸåšã®ããŒãžã§ã³ã®ãããžã§ã¯ããååŸããå¿
èŠããããŸããããã¯ã
npm install
匷å¶çã«å®è¡ããããšã«ãã£ãŠã®ã¿å®çŸã§ããŸãã
ãããžã§ã¯ããnpmãŸãã¯å¥ã®ãµãŒãããŒãã£ã®ããã±ãŒãžãããŒãžã£ãŒã«äŸåããŠããå Žåã¯ãããŒã«ã«ã¬ãžã¹ããªã管çããŠãå€éšã®äžçãšãã®åé¡ïŒå·ŠããããRoskomnadzorãªã©ïŒã«äŸåããªãããã«ããŸãã
æã¡äžã
npm start
ã¯ç¥ã£ãŠããå¿
èŠããããã¹ãŠã§ãããããŒãã®äžã«ãããã®ã¯é¢ä¿ãããŸããïŒgulpãgruntãwebpack ... README.mdã«ã¯ã¹ã¿ãŒãã¢ãããã©ã¡ãŒã¿ã®èª¬æãããããšãæ¢ã«æžããŠããŸãïŒèµ·åæã«ãã¢ããªã±ãŒã·ã§ã³ã¯README.mdãèªã¿åãããªãã·ã§ã³ã®ãªã¹ãã解æããã³ãã®èª¬æãããã³äžæãªãªãã·ã§ã³ãŸãã¯ææžåãããŠããªããªãã·ã§ã³ã䜿çšãããšããšã©ãŒãã¹ããŒãããŸãã ããã¯ãããã¥ã¡ã³ãã®åé¡ã解決ããç°¡åãªæ¹æ³ã§ãã説æãªã-ãªãã·ã§ã³ãªãã
èµ·åäŸïŒ
npm start -- --xhr --auth=oauth --build > project-name@0.1.0 start /git/project-name/ > node ./ "--xhr" "--auth=oauth" "--build" - : master (Sun Aug 29 2016 10:28:06 GMT+0300 (MSK)) - - xhr: true ( `XMLHttpRequest`) - auth: oauth ( `proxy`, `oauth`, `account`) - build: true ( ) - - 3000 - : localhost:3000
æåã®ã¹ããã
ã¿ã¹ã¯ã«æ»ããŸãããã ãã®ãããREADME.mdãèªã¿èŸŒãŸãããããžã§ã¯ããã€ã³ã¹ããŒã«ãããŠèµ·åããããã¯ã€ãã¯ãããã¯æ€çŽ¢ããŸãã¯ãã¹ãã€ãããŒã«ãããã¹ãŠã®ã¢ã€ãã ã«ç§»åããŸãã
ããããã¯ãã³ã³ããŒãã³ãã®æ§é ãšãã®ãã©ã¡ãŒã¿ãŒãåæããããã®ããŒã«ã§ãã 䜿çšããã«ã¯ããã©ãŠã¶ãéãããã¹ãã€ãããã¯ãªãã¯ããŠãããããŒãžã£ãŒãæãçªãããå ŽæãéžæããŸãã
䜿çšäŸã¹ãã€ãæ€æ»å® ã«ãŒãœã«ã®äžã®ãããã¯ã®æ§é ã瀺ãã€ã³ã¹ãã¯ã¿ãŒããã«ãäžã«è¡šç€ºãããŸãã æ£ãããã®ãèŠã€ãããããããã¯ãªãã¯ããŸãã ããã§ããã¹ãããããããã¯ã®ãã§ãŒã³å
šäœã確èªããããããåŒã³åºããããã¡ã€ã«ãšè¡ã確èªããããšãã§ããŸãã
ãã¡ã€ã«åãã¯ãªãã¯ãããšã... IDEãéããã«ãŒãœã«ãç®çã®è¡ã«é
眮ãããŸãã è¿ãã«ãç®ãããããŸããã¯ãªãã¯ãããšãéžæãããããã¯ã§GUI /ãã¥ãŒã¢ãŒãéããŸãã
ããã§ãã¡ã€ã³ãšã³ããªãã€ã³ããèŠã€ãããŸããããã€ã³ãã©ãŒããŒãã®è¿œå ãå§ããŸãããã
UIãããã¯ã®äœæ
ãããã¯ãäœæããã«ã¯2ã€ã®æ¹æ³ããããŸãïŒã©ã¡ããREADMEã§èª¬æãããŠããŸãïŒã
- ã³ã³ãœãŒã«ããã
- GUIã䜿çšããŸãã
ã³ã³ãœãŒã«ããŒã«ã¯ãGUIã䜿çšã§ããªãå Žåã«å¿
èŠã§ããä»ã®å Žåã¯ãã¹ãŠãGUIã䜿çšããæ¹ã䟿å©ã§èŠèŠçã§ãã
GUI
ããã¯ã衚瀺çšã®Webã€ã³ã¿ãŒãã§ã€ã¹ã§ãããæãéèŠãªããšã¯ããããžã§ã¯ãã®UIãããã¯ãéçºããããšã§ãã 圌ã«ã§ããããšïŒ
- ãã¹ãŠã®ãããã¯ã®ãªã¹ãã衚瀺ããŸãã
- ååãšããŒã¯ãŒãã«ããç°¡åãªæ€çŽ¢ã
- ç¹å®ã®ãããã¯ã®ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã®åºåã
- æ°ãããããã¯ãäœæããŸãã
- ãããã¯ã®ååãå€æŽããŸãã
æåã®ã¹ãããã¯ããããžã§ã¯ãã«ãã®ãããªæ
å ±æäŸè
ããããã©ããã調ã¹ãããšã§ãã æ€çŽ¢ã䜿çšããŠãåæ§ã®ãããã¯ãèŠã€ãããã¹ãã€ããã䜿çšããŠãã®æ§é ã調ã¹ãã+ããæŒããæ°ãããããã¯ã®ååãå
¥åãããOKããã¯ãªãã¯ããŸãããã®åŸãGUIãäœæããããããã¯ã®ãã¥ãŒãéããŸãã åã³ã¹ãã€ãããŒã«ã䜿çšããIDEãéããŠcss / template / jsãç·šéããŸãã
ããã§äœãèµ·ãã£ãã®ã§ããïŒ ãOKããã¿ã³ãã¯ãªãã¯ãããšãGUIã¯å
žåçãªãããã¯ãæã€ãã©ã«ããŒãäœæããŸããããã¯ãã¢ãŒããã¯ãã£ã§ã¯å°ãªããšã4ã€ã®ãã¡ã€ã«ã§æ§æãããŠããŸãã
- block-name .html-ãããã¯ãã³ãã¬ãŒã
<div></div>
- ãããã¯å.scss-ã¹ã¿ã€ã«
.block-name { padding: 10px; background: red; }
- ãããã¯å.js-åäœã®èª¬æ
import feast from 'feast'; import template from 'feast-tpl!./block-name'; import styleSheet from 'feast-css!./block-name'; export default feast.Block.extend({ name: 'block-name', template, styleSheet });
- block-name .spec.js-ã©ã®ãŠãŒã¹ã±ãŒã¹ãæ§ç¯ããããã«åºã¥ãä»æ§
export default { 'base': { attrs: {} } };
ãããã®ãã¡ã€ã«ãç·šéãããšãããŒãžããªããŒãããã«ãã¹ãŠã®å€æŽãé©çšãããŸãã ããã¯åãªããã¡ãã·ã§ã³ã®æ¥œãã¿ã§ã¯ãªããæéã倧å¹
ã«ç¯çŽã§ããŸãã ãããã¯ã«ã¯ããžãã¯ãå«ããããšãã§ããããããªããŒãã§ã¯çŸåšã®ç¶æ
ã倱ããªãããã«ããããšãã§ããŸããããã¯F5 / cmd + rã§çºçããŸãã ãã³ãã¬ãŒããç·šéããå Žåã§ããæ¥ç¶ããããããã¯ã¯èªåçã«æŽæ°ãããŸãã èšãæããã°ãGUIã¯ããªãã«ãšã£ãŠã¡ãã£ãšããããã°ã©ãã³ã°ã§ãã ;]
ãã®ããããããžã§ã¯ãã«ã€ããŠã»ãšãã©äœãç¥ããªããŠããæ°ãããããã¯ãè¿œå ã§ããŸãã éåžžã®ã¿ã¹ã¯ãå®äºããããã«äœããã¡ãŒãã«ãã®ããã¥ã¡ã³ããèªãå¿
èŠã¯ãããŸããã ããããããã¯ãããã¡ãŒãã«ããäžèŠã§ããããšãæå³ãããã®ã§ã¯ãããŸããïŒå¿
èŠãªå Žåã§ã-ã¡ã€ã³ã®ã¡ã³ãããŒãªãã§ãããžã§ã¯ãã®ç¥èãšç掻ãæ·±ããããã«ã ããšãã°ãAPIãšããžãã¹ããžãã¯ã䜿çšããããã«ãå
éšJSSDKãããããã®ããã¥ã¡ã³ãã¯JSDoc3ã«åºã¥ããŠçæãããŸãã
ãããŸãšã
ãããžã§ã¯ãã®ããã¥ã¡ã³ããšã³ãŒãããŒã¹ãæ£ããåŠç¿ããå¿
èŠããããŸããããã§ã«åŸ¹åºçãªæ²¡å
¥ã®æ®µéã§ãæåã¯å
žåçãªã¿ã¹ã¯ãå®è¡ããã·ããªãªãèšè¿°ããã ãã§ååã§ãã ãã®ãããªæ瀺ã¯ç°¡åã§çŽæçã§ãªããã°ãªããŸããã èªååã§ãããã¹ãŠãèªååããŸãã ã芧ã®ãšããããã®å Žåããããã¯ãäœæããã ãã§ã¯ãããŸãããèªååã¯ããããžã§ã¯ãã®ã€ã³ã¹ããŒã«ãããã¯ãããã±ãŒãžã®æŽæ°ãªã©ããå§ãŸããŸãããããžã§ã¯ãã«å
¥ãã®ã¯ç°¡åã§æ¥œããã¯ãã§ãã]
æè¡éš
ç§ã¯é ãããå°ãå§ããŸãã 2012幎ã®åãã«ãç¬èªã®Festãã³ãã¬ãŒããšã³ãžã³ãäœæããŸããã 圌ã¯XMLããã¯ã©ã€ã¢ã³ããšãµãŒããŒã§äœ¿çšã§ããjsé¢æ°ã«å€æããŸããã ãã®é¢æ°ã¯ãã©ã¡ãŒã¿ãŒãªããžã§ã¯ããåãåããæååãè¿ããŸããïŒã¯ã©ã·ãã¯jsãã³ãã¬ãŒããšã³ãžã³ã å
åŒãšã¯ç°ãªãããã®æ©èœã¯åœæéåžžã«æé©åãããŠããããã以å䜿çšããŠããCãã³ãã¬ãŒããšã³ãžã³ã®ããã©ãŒãã³ã¹ãéæããçŽç²ãªV8ã§å®è¡ã§ããŸããã
[XML -> JSFUNC -> STRING -> DOM]
ãã®éãFestã«åºã¥ããŠãäžåºŠã«è€æ°ã®ãããžã§ã¯ãïŒã¡ãŒã«ãã¯ã©ãŠããªã©ïŒã§äœ¿çšããããããã¯ã®å
éšã©ã€ãã©ãªãéçºããŸããã ã€ãŸãããã¿ã³ãå
¥åããã©ãŒã ããªã¹ããªã©ãå
±éããŠããŸãã å®éããããã¯ã¬ã€ã¢ãŠããšã³ã³ããŒãã³ããæ§é åããæåã®ã¹ãããã§ããã
Festã¯æååã®ã¿ãè¿ãããã次ã®2ã€ã®æ¹æ³ã§ç¶æ
ãæŽæ°ã§ããŸããããã¹ãŠãåæç»ããããŸãã¯ãJSããDOMãç¹ããšã«åŠçããããšããæ¹æ³ã§ãã
ãã¡ãããäž¡æ¹ã®ã¢ãããŒãã䜿çšããå¿
èŠããããŸãããã¹ãŠãåæç»ããæ¹ãç°¡åã§é«éãªå Žåã1ã€ã®CSSã¯ã©ã¹ã®ã¿ãå€æŽããå¿
èŠãããå Žåã§ãã äžè¬ã«ãæååãçæãããã³ãã¬ãŒããšã³ãžã³ã䜿çšããå Žåãé·æãšçæããããå€ãã®äººãèããããã«ãããã¯æ±ºããŠããã©ãŒãã³ã¹ã§ã¯ãããŸããã äž»ãªåé¡ãããã€ããããŸãã
- ãã¹ãŠãåæç»-ã€ãã³ãã®ååæåãå¿
èŠãªDOMãã©ã°ã¡ã³ããžã®ãªã³ã¯ã®åååŸãç»åã®ãç¹æ»
ããªã©
- ãã€ã³ãã€ã³ãã¯ã-ããžãã¯ããŒãããŠéè€ããéçºãè€éã«ãªããŸãã
ãããã£ãŠãç§ãã¡ã¯å
ã«é²ã¿å§ããŸããããæ¢è£œã®ã³ã³ããŒãã³ãã®æå°éã®æžãæãã®å¯èœæ§ããããŸããã
å€ãã®å®éšããããŸããã Angularã«éåžžã«ãã䌌ãããŒã¿ãã€ã³ãã£ã³ã°ãå
¥åããããšããŸãããããããšã¯ç°ãªããFestã¯ãŸã æååãè¿ããDOMã«æ¿å
¥ãããåŸã«ããŒã¿ãã€ã³ãã£ã³ã°ã課ãããŸããã ããã«ãããå
ã®é床ãç¶æããV8ã§äœæ¥ããããšãã§ããŸããã æ®å¿µãªããã倧èŠæš¡ãªãªã¹ãã§ã¯ãala- $ãã€ãžã§ã¹ãã§ã¢ã³ã®ã¥ã©ãŒãšåãåé¡ãäŸç¶ãšããŠãããŸããããå®è£
ã¯å°ãéããªããŸããïŒã¿ã¹ã¯ã®äžéšãšããŠïŒã
ãããŠãReactã¯åžå Žã«åå
¥ããVirtualDomãæäŸããŠãããŸããã ãã³ãããŒã¯ã®åŸãç§ã¯å°ããã£ããããŸãããåºæ¬çãªãæåã®ãªã¹ããã¯ãç§ãã¡ã®ãã®ãããçŽ3åé
ãããšãå€æããŸããïŒãããŠãããã¯å®è£
ãåæžãããã®ã§ãïŒã ããã«ãã³ãŒããæžãæãããã¯ãããŸããã§ãããããã³ãã¬ãŒããæŽæ°ãããšããååã®ã¿ã眮ãæããŸããã ããããéã®è£å°ããããŸãïŒReactã¯jsã³ãã¥ããã£å
šäœã«åŒŸã¿ãã€ãããŸããªãããã³ã®ããã«ãvdomã®ä»£æ¿å®è£
ãå¢å ãå§ããŸããïŒ
Incremental DOM ã
morphdom ã
Deku ã
mithril ã
Bobrilãªã©ã
åé¡ã¯å°ãããŸãŸã§ãããã¿ã¹ã¯ã®ãã³ãããŒã¯ãå®æœããã«ã¯ãé©åãªãã®ãéžæãããã³ãã¬ãŒãã®ãã©ã³ã¹ããŒã¿ãŒãäœæããŸãã
[XHTML -> JSFUNC -> VDOM? -> DOM]
ããããäž»ãªç®æšã¯ããããã¯ã®æãå¿«é©ãªéçºãåŸãããšã§ããïŒ
- ãããã¯ãäœæã衚瀺ããã¹ãããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã
- ã©ã€ãã³ãŒãã£ã³ã°ïŒCSS / HTML / JSïŒã
- ãããã¯ã®äœæ/ç·šéã®èªååã
- ã³ã³ããŒãã³ãæ€æ»ããŒã«ã
- ã³ã³ããŒãã³ãéã®é¢ä¿ã®èŠèŠåã
ããã«ãçŸåšã®ãããã¯ã©ã€ãã©ãªãžã®GUI / Webã€ã³ã¿ãŒãã§ã€ã¹ãæ¢ã«ãããŸããåãããžã§ã¯ããç¹ã«èŠåŽããããšãªãGUIãå±éã§ããããã«ãã¢ã€ãã¢ãçµ±äžããã ãã§ãã
éçº
ã©ã€ãã³ãŒãã£ã³ã°
WebpackãšBrowserSyncãäœã§ãããã¯èª°ããç¥ã£ãŠããŸãã ãããã«ã€ããŠã¯å€ãã®ããšãæžãããŠããã®ã§ããããã«çŠç¹ãåœãŠãããšã¯ããŸããããå¥ã®æ¹æ³ã瀺ããŸããããã¯ã¹åããããœãªã¥ãŒã·ã§ã³ãããªãã«ãµãããããªãå Žåã®å¯ŸåŠæ¹æ³ã§ãã è»èŒªã®åçºæã匷ããå§ãããã€ããã¯ãããŸããã決ããŠãããã¯åãªãäœã¬ãã«ã®ãªãã·ã§ã³ã§ãããå€ãã®äººãå¿ããŠãåãWebpackãããã蟌ããããšã«å€ãã®æéãè²»ãããŠããŸãã
ãã®å Žåãå¿
èŠãªã®ã¯
node-watch + socket.ioã ãã§ãã ãããžã§ã¯ãã«ç°¡åã«çµ±åã§ããæ¢è£œã®2ã€ã®ããŒã«ã
const fs = require('fs'); const http = require('http'); const watch = require('node-watch'); const socket = require('socket.io'); cosnt PORT = 1234; const app = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'html/text'}); res.end(); }); const io = socket(app); app.listen(PORT, () => { watch('path/to', {recursive: true}, (file) => { fs.readFile(file, (err, content) => { const ext = file.split('.').pop(); io.emit(`file-changed:${ext}`, {file, content}); }); }); });
<script src=â//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.ioâ></script> <script> const io = io(location.protocol + '//' + location.host) socket.on('file-changed:html, function (data) { // data.file, data.content }); </script>
以äžã§ãã¯ã©ã€ã¢ã³ãã§å€æŽãåä¿¡ã§ããããã«ãªããŸããã
å®éã«ã¯ããã¹ãŠããã®ããã«èŠããŸãããäžèšã®ãªã¹ããšã®äž»ãªéãã¯ãã¯ã©ã€ã¢ã³ãã«æ»ãéã®JSãšCSSã®ååŠçã§ãã ã¯ããæ£ç¢ºã«ã Webpackãšã¯ç°ãªããéçºç°å¢ã§ã¯ã®ã£ã³ã°ã¯äœ¿çšãããããã¡ã€ã«ã¯ãªã³ããã³ãã§å€æãããŸãã
ããããããã¯æŽæ°
ãã§ã¹ãã«æ°ããªåœãå¹ã蟌ãã«ã¯ãvdomãæäœããããã®ã©ã€ãã©ãªãéžæããxhtml / xmlã®ãã©ã³ã¹ãã€ã©ãŒãäœæããå®è£
ã®åé¡ãèæ
®ããŠãããã解決ããå¿
èŠããããŸããã
äœã®åé¡ïŒ ããšãã°ãæ°ããæ©èœïŒæ§ç¯/ã¿ã°åŠçïŒãè¿œå ããã«ã¯ãã©ã€ãã©ãªã«å€æŽãå ããŠããŒãžã§ã³ãäžããå¿
èŠããããŸããã ããã«ããã³ãã¬ãŒãã¯ãµãŒããŒäžã§ã®ã¿ã³ã³ãã€ã«ã§ããŸãã
ããã§ããã¡ããããããŸããã ;]
ãŸããxml / xhtmlãJSFUNCã«å€æããŸããããã®é¢æ°ã¯æååã§ã¯ãªããcitojsã«æž¡ãããJSONïŒããã¯vdomãæäœããããã®éåžžã«é«éã§ã·ã³ãã«ãªã©ã€ãã©ãªïŒãè¿ããcitojsã¯vdomãæ¢ã«æ§ç¯ãŸãã¯æŽæ°ããŠããŸãã
ããã«ããã³ãã¬ãŒãã¯ã¯ã©ã€ã¢ã³ãäžã§çŽæ¥ã³ã³ãã€ã«ãããããããã³ãã¬ãŒãã¯ããã®ãŸãŸãäžããããã¯ã©ã€ã¢ã³ãäžã§ãŸãASTã«å€æããã次ã«å€æèŠåã«åŸã£ãŠJSFUNCã«å€æãããŸãã
ããšãã°ã `fnïŒfor`ã¿ã°ãå€æããã«ãŒã«ã¯æ¬¡ã®ããã«ãªããŸã ããã«ãããããã€ãã®åé¡ãäžåºŠã«è§£æ±ºã§ããŸããã
- ã³ã³ãã€ã«ããããã®ãµãŒããŒã¯ããå¿
èŠãããŸããã
- äœåãªhtmlã§ããã³ã³ãã€ã«ãããJSãããå°ãã
- å€æã«ãŒã«ã¯ãã®å Žã§è£å®ã§ããŸãã
- æ倧ã¡ã¿æ
å ±ã
ãããã£ãŠãæ°ããhtmlãã¯ã©ã€ã¢ã³ãã§åä¿¡ããããšãåã³JSé¢æ°ã«å€æããããã®ãã³ãã¬ãŒãã«åºã¥ããŠäœæããããã¹ãŠã®ãããã¯ã®ã¬ã³ãã©ãŒãåŒã³åºãããŸãã
socket.on('file-changed:html', (data) => { const updatedFile = data.file; feast.Block.all.some(Block => { if (updatedFile === Block.prototype.template.file) { const template = feast.parse(data.content, updatedFile); Block.setTemplate(template); Block.getInstances().forEach(block => block.render()); return true; } }); });
CSSã®å Žåãããžãã¯ã¯ã»ãŒåãã§ããäž»ãªå€æŽç¹ã¯ãCSSã¢ãžã¥ãŒã«ãå°å
¥ããŠãmain.cssã«å¥ããåããã³ã³ããŒãã³ãã³ãŒããšå
±ã«cssãé
ä¿¡ããããšãã»ã¬ã¯ã¿ãŒã亀差ãé£èªåã®å¯èœæ§ããä¿è·ããããšã§ãã
CSSã¢ãžã¥ãŒã«
ã©ããªã«å€§ããèãããŠããããã»ã¹èªäœã¯éåžžã«åçŽã§ããã§ã«ç¥ãããŠããŸããïŒ
ããšãã° ïŒãã䟿å©ãªããŒã«ããªãããããŸãäžè¬çã§ã¯ãããŸããã postcssãšwebpackã®åºçŸã«ããããã¹ãŠãå€ãããŸããã å®è£
ã«ç§»ãåã«ããããReactãAngular2ãªã©ã®ä»ã®ãŠãŒã¶ãŒã«ãšã£ãŠã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
React + Webpack
import React from 'react'; import styles from './button.css'; export default class Button extends React.Component { render () { return <button className={styles.btn}> <span className={styles.icon}><Icon name={this.props.icon}/></span> <span className={styles.text}>{this.props.value}</span> </button>; } }
React + webpack + react-css-modules
import React from 'react'; import CSSModules from 'react-css-modules'; import styles from './button.css'; class Button extends React.Component { render () { return <button styleName='btn'> <span styleName='icon'><Icon name={this.props.icon}/></span> <span styleName='text'>{this.props.value}</span> </button>; } } export default CSSModules(Button, styles); @CSSModules(styles) export default class Button extends React.Component { // ... }
Angular2
Reactãšã¯ç°ãªããAngularã¯ããã«äœ¿ããã¢ãžã¥ãŒã«æ§ããµããŒãããŠããŸãã ããã©ã«ãã§ã¯ããã¹ãŠã®ã»ã¬ã¯ã¿ãŒã«äžæã®å±æ§ã®åœ¢åŒã§ç¹ç°æ§ãè¿œå ãããŸãããç¹å®ã®ããã©ã°ããèšå®ãããšãã·ã£ããŠdomã䜿çšãããŸãã
@Component({ selector: `my-app`, template: `<div class="app">{{text}}</div>`, styles: [`.app { ... }`]
ç§ãã¡ã®ãªãã·ã§ã³ã¯ãã®äžéã§ãããã³ãã¬ãŒããç¹å¥ã«æºåããå¿
èŠã¯ãããŸãããcssãããŒãããŠãããã¯ã®èª¬æã«è¿œå ããã ãã§ãã
import feast from 'feast'; import template from 'feast-tpl!./button.html'; import styleSheet from 'feast-css!./button.css'; export default feast.Block.extend({ name: 'button', template, styleSheet, });
ããã«ã眮æã¯ã©ã¹ã ãã§ãªããæ¬æ Œçãªã€ã³ã©ã€ã³ã¹ã¿ã€ã«ãåããå®éšçãªãã©ã³ãããããŸãã ããã¯ã匱ãããã€ã¹ïŒTVãªã©ïŒã§äœæ¥ããå Žåã«åœ¹ç«ã¡ãŸãã
å®éããã©ã³ãèªäœã¯æ¬¡ã®ããã«ãªããŸãã
const file = "path/to/file.css"; fetch(file) .then(res => res.text()) .then(cssText => toCSSModule(file, cssText)) .then(updateCSSModuleAndRerenderBlocks) ; function toModule(file, cssText) { const exports = {}; cssText = cssText.replace(R_CSS_SELECTOR, (_, name) => { exports[name] = simpleHash(url + name); return '.' + exports[name]; }); return {file, cssText, exports}; }
ã芧ã®ãšããããŸã£ããéæ³ã§ã¯ãããŸããããã¹ãŠãéåžžã«ãããµãããã®ã§ããããã¹ããšããŠcssãååŸãããã¹ãŠã®ã»ã¬ã¯ã¿ãŒãèŠã€ããŸããåçŽãªã¢ã«ãŽãªãºã ã䜿çšããŠããã·ã¥ãšèŠãªãããšã¯ã¹ããŒããªããžã§ã¯ã[å
ã®åå] => [æ°ãã]ã«ä¿åããŸãã
æãèå³æ·±ãã®ã¯ãJSã圌ã®äœãåé¡ãªã®ã§ããããïŒ
JS /ããããªããŒã
äŸãèããŠã¿ãŸãããã ã¯ã©ã¹
Foo
ããããšããŸãããïŒ
class Foo { constructor(value) { this.value = value; } log() { console.log(`Foo: ${this.value}`, this instanceof Foo); } }
ããã«ã³ãŒãã®ã©ããã«ïŒ
var foo = new Foo(123); foo.log();
次ã«ã
NewFoo
ã®å®è£
ãæŽæ°ããããšã«ã
NewFoo
ã
class NewFoo { constructor(value) { this.value = value; } log() { console.log(`NewFoo: ${this.value}`, this instanceof NewFoo); } });
ã¯ããæ¢ã«äœæãããã€ã³ã¹ã¿ã³ã¹ã¯åŒãç¶ãæ£åžžã«åäœããŸãã
foo.log();
ãã®ããªãã¯ãå®è¡ããããã«ãååŠçã¯å¿
èŠãããŸãããååãªJSïŒ
function replaceClass(OldClass, NewClass) { const newProto = NewClass.prototype; OldClass.prototype.__proto__ = newProto;
ã¯ãããããæ©èœå
šäœã10è¡ã§ã-JSããããªããŒãã®æºåãã§ããŸããã ã»ãŒã ç§ã¯ç¹ã«ãã®æ©èœããªãŒããŒããŒãããŸããã§ããããæ¬è³ªã ãã瀺ããŸããã è¯ãæ¹æ³ã§ãå€ãã¡ãœãããããŒã¯ããå¿
èŠããããŸãããå€ãã¡ãœããã¯åé€ãããŠããŸããã
ããããåé¡ããããŸãïŒ]
replaceClass(Foo, class NewFoo { }); foo.constructor === Foo;
解決ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
- åŒãç¶ãWebpackã䜿çšããã¯ã©ã¹äœæãç¹å¥ãªã©ãããŒã§ã©ããããäœæãããã¯ã©ã¹ãè¿ããæŽæ°ããŸãã
createClass('MyClassName', {...});
ãªã©ã®ã¯ã©ã¹ãäœæããããã«ãã€ã³ãã£ã³ã°ãé©çšããŸãcreateClass('MyClassName', {...});
ã- ãããã·ã䜿çšããããšãã§ããŸãããããã§ã¯ååŠçãå¿
èŠã«ãªããŸã
ãã®çµæãã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸãã
socket.on('file-changed:js', (data) => { const updatedFile = data.file; new Function('define', data.content)(hotDefine); });
hotDefine
ã¯ãã¹ãŠã®éæ³ãè¡ããŸãïŒèŠæ±ããããªããžã§ã¯ãïŒããšãã°ããã¡ããïŒã®ä»£ããã«ãå
ã®ãªããžã§ã¯ãã§ã¯ãªããå®è£
ãæŽæ°ããç¹å¥ãª
FeastHotUpdater
è¿ããŸãã
ã³ãŒãåââæããŒã«
äŸã§ç€ºããããã«ãçŸæç¹ã§ã¯ããã©ãŠã¶ãŒããçŽæ¥èŠçŽ ãæ€æ»ã§ããã¡ã€ã³ããŒã«ã¯ã¹ãã€ãã§ãã åªããæ©èœã®1ã€ã¯ãIDEã§ç®çã®ãã¡ã€ã«ãéãããšã§ãã ãã®ããã«ãRoman Dvornov
lahmatiy / open-in-editorã®çŽ æŽãããã©ã€ãã©ãª
ã䜿çšãããŸãïŒ
const openInEditor = require('open-in-editor'); const editor = openInEditor.configure( {editor: 'phpstorm'}, (err) => console.error('Something went wrong: ' + err) ); editor.open('path/to/file.js:3:10') .catch(err => { console.error('[open-in-editor] Ooops:', err); });
Romanã«ã¯ã
ReactãšBackboneãæ€æ»ããããã®åæ§ã®
ã³ã³ããŒãã³ãããããŸãã ;]
Romanã®ã³ã³ããŒãã³ãã€ã³ã¹ãã¯ã¿ãŒã®äŸ ReactãEmberãAngularãBackboneã«ç²ŸéããŠãã人ã¯ãReact Developer ToolsãEmber InspectãBatarandãBackbone Debuggerãªã©ã®ãœãªã¥ãŒã·ã§ã³ãããç¥ã£ãŠããŸããããã
ã¯ãã¹ãŠãç¶æ³ã
åæããããã®
DevToolsæ¡åŒµæ©èœã§ãã
æåã¯ãç§ã®èšç»ã§ã¯ãŸãã«æ¡åŒµæ©èœã§ããããChrome APIã®å©ç¹ã¯ããã«äŸããããäžèšã®æ¡åŒµæ©èœã¯ãã¹ãŠgithubã«ãããããåžžã«å®è£
ã確èªã§ããŸãã
ããããæ®å¿µãªããããŠãŒã¶ãŒã«æ¡åŒµæ©èœãæäŸããããšã¯äžå¯èœã§ãããéåžžã«å€ãã®å Žåãååã ãã§ãªããã·ã³ã®åé¡ã調æ»ããå¿
èŠããããŸãã ãããã£ãŠããããŸã§ã®ãšãããåèµ·åããã«ãã©ãŠã¶ã§æ倧ã®æ
å ±ãååŸã§ããããŒã«ã«éäžããŸããã ã¯ã©ã€ã¢ã³ãã§ãã³ãã¬ãŒããã³ã³ãã€ã«ããããšã®é
åããã¹ãŠæããã«ãªããŸãã2ã€ã®ã¢ã»ã³ããªïŒcombatãšdevïŒã¯å¿
èŠãããŸãããã¢ã»ã³ããªã¯åžžã«1ã€ã§ããããããã°ãããšãã³ã³ããŒãã³ãã«é¢ãããã¹ãŠã®å¯èœãªã¡ã¿æ
å ±ãåžžã«ååŸãããŸãã
ä»ã«äœïŒ
ãã®ã³ã°
ãã°ã¯åžžã«çºçããŸã-ããã¯åé¡ã§ã¯ãããŸããã åã«äœãèµ·ãã£ãã®ãç解ã§ããªãå Žåã¯ãã©ãã«ã ãã®ããããã®ã³ã°ã«å€ãã®æ³šæãæã£ãŠããŸãã çæ³çãªç¶æ³ã¯ãæŠéäžã«ãã€ã§ãã³ã³ãœãŒã«ãéããŠãã¢ã¯ã·ã§ã³åŸã«äœãèµ·ãã£ãããç解ã§ããå Žåã§ãã
ã³ãŒãã«ãã¬ããž
ã»ãšãã©ã®å Žåãããã¯å®éšã«ãããŸããããæåãã¹ãã®å質ã確èªããããã«äœ¿çšã§ããŸãã ã€ã¹ã¿ã³ããŒã«ãååŸããã³ãŒããå®è¡ããŠãã¹ããã·ã³ã«ããŒã«ããNç§ããšã«ãã°ã«ãã¬ããžãããããããŸãã ãã®ããã«ç°¡åãªæ¹æ³ã§ããã¹ã¿ãŒçšã®ã¹ã¯ãªãããæ©èœæ§ãã«ããŒããŠãããã©ããã«ããããããã¹ã¯ãªãããã©ãã ãããŸãæžãããŠãããã確èªã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³æ§é ã®åæ
ããã«ãã¢ããªã±ãŒã·ã§ã³ã倧ãããªããåå²ãããã®æ§é ãç解ã§ããªããªããšã ãããæåã®è©Šã¿ã§ãã;]
ã¢ããªã±ãŒã·ã§ã³ã®æ§é ãèŠèŠåããæåã®è©Šã¿ , : , . (, ).
, , ; , . â (, , ).
Timeline
, , , â DevTools Timeline. , (, , . .). , , . timeline ( ).
ãããã«
, , , , , â . , «». , bash- . , , , . , , . , React, Vue, Ember, Angular, â Live Coding, Dev Tools . , React
react-storybook .
PS .