ãšã³ããªãŒ

ãã®æçš¿ã¯ç§ã®æçš¿/èšäºã®è«ççãªç¶ãã§ã- ã©ã®ããã«Angularã æããã®ãæ¢ããã / ã©ã®ããã«Angularãæããã®ãæ¢ããã ã
èªãåã«èªãããšããå§ãããŸãã
çŽ1幎éãç§ãåå ãããã¹ãŠã®ãããžã§ã¯ãã§ãAngularã§ã¯ãªãVueã䜿çšããŠããŸãã
ãã®æçš¿ã§ã¯ãAngularåŸã®äž»ãªå°è±¡ãšéããå
±æããæŠéãããžã§ã¯ãã§Vueã䜿çšããå®éã®çµéšããããã€ãã®ããšã説æããŸãã
åã®æçš¿ã®ç°¡åãªèŠçŽïŒ
ååã®èšäºãæžããæç¹ã§Angularã§æ©ãŸãããäž»ãªåé¡ã®çããªã¹ãã以äžã«ç€ºããŸãã
- æãããã«ãŒã¿ãŒ
- ãããŒãŠã§ã€ãã§å®çšçãªç¡çšã®äŸåæ§æ³šå
¥ïŒä»¥äžãåç
§ïŒ
- éåžžã«ç©è°ãéžãã¢ãžã¥ãŒã«ã·ã¹ãã ïŒä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯äœ¿çšãããŸããïŒ
- å€ãã®äœåãªãã»ãšãã©æçšãªæœè±¡åãå¥åŠãªAPIãã¶ã€ã³
- ãã¬ãŒã ã¯ãŒã¯ã®äžéšãšããŠèгå¯å¯èœ
...
DI
ããã«äŸåæ§æ³šå
¥ã«ã€ããŠäºçŽããå¿
èŠããããŸããVueã«åãæ¿ããåŸã§ããAngularã§ã¯åäœãã¹ãã§å€éšäŸåæ§ããŠã§ããåŠçããæ¹ã䟿å©ã§ããããšã«æ³šæãã䟡å€ããããŸãã
ã³ãŒãããŒã¹ãšå
éšã®ãã¹ããã©ã¯ãã£ã¹ã«å®å
šã«äŸåããŸãããAngularãããVueã§äœããæ¿¡ããã®ãé£ããããšããããããŸãïŒäŸã以äžã«ç€ºããŸãïŒã
ãã ãããããããã³ããšã³ãã§ãã®ãããªå€éšJavaScriptãã¿ãŒã³ã䜿çšããé倧ãªçç±ã ãšã¯æããŸããã
åå¿ã«ã€ããŠ
ãããŠãReactã§ã¯ãªãVueãéžã°ããçç±ã«é¢ãããã1ã€ã®å°ããªèŠåã
å
責äºé
ïŒä»¥äžã®ãã¹ãŠã®ç¹ã¯éåžžã«äž»èгçã§ãïŒãããã£ãŠããããã¯æ¹å€ãšããŠåãåãããã¹ãã§ã¯ãªããå人çãªå€èгãšããŠã®ã¿åãããã¹ãã§ãïŒïŒ
- Vueã§ã®åå¿æ§ã¯ãããã«éåæã§æ©èœããŸããå
ç«æ©èœãã¯ãªãŒã³ãªæ©èœãæ°ã«ããå¿
èŠã¯ãããŸããã
ïŒäžå€æ§ã®æŠå¿µã¯éåžžã«ã¯ãŒã«ã§ããããã°ãã°éåžžã«åé·ã§ã-ã»ãšãã©ã®å Žåãé·ããŠé«äŸ¡ã§ãïŒ - JSXã¯ããã€ãã®çç±ã§äžåºŠã«æªãã§ãïŒ
- HTMLããŒã¯ã¢ããããã¢ããªã±ãŒã·ã§ã³ã³ãŒããžã®ç§»è¡ãé
ã-ããªãäºçްãªããšã«éçºè
ã䜿çšããªããã°ãªããªããã¶ã€ããŒã¯ãç¹ã«ããã§èŠåŽããŸã
- åžžã«ãç¹å¥ãªå¿
èŠããªããŠãããã¹ãŠãå°ããªã³ã³ããŒãã³ãã«åå²ããå¿
èŠããããAngular / Vueã§ã®VSãã³ãã¬ãŒãäœæã«æéãããããŸã-ã³ã³ããŒãã³ãã¯ãã€ã§ãå¿
èŠã«å¿ããŠåãåºãããŸã
- ç¶æ
=çã¿ãšããæ°é®®ãªæãåºããŸã ãããŸã
- å°çã®ãã©ãŒã -詳现ã¯åŸã§
- ç§ã®æèŠã§ã¯ã
reate-react-app
ã¯ãæã人æ°ã®ãããã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§æãæ©èœæ§ã®äœãCLIã§ããReactã¯ãã¯ããã«åŒ·åãªããŒã«ãäœæãã䟡å€ããããŸãã - ç§ãã¡ã®ããŒã ã¯ãAngularã䜿ã£ãããªãè±å¯ãªçµéšããããŸãããå€ãã®åæ§ã®èŠå ã§ãVueã«å
¥ãã®ããã£ãšç°¡åã§ããã
è§åºŠåŸã®éããšå°è±¡
Vueã«åãæ¿ãããšãã«æ°ä»ããäž»ãªéããšå°è±¡ã«ã€ããŠå°ã説æããŸãã
ããã¥ã¡ã³ã
UIãã¬ãŒã ã¯ãŒã¯ãéžæãããšãã«æåã«åºãããã®ã¯ããã¡ããããã¥ã¡ã³ãã§ãã
ç§ã¯Angularããã¥ã¡ã³ããåæ§ç¯ããŸãã
ç®±å
¥ãããã
Vueã§ã¯ãã¯ããã«åçŽã§ãããããããšããèšââããŸããã
äŸããããŸããããªããªã ãããã¯ãã¹ãŠããªãã«ãšã£ãŠäž»èгçãªãã®ã®ããã«æãããããããŸããããããã¯ãèªã¿å§ãããšãããã«äººã
ã®ããã«æžããããšæããŸãã
ãŸããããã¯ã6èšèªã§æžãããŠããããšã泚ç®ã«å€ããŸãããè±èªã§ååã§ãïŒçŸåšãéçºè
ã¯å°ãªããšãèªè§£ã¬ãã«ã§è±èªãç¥ã£ãŠããå¿
èŠããããšæããŸãïŒã
CLI
ååã®èšäºãããAngular CLIãæé«ã ãšæã£ãŠããããšãããããŸããããçµå±ã®ãšããïŒ
- ã«ã¹ã¿ãã€ãºãéåžžã«é£ããå ŽåããããŸãã
- AngularãšCLIã¯ãç°ãªãããŒãžã§ã³ã®å€ãã®
@angular
ããã±ãŒãžãšCLIããã±ãŒãžã«åå²ãããŸããããã¯ãCLI / angularããŒãžã§ã³ãã¢ããã°ã¬ãŒããããšãã«å€§ããªåé¡ã«ã€ãªãããŸãã
ãã§ã«è¡ãããŠããããšã¯ç°¡åã§ã¯ãããŸãã

äžæ¹ãVue CLI 3ã¯ä»æ¥ã§æãã¯ãŒã«ãªCLIã§ãã
- ã«ã¹ã¿ãã€ãºã¯éåžžã«äŸ¿å©ã§ããã©ã°ã€ã³ã·ã¹ãã ã®ãããã§ããã€ã§ãããã±ãŒãžã远å ã§ããŸãã
- webpackã«ããã·ã³ãã«ããšæè»æ§

Zone.js察Vue Reactivity
Angularã¯Zone.jsã䜿çšããŠå€æŽã远跡ããŸããããã¯ã setTimeout
ãããªããã®æšæºAPIã®ãããã§ãã
ããã«ãããç¹å®ã®åé¡ãçºçããŸãã
- éæšæºAPIã®é£ãããæã«ã¯è§£æ±ºãéåžžã«é£ãã
- æãããçè·¡
- äžè¬çã«ç§èŠã§ã¯ãããã¯ããã¯ã§ãããæããšã¬ã¬ã³ããªãã®ããã¯çšé ã
Vueã¯Zone.jsãå¿
èŠãšããŸããã远跡ã¯ããã¹ãŠã®ããŒã¿/ç¶æ
ããããã£ãObserverã«å€æããããšã§æ©èœããŸãã
ããæãããçš®ãèŠãŠã圌ã¯éæ³ããªãã£ãããšã«å€å°åæºããŠããŸããã
æäžäœã§ã¯ããã¹ãŠãç°¡åã§ããVueã¯Object.definePropertyãä»ããŠãã¹ãŠã®ããããã£ãééãïŒãã®ããIE8以äžã¯ãµããŒããããŸããïŒãã²ãã¿ãŒãšã»ãã¿ãŒã远å ããŸãã
远å ãããã®ãããããŸãã...
ãã ãããã®ã¢ãããŒãã«ã¯èœãšã穎ããããŸããã 説æãéåžžã«ç°¡åã§çè§£ããããã§ãã
ããã«ãçè§£ã¯JSèªäœã®äžæ žã§ããVueã»ã©ã§ã¯ãããŸããã
Vueã§ã¯ãæ¢åã®ã€ã³ã¹ã¿ã³ã¹ã«æ°ããã«ãŒããªã¢ã¯ãã£ãããããã£ãåçã«è¿œå ããããšã¯ã§ããŸããã ãã ããVue.setïŒãªããžã§ã¯ããããŒãå€ïŒã¡ãœããã䜿çšããŠããã¹ãããããªããžã§ã¯ãã«ãªã¢ã¯ãã£ãããããã£ã远å ã§ããŸãã
var vm = new Vue({ data: { a: 1 } })
ããŒãžã§ã³2.6以éãVueã§ããããã®åé¡ãçºçããªãããšã«æ³šæããŠãã ããã ãããã·ãžã®ç§»è¡ãè¡ãããããããã£ã®è¿œå /åé€ã远跡ã§ããããã«ãªããŸãã
Rxããã³ç¶æ
管ç
Angularã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®äžæ žã¯RxJSã§ããããã¹ãŠãObservableã§ãã
Rxã«å¯Ÿããç§ã®æã«ãããããããç§ãšå€ãã®äººã¯ãRxãæ¬åœã«Angularå
ã§å¿
èŠãã©ããã«ã€ããŠè³ªåãããŸããã
ç¹ã«æåã¯ãå€ãã®äººã.toPromise()
ãä»ããŠObservableã.toPromise()
ã
ãšã«ãããAngularèªäœã®è€éãã«å ããŠãäžè¬çãªããŒã¿ãã¹ã®ã¢ã€ãã¢ã¯çè§£ããã®ãæãç°¡åã§ã¯ãããŸããã
åæã«ãAngularã¯éåžžã«å€§èŠæš¡ãªãã¬ãŒã ã¯ãŒã¯ã§ãããããçŸåšæã人æ°ã®ããããŒã¿ç®¡çãã¿ãŒã³ã§ããState Managementã®ããã«äœ¿çšå¯èœãªå®è£
ãæäŸããŸããã
NgRxããããŸãã ãããã¯ããã»ã©åã«å®å
šã«äœ¿çšå¯èœã«ãªããŸããã§ãã-çµæãšããŠãReduxã®ãããªã¹ãã¢ã®ã«ã¹ã¿ã å®è£
ãæã€å€ããããžã§ã¯ããããããŸãã
ãããŠä»ãVueã«ã€ããŠã
RxJSãã¡ã³ã¯ãæ°ããããã±ãŒãžã远å ããã ãã§ããã€ã§ãç°¡åã«ãã©ã°ã€ã³ã§ããŸãã
ãã§ã«Vue-Rxããã ãããŒã¿ãšãšãã«RxJS Observabl'yã䜿çšã§ããŸãã
åœå®¶ç®¡çã«ã€ããŠè©±ããšãçŽ æŽãããå
¬åŒVuexããããŸãã
ããæãç§ã¯éåžžã«é©ããŠã圌以å€ã«ãèšå€§ãªæ°ã®éžæè¢ãããããšãçºèŠããŸããã

ç«ã¡å¯ã
å®éãããã¯äž»ãªå©ç¹ïŒèª°ãã«æ¬ ç¹ãããããã«èŠãããããããŸãããïŒãVueã§ãããšããã§ã-å¿
èŠã«å¿ããŠãã¹ãŠãæ¥ç¶ã§ããŸãã
远å ããã ãã§ãïŒ
æ°Ž- Rxjs
- ãŽãšãã¯ã¹
- TypeScript
- SCSS
...
äžè¶³ããŠããŠããåžžã«ç°¡åãã€è¿
éã«çµ±åãããŸãã
ã«ãŒã¿ãŒ
Angularããåããæãæ·±å»ãªç²Ÿç¥çæå·ã®1ã€ã®çç±ã¯ãã«ãŒã¿ãŒã§ãã
圌ã¯ãã§ã«3å察å¿ããŠãããšããäºå®ã«ããããããã圌ã¯ãŸã ã²ã©ãã§ã ïŒã¯ããç§ã¯ç¹°ãè¿ããŸãïŒã
圌ã®ãã¹ãŠã®åé¡ã詳现ã«èª¬æããããã§ã¯ãããŸãããããã®ãããã¯ã¯çã¿ã䌎ãã®ã§ãç°¡åã«èª¬æããŸãã
- ååä»ãã«ãŒãã¯ãããŸããïŒïŒïŒ-æãå¥åŠãªæ±ºå®ã®1ã€ã¯ãååä»ãã«ãŒããåé€ããããšã§ãããããã«ãããè€éãªã¢ããªã±ãŒã·ã§ã³ããµããŒãããå©äŸ¿æ§ãäœäžããããšããããŸããã
- ã¿ã€ãããšã«ç¢ºèªããå¿
èŠãããå¥åŠãªã€ãã³ãã·ã¹ãã
- ã«ãŒããã©ã¡ãŒã¿ãObservableã«å€æãã-ã³ã³ããŒãã³ãã®èµ·åæã«1åã ãå¿
èŠãªå Žåãã«ãŒããã©ã¡ãŒã¿ãæäœããã®ã¯éåžžã«äžäŸ¿ãªå ŽåããããŸã
- ããã²ãŒã·ã§ã³ã®ããã«ã ããŒã ãèæ¡ãããŸãããéåžžã«å¥åŠã§ããŸãæçšã§ã¯ãªããœãªã¥ãŒã·ã§ã³ã§ãããã«ãŒã¿ãŒã§ã¯äœ¿çšãããªããªããŸãã
- TypeScriptã®ã¿ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã§ã®ã¢ãžã¥ãŒã«ã®æåååã«ããé
å»¶èªã¿èŸŒã¿...ã³ã¡ã³ããªã
...ãªã©
äžŠã¹æ¿ããèŠããšããããã®åé¡ã®å€ããã«ãŒã¿ãŒã®è€éããšæ©èœã«é¢é£ããŠããããšãããããŸãã
ã€ãŸããããŒã ã®ããã«å¥åŠãªæ±ºå®ããªããŠããæ©èœã®æ°ã¯äŸç¶ãšããŠé£ãããªããŸãã
Vueã§ã¯ãã«ãŒã¿ãŒã¯éåžžã«ã·ã³ãã«ã§åäœããŸãã
ç°¡åã«èšãã°ãAngularã«ç²ŸéããŠããabstract: true
ãã©ã¡ãŒã¿ãŒãäžåºŠãèŠã€ãããªãã£ãããšã«èšåããå¿
èŠããããŸãã
ãã³ãã¬ãŒããªãã§ããã«ã«ãŒããäœæããããšã¯ã§ããŸããããããã¯1è¡ã®ã³ãŒãã§è§£æ±ºãããŸã-次ã®ãããªã³ã³ããŒãã³ããäœæããããšã«ãã
// AbstractRoute.vue <template> <router-view/> </template>
ãã®ãããªæ©èœãããã«äœ¿ããã®ã¯æªãããšã§ããïŒ
ã¯ããããããåé¡ãç°¡åã«è§£æ±ºã§ããããšãéèŠã§ãããäžæ¹ã§ïŒAngularã®çç¥ãšã¯å¯Ÿç
§çã«ïŒã«ãŒã¿ãŒèªäœã®è€éããšé床ãéèŠã ããã§ãã
ãšããã§ãããã«ã¯ãŒã«ãªãã®ããããŸãïŒ
path: `url/sub-url/:id', component: MyComponent, props: true
ããã§ãã³ã³ããŒãã³ãMyComponent
ã«ã¯props
id
ãããã¯URLããã®ãã©ã¡ãŒã¿ãŒã«ãªããŸãã
ããã¯ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ã§ã id
ã¯ããã«ãªã¢ã¯ãã£ãã«ãªããã³ã³ããŒãã³ãã§äœ¿çšãããšéåžžã«äŸ¿å©ã§ãïŒåã³æ©èœããŸã ïŒã
æ¡åŒµãšåå©çš
äžæ¹ã§ã¯ãAngularã®ãã¹ãŠã®ã³ã³ããŒãã³ãã¯TypeScriptã¯ã©ã¹ã§ãã
ããã«ãããããããå€ãã®TypeScript ãããã䜿çšããããšã¯ããã°ãã°äžäŸ¿ãŸãã¯äžå¯èœã§ãã
ããã¯äž»ã«OOPã«é©çšãããŸã-ç¶æ¿ãæœè±¡ã¯ã©ã¹ãã¹ã³ãŒãã
äž»ãªåé¡ã¯ãäŸåæ§æ³šå
¥ãšAOTã³ã³ãã€ã©ãŒã§çºçããŸãïŒ ãããã«ééããããšã¯ç¥ãçŠããŠããŸãïŒã
Vueã§ã¯ãã€ã³ã¹ã¿ã³ã¹æ§æã¯ãªããžã§ã¯ãã§ã-ç°¡åã«æäœããŠå±éãããªãã¡ã¯ã¿ãªã³ã°ããŸãã
ã³ãŒããåå©çšããããã®åŒ·åãªãã®ããããŸã-ããã¯ã¹ã€ã³ãšãã©ã°ã€ã³ïŒããã«ã€ããŠã¯ä»¥äžã§è©³ãã説æããŸãïŒã
UIã³ã³ããŒãã³ã
ãšã³ã¿ãŒãã©ã€ãºã»ã°ã¡ã³ãã§ã¯ãã³ã³ããŒãã³ãã«ã¯éåžžã宿ãããã¶ã€ã³ãã¢ã«ããªã©ããããŸãã ã»ãšãã©ã®å Žåããããã¯ãŒãããäœæãããç¹å®ã®ã¿ã¹ã¯/補å/ãããžã§ã¯ãã®ããã«ããã«ã·ã£ãŒãåãããŸãã
ãããããã€ãŸã§ãããã§ã¯ãªãã®ã§ãéçºè
ã¯ãç¹ã«ããããããžã§ã¯ãããããã¿ã€ãã³ã°ã®ããã«ããã¹ãŠããŒãããäœæããæ©äŒããããŸãã
ããã§ã¯ãæ¢è£œã®UIã³ã³ããŒãã³ãã®ã©ã€ãã©ãªã圹ç«ã¡ãŸããVueã«ã¯ãElementãVuetifyãQuasarãVue-MaterialãMuseãiViewãªã©ããã§ã«éåžžã«å€ãã®ã©ã€ãã©ãªããããŸãã

ç¹ã«ElementãšVuetifyã«ã€ããŠèšåããŸããå°è±¡ã¯å³å¯ã«ããžãã£ãã§ããããããããŒãºã«å¯Ÿå¿ããçŸããå®å®ããã³ã³ããŒãã³ããåªããããã¯ã§ãã
ãŸãã ã¯ãŒã«ãªBulma CSSãã¬ãŒã ã¯ãŒã¯ã«åºã¥ããBuefyã³ã³ããŒãã³ãã»ãããéåžžã«æ°ã«å
¥ã£ãŠããŸãããµãŒãããŒãã£ã®ã³ã³ããŒãã³ããå¿
èŠã«å¿ããŠæ¥ç¶ãããBulmaã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããšç¹ã«äŸ¿å©ã§ãã
Angular-ãšã³ã¿ãŒãã©ã€ãºã¬ãã«ã®ã³ã³ããŒãã³ãã©ã€ãã©ãªã®å Žåãã»ãã®2ã3åã®æçã§ããããããã¯äž»ã«Angular MaterialïŒGoogleïŒãšClarityïŒVMWareïŒã§ãã
æ®å¿µãªãããClarityã®éçºã®ããŒã¹ã¯æè¿äœäžããŸãããããã¯ããã®åé¡ã«é¢ããAngularã®èŠéãã«é¢ããŠããã«èç«ããããã®ã§ãã


å®éã®çµéšãšåé¡
ãããŠä»ãæŠéãããžã§ã¯ãã§Vueã䜿çšããå®éã®çµéšããã®äž»ãªåé¡ã
èªç±ããã
æ·±å»ãªãããžã§ã¯ãã®äž»ãªåé¡Vueã仿¥ãç§ã¯ããŸãã«ãå€ãã®éžæã®èªç±ãåŒã³ãŸãã
äžæ¹ã§ã¯ãåãããšãå€ãã®ç°ãªãæ¹æ³ã§å®è¡ã§ãããšããäºå®ã¯éåžžã«ã¯ãŒã«ã§ãã
ããããå®éã«ã¯ãããã¯ã³ãŒãããŒã¹ãéåžžã«ççŸãããšããäºå®ã«ã€ãªãããŸãã
èªåŒµãããäŸïŒããŒãžäžã®ã«ã¹ã¿ã ããžãã¯ã¯ãã³ã³ããŒãã³ãã宣èšããããšã§äœæã§ããããŒã«ã«ã®å ŽåããããŸã
const Component = { created() {
ãšãŠãã°ããŒãã«ïŒã©ãããã§ãã¢ã¯ã»ã¹å¯èœïŒã
Vue.component('Global', { created() {
ãã®æ©èœãå®è£
ããããŒã«ã«Mixinãäœæã§ããŸã
const mixin = { created() {
ããã«ãããïŒæ··åïŒitïŒ..ïŒã¯åã³ã°ããŒãã«ã«ãªããŸãã
Vue.mixin({ created() {
çµå±ã®ãšãããã°ããŒãã«ããã¯ã¹ã€ã³ãšã»ãŒåãããšãè¡ããã©ã°ã€ã³ããããŸãã
const MyPlugin = { install(Vue, options) { Vue.mixin({ created() {
ãã¡ããããããã®æ©èœã¯ãã¹ãŠç¹å®ã®ã¿ã¹ã¯ã«å®éã«å¿
èŠã§ãããéåžžã«äŸ¿å©ã§ãã
ãã ããéçºè
ã«ãšã£ãŠãç¹ã«åå¿è
ã«ãšã£ãŠãã©ã®ãªãã·ã§ã³ãéžæãããã¯å¿
ãããæããã§ã¯ãããŸããã
å¿
èŠãªã³ãŒãã確èªãã
Vuexã䜿çšããŠãããšããäºå®ã«ãããããããç§ã¯ãå·ã§ã¯ãªãããŒã¿ïŒïŒã䜿çšããªãããšã¯éåžžã«é£ããå Žåãããããšãèªåã§ææããŸããã
ããã¯é床ã®åé¡ã§ããããŒã¿ã«äœãã远å ããæ¹ãéãããšã¯æããã§ãããã»ãšãã©ã®å ŽåãããŒã¿ãç¶æ
ã«ç§»åããŠäœåãªæéãè²»ããå¿
èŠãããããšãããããŸãã
ãããããã³ãŒãã®ã¬ãã¥ãŒããªããVueãããŸãçµéšããŠããªã倿°ã®åŸèŒ©ããããããžã§ã¯ãã§ã¯ãç¶æ³ã¯ç¹ã«æ²ããã§ãããã
æ°ã¶æã§ãã®ãããªã³ãŒããæ±ãããšã¯å®å
šã«äžå¿«ã«ãªããšæããŸãã
åäœãã¹ã
ãŸããAngularã®åŸãJestã§ããã€ãã®ãã®ãæ¿¡ããã®ã¯ããŸã䟿å©ã§ãæçœã§ããããŸããã§ããã
å
·äœçãªäŸã¯ãããŒã«ã«ã¹ãã¬ãŒãžã§ãã 誰ãããã®åé¡ãgithubã§ã°ãŒã°ã«æ€çŽ¢ããããšã§æ±ºå®ããŸãã ã
Object.defineProperty(window, 'localStorage', { value: localStorageMock, })
解決çã¯ç§ã«ã¯çŸããèŠããŸããã§ããããåŸã§å€æããããã«ã ãããšã¬ã¬ã³ããªãã®ããããŸã
global.localStorage = localStorageMock;
ã¯ããããã¯Vueã®åé¡ã§ã¯ãªããAngularãšæ¯èŒããçæ
ç³»ã®åé¡ã§ãã
ç§ã®æèŠã§ã¯ããŸãã«ãã®ãããªå®éã®äŸã¯ããã¥ã¡ã³ãã«èšèŒãããã¹ãã§ãã
ã¯ãã¯ããã¯
äžè¬ã«ãVueã®æ
åœè
ã¯ãã®åé¡ãèªèããŠããã ã¬ã·ãä»ãã®ã¯ãã¯ããã¯ãäœæããããšã§è§£æ±ºããŠããŸã ã
å®éãããã¯äžè¬çãªã¿ã¹ã¯ã«å¯Ÿããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã®ã»ããã§ãã
äŸã¯æ¬¡ã®ãšããã§ãã åäœãã¹ã ã
æ€èšŒãšHTTPã®æäœ ã
ããããã¬ã·ãã¯ãŸã éåžžã«åºæ¬çã§ãããæ·±å»ãªã¿ã¹ã¯ã«ã¯éåžžã«æ¬ ããŠããŸãã
ãã¹ãã説æãããŠãããäžè¬çãªçè§£ã®ããã«ã¯ããã§ååã§ãããäžèšã®ã¢ããã³ã°ãèªåã§æ¢ãå¿
èŠããããŸãã
æ€èšŒã«ã€ããŠã¯åŸã§èª¬æããŸãããHTTPã®æäœã«ã€ããŠã¯ãååã«è©³ãã説æãããŠããŸããã
Angularã¯ãµãŒãã¹ãéããŠããã¯ãšã³ãAPIãæäœããããšãæããŠããããšæããŸãããããã¯ã³ãŒãã®ãµããŒããšåå©çšã倧å¹
ã«ä¿é²ããè¯ããã¿ãŒã³ã ãšæããŸãã
ããããç§ãã¡ã«ã¯æªåé«ãDIããªãããµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ã®äœæã¯ããŸã䟿å©ã§ã¯ãªãã®ã§ãã¯ãã¯ããã¯ã«ãåæ§ã®ãã¿ãŒã³ãå¿
èŠã§ãã
ã»ãšãã©ã®å ŽåãããŒã«ã«ã³ãŒãã®èŠåãšãã¹ããã©ã¯ãã£ã¹ãéçºããããšã«ããããã®åé¡ã解決ããŸããã èšäºã®æåŸã®ãªã³ã¯
TypeScript
TypeScriptãããã«äŸ¿å©ã§äŸ¿å©ã§ãããã«ã€ããŠäœåºŠãè¿°ã¹ãæžããŠããŸããããäºå®ãããªãã¯ããã調çã§ããå¿
èŠããããšããããšã§ãã
Angularã§ã¯ããã¹ãŠãå®éšçãªæ©èœïŒè£
食ïŒãå
éšã¯ã©ã¹ãããã³æ°çŸïŒæ°åïŒïŒã®åé·ãªæœè±¡åã«é¢é£ä»ããããŠããŸãã

Vueã§ã¯ãTypeScriptã®å¯èœãªäœ¿çšæ³ã¯ã¯ããã«è«ççã§ããéçºè
ã®æ©èœãæ¡åŒµã§ããã®ã¯ã1ã€ãŸãã¯å¥ã®èšèªæ©èœã«çžãããããšãªãå¯èœã§ãã
Vueã®TypeScriptã®åé¡
ãã ãã仿¥ãVueã§TypeScriptã䜿çšããã®ã¯å¿
ãããç°¡åã§ã¯ãªããããããã§ããã€ãã®åé¡ã«ééããŸããã
第äžã«ã圌ãã¯èªåã®å£ãããã¹ã=ïŒïŒïŒ
ãã¡ãããåè«ã¯ç§ã®å人çãªçã¿ã§ã
2ã€ã®ã¢ãããŒã
Vueã®TypeScriptã®äž»ãªåé¡ã¯ã ããã䜿çšããããã®å
¬åŒã®ã¢ãããŒãã2ã€ããããšã§ãã
ããã¯Vue.extendã§ãïŒVueã«ãã³ãã«ãããŠãããã¡ã€ã³ã©ã€ãã©ãªãšå
±ã«ãµããŒããããŠããã¿ããïŒ
import Vue from 'vue' const Component = Vue.extend({ ... })
Angular decorator vue-class-componentã«éåžžã«äŒŒãŠããŸã
import Vue from 'vue' import Component from 'vue-class-component' @Component({ template: '<button @click="onClick">Click!</button>' }) export default class MyComponent extends Vue { message: string = 'Hello!' onClick (): void { window.alert(this.message) } }
å人çã«ãç§ã¯ã¯ã©ã¹ã³ã³ããŒãã³ãã奜ãã§ã¯ãããŸããããããŠãå€ãã®çç±ã§Vue.extendã䜿çšããŸãïŒ
- ã¯ã©ã¹ã³ã³ããŒãã³ãã«ã¯ç¬èªã®ããªãã¯/æ¬ ç¹ããããŸã
- ããã©ã«ãã®ES6 Vueã³ã³ããŒãã³ããã§ããéãé¿ããã
- TSçšã«ç·šéããå¿
èŠãªããããã¥ã¡ã³ãããçŽæ¥ã³ãŒãã䜿çšããŸã
- ããŒã ã¯ãTypeScriptãªãã§Vueãã©ã®ããã«æ©èœããããçè§£ããå¿
èŠããããŸãã
- ç¹ã«ãã»ãšãã©ãè§åºŠã®ããèæ¯ãæã€ããšãèæ
®ããŠ
ãã®ä»ã®åé¡
æ²ãã¿ã®åºŠåããå€ãããTypeScriptã®ããã€ãã®åé¡ã次ã«ç€ºããŸãã
- TSlint ã¯ãã®ãŸãŸã§ã¯ Vueã§åäœããŸãã-.vueãã¡ã€ã«ã«å¯ŸããŠã¯å®è¡ã§ããŸãã ã äžè¬ã«ãfork-ts-checkerã«ãã解決çããããŸããããããã¯ãã¹ãŠãã§ã
- TypeScriptã®ESlintã¯æ§ããã«èšã£ãŠãã¹ãŒããŒã§ã¯ãããŸããã ãã©ã°ã€ã³ãšããŒãµãŒã®äž¡æ¹ããŸã éçºäžã§ãã
å€ãã®ã³ã¢ããã³ãã¥ãŒã«ãŒã«ã¯ç ŽãããŸãããäž»ãªåé¡ã¯éåžžã«äžæçãªãšã©ãŒãããããšã§ãã
ãã ããããã«ãããããããå£ããã«ãŒã«ãç¡å¹ã«ããå¿
èŠãªã«ãŒã«ãã²ãã£ãŠå
·äœçã«äœ¿çšããŸãã
ESlint configãžã®ãªã³ã¯ ã - Vuexã¹ãã¢ã¯å€éšã§å
¥åãããŠããªãããããããåŒã³åºã
this.$store
ã³ã³ããŒãã³ãããã®this.$store
ã¯äºå®äžãã¹ãŠã®ãã€ããŒãã§å¯èœ
ãã ããVue.extendïŒïŒã«ã¯æ¬¡ã®ãããªæ¬ ç¹ããããŸãã
- ã¯ã©ã¹ïŒãã£ããã³ïŒãšããŠããã©ã€ããŒããéçã¡ãœãããªã©ã䜿çšããããšã¯ã§ããŸããã
- Vuexã®ããããŒã«ããçã¿... mapGettersïŒïŒã... mapStateïŒïŒãªã© ãããã®ããããŒã䜿çšãããšãå
¥åã倱ãããå¥åŠãªãšã©ãŒã衚瀺ãããŸãã æ±ºå®ãæºããããã®ãåŸ
ã£ãŠããŸãã
- ããŒã¿ïŒïŒããããã£ãå
¥åããã®ã¯äžäŸ¿ã§ã ããã¯é¢æ°ã§ã-ãã®æ»ãå€ãèšè¿°ããã€ã³ã¿ãŒãã§ãŒã¹ãäœæããå¿
èŠããããã³ã«
- å°éå
·ã®æ£çŽãªã¿ã€ãã³ã°ã¯äžè¬çã«ã»ãšãã©äžå¯èœã§ãã ãã€ãã£ãJSåã宣èšããå¿
èŠããããéåžžã¯TypeScriptã€ã³ã¿ãŒãã§ã€ã¹ãæåŸ
ãããŸããããã£ã¹ãã«ã¯ã解決çããããŸã
äžè¬ã«ããã©ãŒã ã¯Vuexã®åé¡ã ãã§ãªããã»ãŒãã¹ãŠã®ç¶æ
管çãã¿ãŒã³ã§ãã
ããã§ããããã¯äžæ¹åã®ããŒã¿ãããŒã䌎ãã圢åŒã¯åæ¹åã®çŒ¶è©°ãæå³ããŸãã
Vuexã¯2ã€ã®ãœãªã¥ãŒã·ã§ã³ãæäŸããŠããŸãã
value
ãç¶æ
å€ã«ãã€ã³ãããæŽæ°ããããã«-ã³ããããéä¿¡ããå
¥åã€ãã³ãïŒ
<input :value="message" @input="updateMessage">
ãŸãã¯ãããã«ãããããããåæ¹åã®ã«ããŒãšv-model
ã²ãã¿ãŒãšã»ãã¿ãŒãä»ããŠååŸããã³ã³ãããããŸãã
<input v-model="message">
2çªç®ã®ãªãã·ã§ã³ã¯ãã䟿å©ã§ç°¡æœã§ãããããã§ãéåžžã«åé·ã§ãã
ãã®ããã«20以äžã®ãã£ãŒã«ããæã€ãã©ãŒã ãèšè¿°ããããšãæ³åããŠã¿ãŠãã ããã
ãã®ãããªäžèŠåå§çãªã¿ã¹ã¯ã®ããã®èšå€§ãªéã®ã³ãŒãã倿ããŸããã
ããããŒãã€ãŸãmapGetters()
ããã³mapMutations()
ã䜿çšããå Žåãåé¡ã®é¢é£æ§ã¯ããäœããªããŸãã
ããããäžã§æžããããã«ã圌ãã¯çŸåšTypeScriptã§ããŸãæ©èœããŠããããå¥ã®è§£æ±ºçãæ¢ãå¿
èŠããããŸããã
ã²ãã¿ãŒïŒç¶æ
ããã®ã²ãã¿ãŒïŒãšã»ãã¿ãŒïŒã³ãããçªç¶å€ç°ïŒã远å ããéåžžã«åå§çãªããããŒãäœæããŸããã
static mapTwoWay<T>(getter: string, mutation: string) { return { get(this: Vue): T { return this.$store.getters[getter]; }, set(this: Vue, value: T) { this.$store.commit(mutation, value); } }; }
ããã«ãããã³ãŒãã®éãæžããããã£ãŒã«ããæ¬¡ã®ããã«èšè¿°ã§ããŸãã
stringTags: Util.mapTwoWay<IDatasetExtra[]>(STRING_TAGS, UPDATE_STRING_TAGS)
ãããŠãããã«å¿ããŠã v-model
䜿çšããŸãã
v-model="stringTags"
Angularã®åŸã§ç§ãé©ãããã®ã¯ãVueã®ç®±ããåºããŠããã«ã¯ãã©ãŒã ã®æ€èšŒããªãããšã§ãã ã©ãããããã®æ©èœã¯éåžžã«äººæ°ããããŸãã
ãã ããããã¯éèŠã§ã¯ãããŸããããã®ã¿ã¹ã¯ã«ã¯2ã€ã®æãäžè¬çãªãœãªã¥ãŒã·ã§ã³ããããŸãã
vee-validate
1ã€ç®ã¯ãAngular- vee-validateã®ãã³ãã¬ãŒãé§åãã©ãŒã ã«éåžžã«ãã䌌ãã¡ã«ããºã ã§ãã
å®éããã¹ãŠã®æ€èšŒããžãã¯ãHTMLã§èšè¿°ããŸãã
<input v-validate="'required|email'">
ãã®ã¢ãããŒãã¯ãæ¯èŒçå°ãã/è€éã§ãªããã©ãŒã ã«ã®ã¿é©ããŠãããšæããŸãã
å®éã«ã¯ãæ€èšŒã¯éåžžã«æŽç·ŽãããŠããããšãå€ããHTMLã§ãã¹ãŠãèšè¿°ããããšã¯äžäŸ¿ã«ãªããŸãã
ããã«ãVuexã§ã¯ããŸãæ©èœããŸããã
æ€èšŒãã
2çªç®ã®è§£æ±ºçã¯Vuelidateã§ãã ã»ãšãã©ãã¹ãŠã®ã³ã³ããŒãã³ããæ€èšŒããããã®éåžžã«ãšã¬ã¬ã³ããªæ¹æ³-ã¢ãã«èªäœãæ€èšŒããã1ã€ãŸãã¯å¥ã®å
¥åã§ã¯ãããŸããã
ãããããããšã«ããã®ãã°ãããããã±ãŒãžãçºèŠããåã«ãç§ãã¡ã¯ãã§ã«äŒŒããããªãã®ãæžãå§ããŠããŸããã
<input v-model="name" @input="$v.name.$touch()">
import { required, email } from 'vuelidate/lib/validators' export default { data () { return { name: '' } }, validations: { name: { required, email } } }
å¿
èŠã«å¿ããŠããã©ãŒã ã®æ€èšŒã§Vuelidateãããã«æ€èšããããšã匷ããå§ãããŸããããã¯ïŒVuexãå«ãïŒããŸãæ©èœããæ¥ç¶ãšã«ã¹ã¿ãã€ãºãç°¡åã§ãã
Vueã¡ã€ã³ããã/åé¡
å®éããããäž»ãªåé¡ã§ã ïŒïŒïŒVue-ããã¯åãªãã©ã€ãã©ãªã§ãããã ãŸããããªãŒã«ã€ã³ã¯ã³ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããŸããã
ç®±ããåºããŠïŒ
- HTTP
- æ€èšŒ
- åœéå
- ...ãªã©ãªã©ïŒ
ã¯ããå
¬åŒã«ãµããŒããããŠããŸãïŒ
- ã«ãŒã¿ãŒ
- éœéåºç
ããããããã§ãããããã¯ã³ã¢ã§ã¯ãªãåå¥ã®ããã±ãŒãžã§ãã
ããããããããã¹ãŠã®æ©èœãåããVueã«ã¯ãAnimationã®ãããªã¯ãŒã«ãªçµã¿èŸŒã¿æ©èœããããŸãã
ãã€ãŠç§ã¯ãäœããã¢ãã¡ãŒã·ã§ã³åããããã®æãè±ããªå¯èœæ§ã«å€å°é©ããŠããŸããã
ããã¯ãããããåãAngularãããã¯ããã«äŸ¿å©ã§åŒ·åãªããŒã«ããã¯ã¹ã§ãã
ããã¥ã¡ã³ãããã®ã¯ãŒã«ãªäŸ ïŒ

ãã€ããŠã©ãããše2e
ãã¯ãVueã«çŽæ¥é¢ä¿ããªãå°ããªåé¡ã§ãããå®éã®ãããžã§ã¯ãã§ééããŸããã
e2eãã¹ãçšã®ãããžã§ã¯ããçæãããšããããã«NightwatchãšCypressã®ã©ã¡ãããéžæã§ããŸãã
å人çã«ã¯ã仿¥ã®ãµã€ãã¬ã¹ãe2eãã¹ãã®æãã¯ãŒã«ãªããŒã«ã§ãããšç§ã¯èããŠããŸãããChrome以å€ã®ãã©ãŠã¶ã¯ãŸã ãµããŒããããŠããŸãã ã
ãã®ãããæŠéãããžã§ã¯ãã«ã¯éžæã§ããŸããã§ãããå®éã®ã«ã¹ã¿ã ãŠãŒã¶ãŒã¯åŒãç¶ãä»ã®ãã©ãŠã¶ã䜿çšããŠããŸãã
ãã¹ããå®å
šã«äžå¯è§£ãªçç±ã§Linux CIã«è©²åœãå§ãããïŒWindowsã§ã¯ãã¹ãŠåé¡ãããŸããã§ããïŒããšã©ãŒã¯æçã§ã¯ãããŸããã§ããã
åŸã§ãåé¡ãURLã®ããã·ã¥ïŒïŒïŒã«é¢é£ããŠããããšãããããŸããã
ã€ãŸãã vue-router
ã䜿çšããå Žåããã®ãããªURLã¯ããã©ã«ãã§ãã
, ChromeDriver
, Nightwatch ( Cypress TestCafe), "" url :
.url('data:,') .url(client.globals.devServerURL + `/#/my-hashed-url`)
Angular boilerplate , , Vue .
, , Developer Experience. , .
, .
Vue â React Native.
.
, Vue NativeScript Vue, , , .
Weex, , .
æ§èœ
. .


: http://www.stefankrause.net/js-frameworks-benchmark7/table.html
( " " ).
: GitLab ,
CodeShip , Alibaba, Xiaomi .
ãããã«
.
â TypeScript Vue , , .
, production.
, , TS Vue, JavaScript.
, , , TypeScript .
Vue , , .
, " ", Tide Vue .
code conventions
, , .
, .
cookbook â , ( ).
Vue seed (TS, Jest, ESlint ..), , Vue CLI 3,
.
Vue CLI 3 .
??
ã¯ã ãæž
èŽããããšãããããŸããã
PS: , Vue â ,
PPS: , () â =(
: https://medium.com/@igogrek/how-i-started-loving-vue-d41c1c8e77e1