ãã®ã¬ãã¹ã³ã§ã¯ãç¹ã«ããã¯æããªãã®ã§ããªãæµæãWebã®ãã©ãŒã§ããã®ãã«ã€ããŠã¯èª¬æããŸãããããã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ç¹å®ã®åæ
ããããŸãã ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ãéçºãããšãã«ã©ãããå§ããããšãã§ããããã©ã®ããã±ãŒãžãååšããããäžè¬çã«ãã®æµæãäœã§ãããã瀺ããããšæããŸãã
ããã«èšãããã®ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®éçºã«ããŸãçµéšããªãããšã§ãã ç§ã¯ãããçŽ2幎ãããã£ãŠããããæ°ãæéããæµæãç¥ããªãã£ãã
ãŸããã¬ãã¹ã³ã¯éåžžã«èšå€§ã§ããããšãå€æããŸãããããã®äžã®ã³ãŒãã¯ããã¹ããããäœåãæžãããŠããªãã£ãããšã«æ³šæããŠãã ããã åçŽãªäŸãäœæãããšãã§ã¯ãªããæµæã®äœ¿çšæ¹æ³ã«é¢ããç§ã®çµéšãå
±æããéèŠã ãšèããããŸããŸãªãã€ã³ãã«çŠç¹ãåœãŠãããšæããŸãã ãããã£ãŠããã®ã¬ãã¹ã³ã§ã¯ãéçºããã»ã¹ãä¿é²ããå€ãã®ãµãŒãããŒãã£ããã±ãŒãžã䜿çšããŸãã
ãã1ã€ã®èŠåïŒãã®ã¬ãã¹ã³ã§ã¯ã次ã®ãã¯ãããžãŒã䜿çšããŠäŸãçŽæ¥èšè¿°ããŸãã
- jade -htmlããªããã»ããµã
- less -cssããªããã»ããµã
- coffeescriptã¯ãjavascriptã§ã³ã³ãã€ã«ãããããã°ã©ãã³ã°èšèªã§ãã
ã¬ãã¹ã³äžã«åãåã£ãã¢ããªã±ãŒã·ã§ã³ã瀺ããããª
ãããŠãŸã èå³ããã人ã¯ãç«ã«ããããã
Meteorãã€ã³ã¹ããŒã«ãã
æµæèªäœã¯
nodejs
ãš
mongodb
åºã¥ããŠãããæµæã¯WindowsããµããŒãããŠããŸãããæµæãæããå Žåã¯ãLinuxãŸãã¯MacOSãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãå
¥æããå¿
èŠããããŸãã
æåã«ã
nodejsãš
mongodbãã€ã³ã¹ããŒã«ã
ãŸã ã
次ã®ã¹ãããã¯ãæµæãã€ã³ã¹ããŒã«ããããšã§ãã npmãªããžããªã«ã¯ãªãããã
npm install -g meteor
ãæ¥ãã§ã³ãã³ãã
npm install -g meteor
å¿
èŠã¯ãããŸããããã®å Žåãå€ãããŒãžã§ã³ã®ã¿ãããŒããããŸããé©åã«ã€ã³ã¹ããŒã«ããã«ã¯ãã³ã³ãœãŒã«ã§å®è¡ããå¿
èŠããããŸãã
$ curl https://install.meteor.com/ | sh
ãããžã§ã¯ãäœæ
æµæãã€ã³ã¹ããŒã«ããåŸãããã«ã³ãã³ããå®è¡ã§ããŸã
$ meteor create 'todo-list' todo-list: created. To run your new app: cd todo-list meteor $ cd todo-list $ meteor [[[[[ ~/dev/meteor-getting-started/todo-list ]]]]] => Started proxy. => Started MongoDB. => Started your app. => App running at: http:
ãã®çµè«ã¯ããã¹ãŠãããŸããã£ãããšãæå³ããHelloWorldã¯ãã©ãŠã¶ã§ç¢ºèªã§ããŸãã
ããã§ãæ°ãããããžã§ã¯ãã®æäœæ§ã確èªããåŸããããžã§ã¯ãã®ã«ãŒãã«ãããã¡ã€ã«ãåé€ã§ããŸãããããã¯ç¹ã«èå³æ·±ããã®ã§ã¯ãããŸããã ãŸãã
.meteor
ãã£ã¬ã¯ããªãäœæããããããžã§ã¯ãã«é¢ããããŸããŸãªãµãŒãã¹æ
å ±ãããã«ã¯èªåçã«çæããã
.gitignore
ãä¿åãããŠããããšã«æ°ä»ãããšãã§ããŸãã ãšããã§ãæåã§ããã±ãŒãžã管çããããã«
packages
ãã¡ã€ã«ãå€æŽã§ããŸãããã³ã³ãœãŒã«ãŠãŒãã£ãªãã£ãéåžžã«äŸ¿å©ã§ãã
ç§ãšåãçµæãåŸãããã°ãmeteorãããžã§ã¯ããéçºããããã®æå°éã®ç°å¢ã¯æºåã§ããŠããŸããäœããããããå Žåã¯ã
nodejs
ã
mongodb
ã
meteor
ã€ã³ã¹ããŒã«ã確èªããŠãã ãããããšãã°ãã³ã³ãã¥ãŒã¿ãŒã«æ¬¡ã®æ§æããããŸãïŒ
$ node -v v0.10.33 $ mongod --version db version v2.4.12 $ meteor --version Meteor 1.0
ããã§ãæç¶ããå®äºããåœç€Ÿã®tuduã·ãŒãã®éçºã«é²ãããšãã§ããŸãã 䟿å®äžãæ°ããã³ã³ãœãŒã«ã¿ããéãããšããå§ãããŸããããã¯ãMeteorã¢ããªã±ãŒã·ã§ã³ãåèµ·åããå¿
èŠããªããªã£ãããã§ããããã¬ãŒã ã¯ãŒã¯ã®ã³ã³ãœãŒã«ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
ããã±ãŒãž
ç¹°ãè¿ãã«ãªããŸãããç§ã®ãã±ãããããŒãžã£ãŒãæµæã§äœ¿çšãããŠããçç±ãšããªã圌ãããã®ãããªèªè»¢è»ã奜ãã®ãã«ã€ããŠã¯èª¬æããŸãããã¬ãã¹ã³ãšã¯é¢ä¿ãããŸããã
ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã¯æ¬¡ã®ã³ãã³ãã§è¡ãããŸã
$ meteor add <package-name>
äžã§æžããããã«ã
less
ã
jade
ã
coffeescript
ã§ã¢ããªã±ãŒã·ã§ã³ãéçºããŸããã€ãŸããããããã€ã³ã¹ããŒã«ããæã§ãã ã¬ãã¹ã³ã§äœ¿çšããããã¹ãŠã®ããã±ãŒãžãšãã®ä»ã®ããã±ãŒãžã¯ã
Atmosphere Webãµã€ãã§èŠã€ããããšãã§ããŸãã å®éã«ã¯ãããã±ãŒãžã®ååïŒ
less
ã coffeescript
ã¯å
¬åŒããã±ãŒãžã§ãããããèè
ã®ååã¯å«ãŸããŸãããmquandalle:jade
ããããããã¯å
¬åŒã®ããã±ãŒãžã§ã¯ãªããããååã¯2ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãããããŸãæ©èœããåé¡ãªã䜿çšã§ããŸããã
sourcemap
ãµããŒãã¯
less
ããã³
coffeescript
sourcemap
çµã¿èŸŒãŸããŠããããããã©ãŠã¶ãŒã§ã®
sourcemap
ããã»ã¹ã¯ç°¡åã§ãã
sourcemap
meteorèªäœã§ãµããŒããããŸãããã®æ©èœãæ¥ç¶ããããã«å¿
èŠãªAPIãæäŸãããããç¹ã«èšå®ããå¿
èŠã¯ãããŸããã
éçºã®éçšã§ããã人æ°ã®ããããã±ãŒãžãããã€ãè¿œå ããããããã®ç®çã説æããŠãããŸãã ãšããã§ãä»ã®å€ãã®ããã±ãŒãžãšåæ§ã«ã
jquery
ãš
underscore
ãã§ã«æµæã«å«ãŸããŠããŸããå®å
šãªãªã¹ãã¯ãäœæããããããžã§ã¯ãã®ãã¡ã€ã«
./.meteor/versions
ã«ãããŸãã
ã¢ããªã±ãŒã·ã§ã³æ§é
ããŠãç§ã®æèŠã§ã¯ãæµæãã©ã®ããã«ãã¡ã€ã«ããããžã§ã¯ãã«æ¥ç¶ããã®ãããããŠãããã©ã®ããã«èŠå¶ããã®ããç解ããæãæ¥ãŸããã ããã§ããã³ãã¬ãŒããã¹ã¿ã€ã«ãããã³ã¹ã¯ãªãããã³ã³ãã€ã«ããããã«ã
grant
ãŸãã¯
gulp
æ§æãã¡ã€ã«ãäœæããå¿
èŠã¯ãããŸãããæµæã¯ãã§ã«ãããåŠçããŸããã è¶³å Žã«ã¯ãYeomanã®
ãããžã§ã¯ãããããŸããããã¹ãŠãæåã§äœæããã®ã奜ãã§ãã åã®ãããžã§ã¯ãã§ã¯ããããã次ã®ãã©ã«ããŒæ§é ã䜿çšããŸããã
todo-list/ - âââ client - â âââ components - â â , â âââ config - â âââ layouts - , â âââ lib - , â â â âââ routes - â âââ styles - âââ collections - âââ lib - , âââ public - : , robots.txt âââ server - â âââ methods - , , â â â âââ publications - â âââ routes - , â â http â âââ startup -
ããããäœããç§ãã¡ã«ãšã£ãŠæçšã§ã¯ãªããããããŸãããããããã«ããŠããæµæã¯ãã©ã«ããšãã¡ã€ã«ã®åœåã«å¶éããªãã®ã§ãããªãã«ãšã£ãŠäŸ¿å©ãªæ§é ãæãã€ãããšãã§ããŸãã ãã¥ã¢ã³ã¹ã®ããã€ãã«ã€ããŠèŠããŠããã¹ãäž»ãªããšïŒ
- ãããžã§ã¯ãã®ã«ãŒãã«ãã
public
ãã©ã«ããŒã®ãã¹ãŠã®ãã¡ã€ã«ã«ã¯ããã©ãŠã¶ãŒããã®ãªã³ã¯ãä»ããŠãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ãããããžã§ã¯ãã«èªåçã«æ¥ç¶ãããŸããã - ã«ãŒãã®
server
ãã©ã«ããŒã®ãã¹ãŠã®ãã¡ã€ã«ãã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒåŽã§ã®ã¿äœ¿çšå¯èœã - ã«ãŒãã®
client
ãã©ã«ãã®ãã¹ãŠã®ãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåã®ã¿ãã¢ã¯ã»ã¹ã§ããŸãã - ããããç°å¢ã§åºæ¬çã«å©çšå¯èœãªä»ã®ãã¹ãŠã
- ãã¡ã€ã«ã¯ã次ã®èŠåã«åŸã£ãŠãããžã§ã¯ãã«èªåçã«æ¥ç¶ãããŸãã
- ããŠã³ããŒãã¯ãµããã£ã¬ã¯ããªããéå§ãããæåã®ãã£ã¬ã¯ããªã¯åžžã«
lib
ãšããååã®ãã£ã¬ã¯ããªã§åŠçãããŸãããã®åŸããã¹ãŠã®*ãã©ã«ããšãã¡ã€ã«ãã¢ã«ãã¡ãããé ã«ããŠã³ããŒããããŸãã main.
å§ãŸããã¡ã€ã«main.
æåŸã«ããŒããããŸããã
ããšãã°ããããžã§ã¯ãããã©ãŠã¶ã«ã©ã®ããã«èªã¿èŸŒãŸããããèããŠã¿ãŸãããïŒæåã«ããããžã§ã¯ãã«ãŒãã®
lib
ãã£ã¬ã¯ããªãããã¡ã€ã«ãããŠã³ããŒãããã次ã«
client
ãã©ã«ããŒãåŠçããã
lib
ããã®ãã¡ã€ã«ãæåã«èªã¿èŸŒãŸãã次ã«ã¢ã«ãã¡ãããé ã«ããŒããã
components
ïŒ
components
>
config
> ...->
styles
ãããŠããã§ã«
collections
ãã©ã«ããŒã®ãã¡ã€ã«ã®åŸã«ã
public
ãã©ã«ããŒãš
server
ãã©ã«ããŒã®ãã¡ã€ã«ã¯ãã©ãŠã¶ãŒã«ã¢ããããŒããããŸããããããšãã°ã
public
ãã©ã«ããŒã«æ ŒçŽãããŠãã
script
ã¯ãä»ã®ãããžã§ã¯ãã§äœ¿çšãããŠããããã«ã
script
ã¿ã°ãä»ããŠæ¥ç¶ã§ããŸããããã¬ãŒã ã¯ãŒã¯ã®éçºè
ã¯ãã®ã¢ãããŒããæšå¥šããŸããã
次ã®æ§æäœã䜿çšããŠãå
±æãã¡ã€ã«ã®ã©ã³ã¿ã€ã ã調æŽããããšãã§ããŸãã
if Meteor.isClient
ãŸããã¹ã¯ãªããã®å®è¡æéã調æŽããã«ã¯ã
Meteor.startup(<func>)
ã¡ãœããã䜿çšããŸãããã©ãŠã¶ãŒã§ã¯
jQuery
ã©ã€ãã©ãªã®
$
é¢æ°ã«é¡äŒŒããŠããããµãŒããŒã§ã¯ããããã®ãã¡ã€ã«ãããŠã³ããŒããããé åºã§ãã¹ãŠã®ã¹ã¯ãªãããèªã¿èŸŒãã çŽåŸã«ãã®é¢æ°ã®ã³ãŒããå®è¡ãããŸã
ãããã®å€æ°ãšã¡ãœããã®è©³çŽ°ãã芧ãã ãã ã
åºæ¬çãªã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒã
ã¬ã€ã¢ãŠãã«ã¯Bootstrapã䜿çšããŸããã圌ã¯ãã¹ãŠã«ããããããŠããããšã¯ç¥ã£ãŠããŸãããç§ã¯ã¿ã€ãã»ãã¿ãŒã§ã¯ãªããããŒãã¹ãã©ããã«ã¯ããŸãæ
£ããŠããŸããã
ãããè¡ãã«ã¯ã
mizzao:bootstrap-3
ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸã
mizzao:bootstrap-3
ããã¯ä»ã®äžã§æã人æ°ãããã䜿çšã«åé¡ã¯ãªããšæããŸãã
次ã«ã
client/layouts
head.jade
ãã¡ã€ã«ãäœæã
head.jade
ã ããã¯ããã³ãã¬ãŒã圢åŒãæããªãã¢ããªã±ãŒã·ã§ã³å
ã®å¯äžã®ãã¡ã€ã«ã«ãªããŸããã€ãŸããããŒãžããããŒãäœæããã ãã§ãåŸã§ãã³ãã¬ãŒããäœã§ããããåæããŸãã
//- client/layouts/head.jade head meta(charset='utf-8') meta(name='viewport', content='width=device-width, initial-scale=1') meta(name='description', content='') meta(name='author', content='') title Meteor. TODO List.
ãã©ãŠã¶ãéããŠããã¡ã€ã«ãè¿œå ããåŸãããŒãžã«æå®ãããã¿ã€ãã«ãããããšã確èªã§ããŸãã
æ§æãå§ããåã«ãã¯ã©ã€ã¢ã³ãã«ãŒãã£ã³ã°ã®åºæ¬çãªã»ããã¢ãããè¡ãããšãææ¡ããŸããå°ãåŸã§ããã®ç¹ããã詳现ã«åæããŸãã ã«ãŒãã£ã³ã°ã«ã¯ãå¿
èŠãªãã¹ãŠã®æ©èœãåããäžè¬çãªãœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸãã
iron:router
ããã±ãŒãžïŒ
ãªããžã㪠ïŒãã€ã³ã¹ããŒã«ã
ãŸã ã
client/config
ãã£ã¬ã¯ããªã«ã€ã³ã¹ããŒã«ããåŸã次ã®å
容ã®
router.coffee
ãã¡ã€ã«ãäœæããŸãã
æããã«ãããã§ã¯ã¢ããªã±ãŒã·ã§ã³ã®åºæ¬ãã³ãã¬ãŒããèšå®ã
application
ãããã¯
application
ãšåŒã°ã
application
ã ãããã£ãŠã
layouts
ãã©ã«ããŒã«
application.jade
ãã¡ã€ã«ãäœæããŸãã ãã®ãã¡ã€ã«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ã»ã³ããªã®æ®µéã§
javascript
ã³ãŒãã«å€ãããã³ãã¬ãŒãã§ãããšã³ãã£ãã£ãèšè¿°ããŸãã ã¡ãªã¿ã«ãæµæã¯ç¬èªã®å£ã²ããçããããã³ãã¬ãŒã
spacebars
ãš
blaze
ã©ã€ãã©ãªã䜿çšããŸãã
èŠããã«ããã³ãã¬ãŒããåŠçããããã»ã¹ã¯æ¬¡ã®ãšããã§ãïŒããã¥ã¡ã³ããããããéãïŒã
spacebars
ãã³ãã¬ãŒã
spacebars
ãåŸã§
DOM
çŽæ¥åäœãã
blaze
ã©ã€ãã©ãª
blaze
ã³ã³ãã€ã«ãã
DOM
ã ãããžã§ã¯ãã®èª¬æã«ã¯ãä»ã®äžè¬çãªã©ã€ãã©ãªãšã®æ¯èŒããããŸãã
- éåžžã®ããã¹ããã³ãã¬ãŒããšæ¯èŒããŠãçã¯å®¶ã§æ©èœãã1ã€ã®å±æ§ãå€æŽããããã«ãã³ãã¬ãŒãå
šäœãåã¬ã³ããªã³ã°ããããšã¯ãªãããã¹ãããããã³ãã¬ãŒãã«ã¯åé¡ãããŸããã
Ember
ãã³ãã¬ãŒããšæ¯èŒããŠãblazeã¯å€æŽã®ã¿ãã¬ã³ããªã³ã°ããæ瀺çãªããŒã¿ãã€ã³ãã£ã³ã°ããã³ãã¬ãŒãéã®äŸåé¢ä¿ã®èª¬æã¯å¿
èŠãããŸãããangular
ããã³polymer
ãã³ãã¬ãŒããšæ¯èŒããŠããã¬ã€ãºã¯æ確ã§ã·ã³ãã«ãªæ§æãäœãå
¥åãããå€ãæã¡ãäžè¬çã«å°æ¥ã®ãã¯ãããžãŒãšããŠäœçœ®ä»ããããŸããããåã«æ©èœããŸããReact
ãšæ¯èŒãããšReact
ã·ã³ãã«ãªãã³ãã¬ãŒãèšè¿°æ§æãšã·ã³ãã«ãªããŒã¿ç®¡çãåããŠããŸãã
å³æžé€šã®å
¬åŒ
説æãã段èœãå®éã«ç¿»èš³ããã®ã§ãäœãã«åæããªãå Žåã¯ç³ãæããªãã§ãã ããã ç§èªèº«ã¯ãããã®æè¡ã«åºããããŸããïŒ
ember
ãé€ãïŒããããŠãååãšããŠãç§ã¯å³æžé€šã®èè
ã«åæããŸããçã®ãã€ãã¹é¢ã«ã€ããŠã¯ãæµæã®çµã³ã€ãã«æ°ã¥ãããã§ãã
ãããããããžã§ã¯ãã§ã¯ã
blaze
ã
spacebars
ãæ瀺çã«äœ¿çšããŸããã
jade
ãã³ãã¬ãŒãã®å Žåãã³ã³ãã€ã«ããã»ã¹ã®é åºã¯ã
jade
->
spacebars
->
blaze
ã§ãã
æµæå
ã®ãã¹ãŠã®ãã¿ãŒã³ã¯
template
ã¿ã°ã§èšè¿°ãããŸãã
template
ã¿ã°ã«ã¯ããã³ãã¬ãŒãã®ååãæã€å±æ§ãå¿
èŠã§ãã ã«ãŒã¿ãŒã®èšå®ã§
layoutTemplate: "application"
ãæå®ããããšãæãåºããŠãã ãããããã§
application
ã¯ãã³ãã¬ãŒãã®ååã§ãã
æµæã®ãã¿ãŒã³ãäœã§ããããç解ããŠããããã§ããããŒãžã®ãã¬ãŒã ãäœæããæãæ¥ãŸãããããããŒãšããã¿ãŒã§æ§æãããŸãã
//- client/layouts/application.jade template(name='application') nav.navbar.navbar-default.navbar-fixed-top .container .navbar-header button.navbar-toggle.collapsed( type='button', data-toggle='collapse', data-target='#navbar', aria-expanded='false', aria-controls='navbar' ) span.sr-only Toggle navigation span.icon-bar span.icon-bar span.icon-bar a.navbar-brand(href='#') TODO List #navbar.collapse.navbar-collapse ul.nav.navbar-nav .container +yield .footer .container p.text-muted TODO List, 2014.
ããã§ã¯ãããã¯ã¹ã€ã³ãjavascriptãã€ã³ã¯ã«ãŒãžã§ã³ãªã©ããããç§ãã¡ã«ããç¥ãããŠããªãããšãç解ããå¿
èŠããããŸãã
Jade
ã¯
spacebars
ãã³ãã¬ãŒãã«ã³ã³ãã€ã«ããå¿
èŠããããããã«ã¯ããã€ãã®æ©èœããããŸãã
jade
ãããæ§æã®ã¿ã䜿çšããæ®ãã¯å¿
èŠãªããšèšãããšãã§ããŸãã ãã®ãã³ãã¬ãŒãã§ã¯ã
+yield
æ§æã䜿çšãããŸãããã®æ§æã¯
yield
ãã¿ãŒã³ã代ããã«ã¬ã³ããªã³ã°ãããããšãæå³ããŸããããã¯
iron:router
æ©èœã§ã
iron:router
ããã¹ã«å¿ããŠç®çã®ãã¿ãŒã³ãèªåçã«çœ®ãæããŸããå°ãåŸã§ã«ãŒã¿ãŒãåŠçããã¬ã€ã¢ãŠãã«å€èŠ³ãå€æŽã§ããããã«ãªããŸãããçµæãèŠãŠãã ããã
// client/styles/main.less html { position: relative; min-height: 100%; } body { margin-bottom: 60px; & > .container{ padding: 60px 15px 0; } } .footer { position: absolute; bottom: 0; width: 100%; height: 60px; background-color:
ã¡ãªã¿ã«ãã¹ã¿ã€ã«ãå€æŽããå Žåããã©ãŠã¶ã§ããŒãžãæŽæ°ããå¿
èŠã¯ãããŸããããã¡ã€ã«ãä¿åããã ãã§ããã«é©çšãããŸããæµæã®ã¬ã€ã¢ãŠãèšèšè
åãã®äŸ¿å©ãªããŒã«ããããŸãã
ã«ãŒãã£ã³ã°
æµæèªäœã«æšæºã®ã«ãŒãã£ã³ã°ã¡ã«ããºã ã¯ãããŸããã
iron:router
ããã±ãŒãžã䜿çšããããšããå§ãã
iron:router
ååã«ææžåãã ãç©æ¥µçã«ãµããŒããããè±å¯ãªæ©èœããããæµæã®ã³ã³ããã¹ãã§æã人æ°ã®ããã«ãŒãã£ã³ã°ãœãªã¥ãŒã·ã§ã³ã§ããããŸãã
ãã®ã©ã€ãã©ãªããµãŒããŒã«ãŒãã£ã³ã°ã«äœ¿çšããããšãã§ããŸãã ããšãã°ãå®éã®ãããžã§ã¯ãã§ã¯ããŠãŒã¶ãŒãèªèšŒããããã«ãããå¿
èŠã§ãããã¡ã€ã³ãããžã§ã¯ãã¯
Ruby on Rails
ã§äœæããããŠãŒã¶ãŒã¯ãããã2ã€ã®ç°ãªãã¢ããªã±ãŒã·ã§ã³ã§ãããšèããŠãã°ã€ã³ããå¿
èŠããªãããã§ãã äžè¬ã«ãæµæçšã®ãµãŒããŒã«ãŒãã£ã³ã°ããã³REST APIã®äœæã«ã¯ãããã€ãã®äžè¬çãª
ã¢ãããŒãããããŸãã
ãã®ã©ã€ãã©ãªãã©ã®ããã«æ©èœããã©ã®ãããªæ©èœãåããŠããããäŸãšããŠç¢ºèªããããã«ãåºæ¬çãªã«ãŒã¿ãŒãäœæããŸãããã®åŸãäž»ãªæ©èœããããã«æããŸãã
ãŸããããŒãžãžã®ãªã³ã¯ãèšå®ããŸãããã
//- client/layouts/application.jade //- ... #navbar.collapse.navbar-collapse ul.nav.navbar-nav li a(href='/') Home li a(href='/about') About
ããããåãªãã¹ã¿ãã«ãªããŸã§ãã¯ã©ã€ã¢ã³ãã«ãŒã¿ãŒãã©ã«ããŒã«ã³ã³ãããŒã©ãŒãäœæããŸãã
2ã€ã®ãã©ã¡ãŒã¿ãŒã
Router.route
é¢æ°ã«æž¡ãå¿
èŠããããŸããæåã®ãã©ã¡ãŒã¿ãŒã¯ãã¹ã§ããããã¹ã¯ãã¿ãŒã³ã«ããããšãã§ããŸãïŒäŸïŒ
/:user/orders/:id/info
ïŒããã¿ãŒã³ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã¯
params
ããããã£ãä»ããŠã³ã³ãããŒã©ãŒãªããžã§ã¯ãã§äœ¿çšã§ããŸãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ããªãã·ã§ã³ãæã€ãªããžã§ã¯ãã§ãã ãã¹ãšååã®ç°¡åãªèª¬æãããã¹ãŠã®ããžãã¯ã
<RouteName>Controller
ããã«ãã³ã³ãããŒã©ãŒãäœæã§ããŸãããã®å Žåããããã¯ã·ã³ãã«ãªã¹ã¿ãã§ããããã§ã¯ãããã©ã«ãã§
iron:router
<RouteName>Controller
ãšããååã®ã³ã³ãããŒã©ãŒãèŠã€ããããšãããããããããã£ã§ã³ã³ãããŒã©ãŒã®ååãæ瀺çã«æå®ããŸãããã¡ãããã³ã³ãããŒã©ãŒã¯ã°ããŒãã«ã«ã¢ã¯ã»ã¹ã§ããå¿
èŠããããŸããã³ãŒããŒã¹ã¯ãªããã§ã¯ãå€æ°ãçŸåšã®ã³ã³ããã¹ãã«ãã€ã³ãããããšã§ãããè¡ããŸããéåžžã®jsã§ã¯ãå€æ°ã
var
ä»ããã«å®£èšããã ãã§ååã§ãã
ã¡ãªã¿ã«ãæµæã§ã¯äœ¿çšãããŸãããããšãã°ã amd
ã¯ã³ãŒããããŠã³ããŒãããŸããããã¡ã€ã«ã¯ç¹å®ã®é åºã§åçŽã«ããŠã³ããŒããããŸãã ãããã£ãŠãç°ãªããã¡ã€ã«ã«èšè¿°ãããŠããã¢ãžã¥ãŒã«éã®ãã¹ãŠã®å¯Ÿè©±ã¯ãã°ããŒãã«å€æ°ãä»ããŠå®è¡ãããŸãã ç§ã«ãšã£ãŠã¯ãããã¯éåžžã«äŸ¿å©ã§ãããã³ãŒããŒã䜿çšããå Žåã誀ã£ãŠã°ããŒãã«å€æ°ã宣èšããããšã¯éåžžã«é£ãããããã«æ°ä»ãã§ãããã
iron:router
ã¯ããã³ãã¬ãŒããã«ãŒãã®ååã§èªåçã«ã¬ã³ããªã³ã°ããããšããŸãïŒãã ãããã³ãã¬ãŒãã¯æ瀺çã«æå®ããããšãã§ããŸãïŒãããããäœæããŸã
//- client/components/home/home.jade template(name='home') h1 Home //- client/components/about/about.jade template(name='about') h1 About
ãã©ãŠã¶ãéããŠãããããŒã®ãªã³ã¯ãã¯ãªãã¯ããŠã«ãŒãã£ã³ã°ãæ©èœããããšã確èªã§ããŸãã ãããŠãããŒãžãæŽæ°ããã«åäœããŸãã
ãã®ã¬ãã¹ã³ãéçºããéçšã§ããã¬ãŒã³ããŒã·ã§ã³ã®ã·ãŒã±ã³ã¹ã«åŸã£ãŠãªããžããªã®ã³ãŒãã«ãã¹ãŠã®å€æŽãå ããæçš¿ã®äžéšãã¹ãããã§ããããã«ããã»ã¹å
šäœããã©ããŒã§ããããã«ããŸãã ãªããžã㪠ã
ããã§ã¯ãæåŸã«äœãèµ·ãã£ãã®ããèŠãããšãã§ãã
ããã§ã¯ãçŸåšã®ç¶æ
ã®ãããžã§ã¯ãã³ãŒããèŠãããš
ãã§ããŸãã
ãŠãŒã¶ãŒãšèªèšŒ
åœç€Ÿã«æ¥ãå€ãã®æè¡çãªã¿ã¹ã¯ãæåã®ã¿ã¹ã¯ã¯ãŠãŒã¶ãŒã·ã¹ãã ã説æããŸãã ããã¯ããªãäžè¬çãªã¿ã¹ã¯ãªã®ã§ãç¹ã«æµæããã®ããã®æšæºããŒã«ãæäŸãããããã¬ãã¹ã³ã§ã¯ãŠãŒã¶ãŒèªèšŒã®æ¹æ³ãæ€èšããå¿
èŠããããšèããŠããŸãã
ã¡ã«ããºã ã«ã€ããŠã¯è©³ãã説æããŸãããããã°ã€ã³/ãã¹ã¯ãŒããŸãã¯
google
ããã³
github
ãµãŒãã¹ãä»ããŠãŠãŒã¶ãŒãäœæã§ããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŸãã ç§ã¯
omniauth
ããã€ãã®ãžã§ãã¬ãŒã¿ãŒãšèšå®ã®
omniauth
ãRails
omniauth
ãš
omniauth
devise
ã«
omniauth
ãŠããŸãã ãã®ãããæµæã¯ããããããã«äœ¿çšã§ããããã«ããã ãã§ãªãããµãŒãã¹ã®æ§æãå¯èœãªéãç°¡åã«ãªããŸãã
次ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
accounts-base
-meteorã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒåãã®åºæ¬ããã±ãŒãžãaccounts-password
ã accounts-github
ã accounts-github
ãã°ã€ã³/ãã¹ã¯ãŒãããã³github
ããã³google
ãµãŒãã¹ãä»ããèªèšŒã®ãµããŒããè¿œå ããŸããian:accounts-ui-bootstrap-3
ããŒãã¹ãã©ããã¢ããªã±ãŒã·ã§ã³ã§ã®ã¢ã«ãŠã³ãã®çµ±åãç°¡çŽ åããããã±ãŒãžã
ian:accounts-ui-bootstrap-3
ããã±ãŒãžã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã«èªèšŒ/ç»é²ãã©ãŒã ã1è¡ã§è¿œå ã§ããã ãã§ãªãããµãŒãããŒãã£ãµãŒãã¹ãæ§æããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸã§ããŸãã
ãããžã§ã¯ãèªäœã«ã¯ããã©ãŒã ã®çµ±åãšãµãŒãã¹ã®æ§æãã©ã®ããã«èŠãããã«ã€ããŠã®å°ããªããã¥ã¡ã³ããšã¹ã¯ãªãŒã³ã·ã§ããããããŸãã
åžœåãå€æŽããŸã
//- client/layouts/application.jade //- ... #navbar.collapse.navbar-collapse ul.nav.navbar-nav li a(href='/') Home li a(href='/about') About ul.nav.navbar-nav.navbar-right //- //- ian:accounts-ui-bootstrap-3 +loginButtons
ãããŠã次ã®çµæãåŸãããŸã
æ§æåŸãèªèšŒããŒã¯ã³ãããŒã¿ããŒã¹ã«ä¿åãããŠããããšã確èªã§ããŸãã
$ meteor mongo MongoDB shell version: 2.4.9 connecting to: 127.0.0.1:3001/meteor meteor:PRIMARY> show collections meteor_accounts_loginServiceConfiguration meteor_oauth_pendingCredentials system.indexes users meteor:PRIMARY> db.meteor_accounts_loginServiceConfiguration.find() { "service" : "github", "clientId" : "<id>", "secret" : "<secret>", "_id" : "AjKrfCXAioLs7aBTN" } { "service" : "google", "clientId" : "<id>", "secret" : "<secret>", "_id" : "HaERjHLYmAAhehskY" }
é»åã¡ãŒã«ã¢ãã¬ã¹ã®æ€èšŒãèšå®ãããã®ã§ããŠãŒã¶ãŒã·ã¹ãã ãèšå®ããŸããããªãã¯
smtp
ãèšå®ããå¿
èŠããã
email
ããšããã§ãé»åã¡ãŒã«ããã±ãŒãžã¯
email
éä¿¡ã«äœ¿çšãã
email
ã æšæºã®æµæã»ããã«ã¯å«ãŸããŠããªããããã¡ãŒã«ã§äœæ¥ããå¿
èŠãããå Žåã¯æåã§ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
ãããŠãæµæãé»åã¡ãŒã«ã¢ãã¬ã¹ã®ç¢ºèªãæ±ããããã«ã¢ã«ãŠã³ããèšå®ããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã埮調æŽãå¿
ââèŠãªãããè€æ°ã®ãµãŒãã¹ã1ã€ã®ã¢ã«ãŠã³ãã«æ¥ç¶ããããšã¯ã§ããŸããã ããããããã®ç¬éã¯æµæã§è§£æ±ºãããã§ããããããããŸã§ã®ãšããã
mondora:connect-with
ã«å¯Ÿãã
mondora:connect-with
ãå€ããå°ãªããéåžžã®ãœãªã¥ãŒã·ã§ã³ã
mondora:connect-with
ããããŸãããããã¯ãŸã çã§ãã ã¢ã«ãŠã³ããèªåã§ç¶æããããšãã§ããŸãããããã¯è€éãªããšã§ã¯ãªãããããã¯ãŒã¯ã«ã¯å€ãã®äŸãä»ã®ãœãªã¥ãŒã·ã§ã³ããããŸãïŒ
one ã
two ã
three ã
ã¢ã«ãŠã³ãã®è©³çŽ°ãª
ããã¥ã¡ã³ãããããŸããããã±ãŒãžã眮ããŠéæ³ãèŠãã ãã§ãããå
éšã§ã¯ããã»ã©é£ãããããŸããã
ã¢ã«ãŠã³ãã·ã¹ãã ãè¡šé¢çã«èª¿ã¹ãã®ã§ãããŸãç§ã蹎ãå¿
èŠã¯ãããŸãããè€éãªãã®ã¯äœããªãããšã瀺ãããã£ãã ãã§ãã詳现ãªã¬ãã¥ãŒã«ã¯å¥ã®æçš¿ãå¿
èŠã§ãããããŠãã¬ãã¹ã³ã§ã¯ãå¿
èŠãªåºæ¬æ©èœãäœæããæçµçµæã«é²ã¿ãŸãã
次ã®ã¹ãããã¯ãŠãŒã¶ãŒã®ããŒãžãåŠçããããšã§ããããããç Žãåã«ãæµæã«ããã€ãã®ããšãå®è£
ããæ¹æ³ãèæ
®ããå¿
èŠããããŸããã³ã¬ã¯ã·ã§ã³ãåºçç©ã賌èªã
ãããžã§ã¯ããäœæãããšãã«ãèªåçã«äºã€ã®ããã±ãŒãžãè¿œå ãããŠããautopublish
ãšinsecure
ã圌ãã¯ãããŒã¿ããŒã¹å
ã®ãã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ãžã®ãŠãŒã¶ãŒç¡å¶éã®ã¢ã¯ã»ã¹ãæäŸãããããŠå¯äžã®ãããã¿ã€ãã³ã°ã®ããã«äœ¿çšããããšãã§ããããã«ãªããŸãããããããåãé€ãããã®æéã§ãããã±ããã¯ã³ãã³ãã«ãã£ãŠåé€ãããŸã $ meteor remove <package-name>
ã³ã¬ã¯ã·ã§ã³
éç³äžã®ã³ã¬ã¯ã·ã§ã³ãã¢ã³ã°ã®ã³ã¬ã¯ã·ã§ã³ãšæ¯èŒããããšãã§ããå®éã«åœŒãã¯åœŒããšä»äºãšåãã§ããã圌ãã¯ãŸããã¡ãœãããæã£ãŠããfind
ãinsert
ãupdate
ãupsert
ïŒéçŽã¯ããã±ãŒãžã䜿çšããŠããµãŒããŒäžã§æŽçããããšãã§ããŸãzvictor:mongodb-server-aggregation
ïŒãäœææžã¿ã®ã³ã¬ã¯ã·ã§ã³ã®1ã€ã§ãMeteor.users
ããšãã°ããã©ãŠã¶ã³ã³ãœãŒã«ã§å®è¡ããŠã¿ãŠãã ããMeteor.users.findOne()
ãããã§éèŠãªã®ã¯ããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ããŒã¿ããã©ãŠã¶ã«ãã£ãã·ã¥ãããããšã§ããã¯ã©ã€ã¢ã³ãMeteor.users.find(options).fetch()
ã§ã«ãŒãå
ã§100äžåå®è¡ãããšããã©ãŠã¶ä»¥å€ã¯ããŒããããŸãããããã¯minimongo
ãã¯ã©ã€ã¢ã³ãã«æž¡ããããã©ã¡ãŒã¿ãŒã«å¿ããŠéžæãè¡ãã®ã«ååã¹ããŒããªã©ã€ãã©ãªãŒã䜿çšããŠå®çŸãããŸãã裞ã®ããŒã¿ãæ±ãã®ã¯ããŸã楜ããããšã§ã¯ãããŸãããã³ã¬ã¯ã·ã§ã³ã®ãªããžã§ã¯ãã«ããžãã¹ããžãã¯ãè¿œå ããããšæããŸããããã¯ã³ã¬ã¯ã·ã§ã³ã®æ©èœã䜿çš_transform
ããŠå®è¡ã§ããŸãããµãŒããŒãããªããžã§ã¯ããåãåã£ãåŸããªããžã§ã¯ãã転éããŸããpackageã䜿çšã§ããŸãdburles:collection-helpers
ãããã«ãããã³ã¬ã¯ã·ã§ã³helpers
ã«ã¡ãœãããè¿œå ããããã¹ãŠã®ããŒã¿ãç¶æ¿ãããªããžã§ã¯ããæž¡ãããšãã§ããŸããããã±ãŒãžãã€ã³ã¹ããŒã«ãããŠãŒã¶ãŒæ
å ±ãæŽæ°ããããã®ã¡ãœãããäœæããŸãããŸãããŠãŒã¶ãŒãäœæãããšãã«ãGravatarãµãŒãã¹ã«ãŠãŒã¶ãŒã®ã¢ãã¿ãŒã®ããã·ã¥ãå«ãèšç®ãã£ãŒã«ããè¿œå ããŸãã-ããã€ãã®ãã©ã¡ãŒã¿ã䜿çšããŠç»åãžã®ãªã³ã¯ãè¿ãããšãã§ããã¡ãœãããè¿œå ããŸãããŸãããŠãŒã¶ãŒç»é²ãµãŒãã¹ããã§ãã¯ããã¡ãœãããšãããŸããŸãªå
¬éæ
å ±ãè¿ãã¡ãœãããè¿œå ããŸãã
æµæå
ã®ã³ã¬ã¯ã·ã§ã³ãææ¡ããããã§ããã³ã¬ã¯ã·ã§ã³å
ã®ãã¹ãŠã®ããŒã¿ã¯ãªã¢ã¯ãã£ãã§ãããããŒã¿ããŒã¹å
ã®ã¬ã³ãŒããå€æŽããããšãã¡ã¢ãªå
ã®ã©ããã«ä¿åãããã¢ãã«ãªããžã§ã¯ãã®é¢é£æ§ã倱ãããåŸç¶ã®äœæ¥ã倱ããããããã¢ãã«ã«ç¶æ
ãä¿åããããšã¯æãŸãããªãããšã«æ³šæããŠãã ããå€ããªã£ãããŒã¿ã䜿çšããããã«ãªãå¯èœæ§ããããŸããåŸã®äŸã§ã¯ãã¢ãã«ã®æäœæ¹æ³ãæ€èšããŸããåè¡ç©
ããŒã¿ããŒã¹ã«3ã€ã®ãŠãŒã¶ãŒã¬ã³ãŒããäœæããŸãã $ meteor mongo meteor:PRIMARY> db.users.count() 3
ãããŠããã©ãŠã¶ã§ããŒã¿ãååŸããããšãããšãã«ãèªèšŒãªãã®åäžã®ã¬ã³ãŒããšããã以å€ã®ã¬ã³ãŒãïŒèªåã®ã¬ã³ãŒãïŒã¯èŠã€ãããŸããã§ããããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŠãŒã¶ãŒããã¹ãŠã®ãŠãŒã¶ãŒããé ãã®ã§ã¯ãªããèªèšŒããŒã¯ã³ãªã©ã®å人æ
å ±ãé ãã ãã§ããããã±ãŒãžãåé€ããããautopublish
ãããŒã¿ãå
¬éããããã»ã¹ãæåã§åŠçããå¿
èŠããããŸããããã«ããããŠãŒã¶ãŒã«éä¿¡ãããããŒã¿ãå¶åŸ¡ã§ããŸãããŠãŒã¶ãŒã®ã³ã¬ã¯ã·ã§ã³ãå
¬éããŸãã
ãã®ã³ãŒãã¯ãã¹ãŠã®ãŠãŒã¶ãŒã«ãŠãŒã¶ãŒãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã賌èªããå¿
èŠããããŸããé
ä¿¡å¶éãæå®ããªãå ŽåããŠãŒã¶ãŒã¯ãã®ããŒãžã賌èªãããšããã«ã¢ããããŒããããŸããæãããªçç±ã§ã¯ããŸãè¯ããããŸãããã䜿çšããautopublish
ãšèªåçã«ãã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ã§åãããšãèµ·ãããŸãããŸããã¢ããããŒããããããŒã¿ã®å¯èŠæ§ãå¶éããŸããprofile
ãç»é²è
ã¯ããã£ãŒã«ããšãŠãŒã¶ãŒåããã®æ
å ±ä»¥å€ã¯è¡šç€ºã§ããŸããããã ããããšãã°ãçŸåšã®ãŠãŒã¶ãŒã®é»åã¡ãŒã«ã¢ãã¬ã¹ãžã®ã¢ã¯ã»ã¹ãæäŸããå Žåã¯ãå¥ã®ãããªã±ãŒã·ã§ã³ãäœæããŸãã
ã¡ãœããã«æž¡ããã2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯Meteor.publish
ãã³ã¬ã¯ã·ã§ã³ã«ãŒãœã«ãè¿ãé¢æ°ã§ãããã®é¢æ°ã¯ä»»æã®æ°ã®åŒæ°ãåãããšãã§ããããŒã¿ã®ããŸããŸãªå€æŽã«ã€ããŠãŠãŒã¶ãŒã«éç¥ããããã€ãã®æ¥ç¶ããããã£ãžã®ã¢ã¯ã»ã¹ãæäŸã§ããã¡ãœãããå©çšå¯èœãªãªããžã§ã¯ãã®ã³ã³ããã¹ãã§å®è¡ãããŸããããšãã°ããããã¡ã€ã«ã®å
¬éã§ã¯ready
ããŠãŒã¶ãŒãæ¿èªãããŠããªããšãã«ã¡ãœããã䜿çšããŸããããã¯ãå
¬éã®ããŒã¿ã®æºåãã§ããŠããããšãæå³ããã¯ã©ã€ã¢ã³ãåŽã§ã¯ãµãã¹ã¯ãªãã·ã§ã³æã«ã³ãŒã«ããã¯ãåŒã³åºãããŸããããŠãŒã¶ãŒã¯ããŒã¿ãåä¿¡ããŸãããåºçç©ã®è©³çŽ°ãã芧ãã ããããµãã¹ã¯ãªãã·ã§ã³
ããŒã¿ãåä¿¡ããŠââå€æŽã远跡ããã«ã¯ããŸãåºçç©ã賌èªããå¿
èŠãããããšã«ç¹°ãè¿ãæ°ã¥ããŸãããäžè¬ã«ãMeteorã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ã§çºçãããã¹ãŠã®ããšãç°¡åã«è¿œè·¡ããã³å¶åŸ¡ã§ããŸããããã«ããã€ã§ãããã±ãŒãžã䜿çšã§ããŸãautopublish
ããµãã¹ã¯ãªãã·ã§ã³ã«äœ¿çšããŸãiron:router
ããããŠåœŒã¯å¿
èŠãªããã»ã¹å
šäœãå¶åŸ¡ããŸãããªããªããæåå¶åŸ¡ã§ã¯ãã®ããã»ã¹ã¯å€ãã«åŸãå¿
èŠãããããã®ã©ã€ãã©ãªã¯ãã¹ãŠã®åé¡ã解決ããããã§ããäžéšã®ããŒã¿ãããŒãžããšã«è¡šç€ºããããšããå§ãããŸãããã®ããããŠãŒã¶ãŒã®ã³ã³ãããŒã©ãŒãäœæããåã«ãå°ãæœè±¡åããããŒãžã管çããæ©èœãåããã©ã€ãã©ãªãŒã³ã³ãããŒã©ãŒããç¶æ¿ãããã¯ã©ã¹ãäœæããŸãiron:router
ã
ãã¿ã³ã®åœ¢ã§ãã³ãã¬ãŒããäœæããŠã¿ãŸãããããã¯ãªãã¯ããincLimit
ãšããã®æ©èœããµããŒãããŠããå Žåãã¡ãœããã¯çŸåšã®ã³ã³ãããŒã©ãŒã«å¯ŸããŠåŒã³åºãããŸããç¡éã«ã¹ã¯ããŒã«ããããšã¯å¯èœã§ãããç°¡åã§ãã //- client/components/next_page_button/next_page_button.jade template(name='nextPageButton') unless loaded a.btn.btn-primary.btn-lg.NextPageButton(href = '#') | More
ããã§ãã³ã³ããŒãã³ãã®ããžãã¯ããã§ã«èšå®ããŠããŸããã芧ã®ãšããããã¹ãŠã®ãã¿ãŒã³ãã°ããŒãã«åå空éã«ãªããŸãTemplate
ããã³ãã¬ãŒãã¯ãä»ããŠåç
§ã§ããŸãTemplate.<template-name>
ããã³ãã¬ãŒãã§äœ¿çšãããã¡ãœããã説æããã«ã¯ãã¡ãœãããhelpers
æã€ãªããžã§ã¯ãã転éãããã¡ãœããã䜿çšããå¿
èŠããããŸãããã®äŸã§ã¯loaded
ãçŸåšã®ã³ã³ãããŒã©ãŒãäœã§ãããããã§ãã¯ãããã¹ãŠã®ããŒã¿ãããŠã³ããŒãããããã©ããã瀺ãçµæãè¿ãã¡ãœããã1ã€ã ã説æããŸãããã³ãã¬ãŒãèªäœã§ããã®ã¡ãœããããã¶ã€ã³unless loaded
ã§ååŸããŸãããã³ãã¬ãŒãã§ããçŸåšã®ã³ã³ããã¹ãããããŒã¿ãååŸã§ããŸãããã³ãã¬ãŒãã®ãã«ããŒã¯ããã³ãã¬ãŒãã§äœ¿çšãããå Žåããªããžã§ã¯ãã®ãããã¿ã€ããšæ¯èŒã§ããŸãããåãã«ããŒã¯æ¬¡ã®ããã«åŒã°ãããããé¢æ°èªäœã®å
éšã«å¶éããããŸã<helper-func>.apply(context, arguments)
ãã€ãŸããé¢æ°å
ã§ãã³ãã¬ãŒãã®ãã¹ãŠã®ãã«ããŒã«é£çµ¡ããæ©äŒã¯ãããŸãããããã¯äžè¬ã«æã
å¹²æžããå¯èœæ§ããããŸãããã³ãã¬ãŒãã€ãã³ããåŠçevents
ããã«ã¯ã次ã®åœ¢åŒã®ããŒã䜿çšããŠããªããžã§ã¯ãã転éãããã¡ãœããã§ããããèšè¿°ããå¿
èŠããããŸã<event> <selector>
ãjQuery
ã€ãã³ããšãã€ãã³ããåŒã³åºããããã³ãã¬ãŒãã¯ãã³ãã©ãŒã«æž¡ãããŸãã芪ãã³ãã¬ãŒãã§åã€ãã³ããåŠçã§ãããããããã¯äŸ¿å©ãªå ŽåããããŸããããã§ããã¹ãŠã®ãŠãŒã¶ãŒã®ãªã¹ããå«ãããŒãžãäœæããäŸã§ãµãã¹ã¯ãªãã·ã§ã³ã管çããæ¹æ³ã確èªããæºåãæŽããŸããiron:router
ã
ã¡ãœããsubscriptions
ã¯ãããªã±ãŒã·ã§ã³ããµãã¹ã¯ã©ã€ããusers
ãŸããå®è³ªçã«åæ§ã®æ¹æ³ããŸã ããwaitOn
ããã®äžã§ã®ã¿ãã«ãŒã¿ãŒã¯ãã¹ãŠã®ããŒã¿ãã¢ããããŒãããããŸã§åŸ
æ©ããããŒãžãã¬ã³ããªã³ã°ããåŸããã®ç¬éã«propertyã§èšå®ã§ãããã³ãã¬ãŒãã衚瀺ããŸãloadingTemplate
ãã¡ãœããã«ãã£ãŠè¿ãããããŒã¿ã¯data
ãã³ãã¬ãŒãã«ãã€ã³ããããçŸåšã®ã³ã³ããã¹ãã§äœ¿çšã§ããŸããUsersCollection.find()
ããŒã¿èªäœã§ã¯ãªãã«ãŒãœã«ãè¿ããŸãããæ¢ã«æ¢æã®ããŒã¿ãåŠçããŠãããã®ããã«ãblazeããã¹ãŠã®å€æãè¡ããŸããéãããéã®ããŒã¿ããµãã¹ã¯ã©ã€ããããããåŒã³åºãUsersCollection.find().fetch()
ã¯ã¯ã©ã€ã¢ã³ãã«ã¢ããããŒããããããŒã¿ã®ã¿ãè¿ããŸããã€ãŸããããšãã°ãå¶éã1ã«èšå®ãããšãfind
ããŒããããéžæïŒ1ã€ã®ã¬ã³ãŒãïŒã§ã®ã¿æ©èœããããŒã¿ããŒã¹ã®ã³ã¬ã¯ã·ã§ã³å
ã®ãã¹ãŠã®ããŒã¿ã§ã¯æ©èœããŸãããããšãã°ãããã§ã¯ã¡ãœãããåå®çŸ©ãloaded
ãŸããããã®æ¬è³ªã¯æ確ã§ãããšæããŸããcount
ãããŒã«ã«ã¬ã³ãŒãã®æ°ãè¿ãããšãèŠããŠããå¿
èŠããããŸããã€ãŸããlimit
ãã¹ãŠã®ããŒã¿ãã¢ã³ããŒãããããŸã§åãã«ãªããããæ¡ä»¶ã¯å³å¯ã«å€§ãããªããŸããããã€ãã®ããã¯ãããiron:router
ãŸããããšãã°ãããŒããããå¶éããªã»ããããããã«ãŠãŒã¶ãŒãå«ãããŒãžãéããã³ã«åé¡ãçããããšã¯ãããŸãããããããªããšã以åã«å€§éã®ããŒã¿ãã¢ããããŒãããå ŽåãããŒãžã®ã¬ã³ããªã³ã°ã«æéããããå ŽåããããŸãããããã£ãŠãããã¯ã䜿çšããŠããŒã¿å¶éããªã»ãããããšäŸ¿å©ã§ããonRun
ãããŒãžãããŒãããããšãäžåºŠå®è¡ãããŸããã³ãŒããå«ããã¡ã€ã«ãä¿åãããåŸã«æµæããããã¹ã¯ãããå®è¡ããã³ãŒããä¿åããããšããã®ããã¯ã¯å®è¡ãããªãããããã®ããã¯ã䜿çšããŠã³ã³ãããŒã©ãŒããããã°ãããšãã«ããŒãžãæåã§æŽæ°ããŸãïŒä»ã®ãŠãŒã¶ãŒã«ã¯ãã®ãããªåé¡ã¯ãããŸããïŒãããã¯ãšãµãã¹ã¯ãªãã·ã§ã³ã®è©³çŽ°ããªã¢ã¯ãã£ãå€æ°ãšé¢æ°
ã ããæã
ã¯ãåºçã®ããã«ãµã€ã³ã¢ããããŸããããã³ãã¬ãŒããããã¿ã³ãã¯ãªãã¯ãããšããªããŸã æããã§ã¯ãªããããããªãnextPageButton
ãæ°ããããŒã¿ã®æçãããã³ãªããžã§ã¯ãã®æäœã«ãã¹ãŠã®ãããã§ããŠã³ããŒãããããã«ç§éã«ã€ãªããSession
ã§ã¯PagableRouteController
ããã®ãªããžã§ã¯ãã®ããŒã¿ã¯ãªã¢ã¯ãã£ãã§ããiron:router
ããããã®å€æŽãèªåçã«è¿œè·¡ããŸãããã©ãŠã¶ã³ã³ãœãŒã«ã§å
¥åããŠã¿ãŠãã ããã Tracker.autorun( function() { console.log( 'autorun test', Session.get('var') ); } )
ãããŠãåŒã³åºãã䜿çšããŠå€ãå€æŽããŠã¿ãŠãã ããSession.set('var', 'value')
ãçµæã¯ããã«æ¥ãã§ãããããã³ãã¬ãŒãã®ããŒã¿ãèªåçã«æŽæ°ãããã®ãšåãæ¹æ³ã§ããµãã¹ã¯ãªãã·ã§ã³ãæŽæ°ããå¿
èŠãããå Žåãiron:router
ç解ããåæ§ã®ã¡ã«ããºã ã®ãããã§ãããªã¢ã¯ãã£ãå€æ°ã«é¢ãã詳现ã¯å
¬åŒããã¥ã¡ã³ãã«è©³ãã説æãããŠãããå€æ°ã«å ããŠããã©ãã«ãŒãšãã³ãã¬ãŒãã«ãã£ãŠè¿œè·¡ãããã¡ãœãããšå€ã管çSession
ãããªã¢ã¯ãã£ããªããžã§ã¯ããäœæããããšãã§ããŸãããããŠãã©ãã«ãŒã¯ããªã¹ããŒã®ãããªãã®ã§ããªã¢ã¯ãã£ãå€æ°ãå«ãŸãªãé¢æ°ãäœæã§ããŸããããã©ãã«ãŒã«ãã£ãŠè¿œè·¡ãããããã䜿çšããå¿
èŠããããŸãset
get
Tracker.Dependencyãäžè¬ã«ããã®ã©ã€ãã©ãªã«ã¯ä»ã®å¯èœæ§ããããŸãããå®éã«ã¯ãããããç¡é§ã«ãããã䜿çšããå¿
èŠã¯ãããŸããã§ããããã©ãŠã¶ã³ã³ãœãŒã«ã§å®è¡ã§ããå¥ã®å°ããªäŸïŒ var depend = new Tracker.Dependency(); var reactFunc = function() { depend.depend(); return 42; } Tracker.autorun(function() { console.log( reactFunc() ); });
ãµãã¹ã¯ãªãã·ã§ã³ã®è©³çŽ°
äŸã䜿çšããŠãµãã¹ã¯ãªãã·ã§ã³ã®äœ¿çšæ¹æ³ã«ã€ããŠèª¬æããŸããiron:router
ãããããå¯äžã®ã¡ã«ããºã ã§ã¯ãããŸãããèŠããŠããã¹ãäž»ãªããšã¯ããµãã¹ã¯ãªãã·ã§ã³ãæ
éã«äœ¿çšããå¿
èŠãããããšã§ããããããªããšã倧éã®ããŒã¿ãã¢ããããŒãããå¿
èŠã®ãªãããŒã¿ã®å€æŽãèªåçã«è¿œè·¡ããå±éºããããŸããiron:router
ãµãã¹ã¯ãªãã·ã§ã³ã管çããéåžžã«ç°¡åãªæ¹æ³ãæäŸããŸããäžèŠãªãµãã¹ã¯ãªãã·ã§ã³ããã¹ãŠãªãã«ããå¿
èŠãªãµãã¹ã¯ãªãã·ã§ã³ãæ¥ç¶ããå¿
èŠã«å¿ããŠçŸåšã®ãµãã¹ã¯ãªãã·ã§ã³ãæŽæ°ããŸãããŠãŒã¶ãŒã®ãªã¹ããäœæããããããã¹ãŠãå®éã«æ©èœããããšã確èªããŸãããã //- client/components/users.jade template( name='users' ) h1 Users .row //- , +each users .col-xs-6.col-md-4.col-lg-3 //- //- each , //- +userCard //- +nextPageButton //- client/components/user_avatar/user_avatar.jade //- , template(name='userAvatar') img(src="{{user.getAvatar size}}", alt=user.getUsername, class="{{class}}") //- client/components/user_card.jade //- //- template(name='userCard') .panel.panel-default .panel-body .pull-left +userAvatar user=this size=80 .user-card-info-block ul.fa-ul //- li if isFromGithub i.fa.fa-li.fa-github else if isFromGoogle i.fa.fa-li.fa-google else i.fa.fa-li b= getName //- li i.fa.fa-li @ //- a(href="{{ pathFor route='users_show' data=urlData }}")= getUsername //- , if getPublicEmail li i.fa.fa-li.fa-envelope = getPublicEmail
ãã®çµæãããŒãžããŒã·ã§ã³ãæ©èœãããã¹ãŠã®ããŒã¿ããªã¢ã¯ãã£ãã§ãããããã·ã¹ãã ã®æ°ãããŠãŒã¶ãŒã¯åèµ·åããããšãªãããŒãžã«èªåçã«è¿œå ãããŸããã³ã¬ã¯ã·ã§ã³ã«ãµãã¹ã¯ã©ã€ãããããããµãŒããŒäžã®ããŒã¿ããŒã¹ã®ããŒã¿ãžã®å€æŽã¯ããã«è¡šç€ºãããŸããŠãŒã¶ãŒããŒãžãæ°ãããŠãŒã¶ãŒãæ°ããã¿ãã«ç»é²ãããããŠãŒãã£ãªãã£ã䜿çšããŠããŒã¿ããŒã¹ã®å€ãçŽæ¥mongo
å€æŽããããšãã§ããŸããå€æŽã¯ããŒãžã«è¡šç€ºããããããäœãããå¿
èŠã¯ãããŸããããããŠããã®ã¢ãããŒããæé©ã«æ©èœããããšã確èªããããã«ããã©ãŠã¶ã®ãã°ãèŠãããšãã§ããŸãã1ããŒãžãããã®ãŠãŒã¶ãŒæ°ã1ã«èšå®ããŸããDDPãããã³ã«ã¯éåžžã«ã·ã³ãã«ã§èªã¿ãããã®ã§ã詳现ã«ã¯è§ŠããŸããããã°ã§ã¯ããã¹ãŠã®äžå¿
èŠãªãµãã¹ã¯ãªãã·ã§ã³ã®ãµãã¹ã¯ãªãã·ã§ã³ã解é€ããããŠãŒã¶ãŒããµãã¹ã¯ãªãã·ã§ã³ã®æŽæ°ããšã«3åã ãããŠã³ããŒãããããšãããããŸãããŠãŒã¶ãŒããŒãžãšãã³ãã¬ãŒãã«ã€ããŠããå°ã
ç¬èªã®ã³ã¬ã¯ã·ã§ã³ãäœæã§ããããã«ãããã€ãã®ããŒã¿ãå€æŽããŠãŠãŒã¶ãŒãšã®äœæ¥ãå®äºããããšãã§ãããŠãŒã¶ãŒããŒãžãäœæããŸãããããããè¡ãã«ã¯ãããŒã ããŒãžã§ã¯ãªããæ¿èªããããŠãŒã¶ãŒã®æåã®æäœãšããŠãçŸåšã®ãŠãŒã¶ãŒã®ããŒãžã衚瀺ããã³ã³ãããŒã©ãŒãå°ãå€æŽããŸãã
ãŸããä»»æã®ãŠãŒã¶ãŒã®ãããã¡ã€ã«ã衚瀺ã§ããã³ã³ãããŒã©ãŒãäœæããŸãã
èå¥åãŸãã¯ãã°ã€ã³ã®ããããã§ãŠãŒã¶ãŒãæ€çŽ¢ããããã«ãã³ã¬ã¯ã·ã§ã³ã«è¿œå ã®ã¡ãœãããäœæããŸããã1ã€ã¯ã«ãŒãœã«ãè¿ãã2ã€ç®ã®ããŒã¿ãè¿ããŸãã
ãŠãŒã¶ãŒã®ããŒãžã®ããŒã¿ãååŸããããšããŠããŸãããå
¬éãããŠããŸããããããä¿®æ£ããŠããŸãã
ã»ãšãã©ãã¹ãŠã®æºåãæŽãããã³ãã¬ãŒããäœæããŠçµæã確èªããŸãããã³ãã¬ãŒããäœæãããšãã«ãã¢ã¯ã»ã¹æš©ã«å¿ããŠã¢ãã«ãã£ãŒã«ããç·šéã§ããããã«ããã³ã³ããŒãã³ããäœæããããšã«ããŸããã //- client/components/editable_field/editable_field.jade //- //- , //- //- //- this.<key> template(name='editableField') .form-group.EditableFiled if data.isEditable div(class=inputGroupClass) if hasIcon .input-group-addon if icon i.fa.fa-fw(class='fa-{{icon}}') else i.fa.fa-fw=iconSymbol input.Field.form-control(placeholder=placeholder, value=value, name=name) else if defaultValue span.form-control-static if hasIcon if icon i.fa.fa-fw(class='fa-{{icon}}') else i.fa.fa-fw=iconSymbol = defaultValue
ãã³ãã¬ãŒãã®è¡ã§å€æ°ãè£éããã«ã¯ããã²ã®ãã¶ã€ã³ã䜿çšããããšãã§ããŸãclass='fa-{{icon}}'
ãicon
-ããã¯å€æ°ã§ãã
//- client/components/profile/profile.jade template(name='profile') //- , , //- +with user .profile-left-side .panel.panel-default .panel-body .container-fluid .row.row-bottom //- , //- <>=<>, //- userAvatar +userAvatar user=this size=200 class='profile-left-side-avatar' .row //- +editableField fieldUsername +editableField fieldName +editableField fieldEmail .profile-right-side h1 Boards
æµæã®ãã¿ãŒã³ã®ã¬ã€ã¢ãŠãjade
ã¯éåžžã«æå³ããããå€ãã®ããšãèããããããã¥ã¡ã³ããèªãã ãããå¿
èŠã¯ãããŸããããã¹ãŠããã§ã«æçœã§ããããªãã¯äžèšã®ã³ãŒããç解ããåé¡ãçºçããå Žåã§ããç§ã¯ããªããããã±ãŒãžã®ããã¥ã¡ã³ãã«ç®ãéãããšããå§ããã¹ã€ïŒmquandalleãšå®å®ã»å€©äœããŒããæµæã®ãã³ãã¬ãŒãã®ã¬ã€ã¢ãŠãã«ç²Ÿéãããšããåé¡ã¯ãªãã£ããšããã ãã§ããå®éããããã¯éåžžã«äŸ¿å©ã«ãªã£ããšæããŸããäžè¬ã«ããã¹ãŠã®æºåãæŽã£ãããããããŒã®èªèšŒãã©ãŒã ãéããŠãã°ã€ã³ããŸããããŒãžã®ã¿ã€ãã«ãHomeãã®ä»£ããã«ãåèµ·åããã«ãããã¡ã€ã«ãããã«è¡šç€ºãããŸããçŸæç¹ã§äœããæ確ã§ãªãå Žåã¯ããªããžããªå
ã®ãããžã§ã¯ãã®çŸåšã®ç¶æ
ãããç解ããããšããå§ãããŸãããã¡ã€ã«å
ã§çºçããŠãããã¹ãŠã®ããšã«ã€ããŠã³ã¡ã³ãããããšããŸããããã¡ããããã®æ®µéã§ãããžã§ã¯ããåŸããŠãæã§è§Šãããšãã§ããŸãã次ã«ããµãŒããŒã³ãŒãã«é¢é£ãããããã¯ãããã«ããã€ãåãäžããŸããç¬èªã®ã³ã¬ã¯ã·ã§ã³ãäœæããæ¹æ³ãã³ã¬ã¯ã·ã§ã³å
ã®ããŒã¿ãäžèŠãªç·šéããä¿è·ããæ¹æ³ãRPCã®äœ¿çšãšnpm
ãµãŒããŒã§ã®ã©ã€ãã©ãªã®äœ¿çšã«ã€ããŠå°ãã話ããŸããã³ã¬ã¯ã·ã§ã³ãšãµãã¹ã¯ãªãã·ã§ã³ã®è©³çŽ°
ã³ã¬ã¯ã·ã§ã³ã®äœæãéå§ããåã«ãããŒã¿ããŒã¹ã«ããŒã¿ãæ¿å
¥/å€æŽãããšãã«ããã€ãã®ãã£ãŒã«ããèªåçã«èšç®ããã¡ã«ããºã ãäœæããããšããå§ãããŸãããããè¡ãã«ã¯ãaldeedïŒsimple-schemaãå«ãããã±ãŒãžaldeedïŒcollection2ãè¿œå ããŸãããããã®ããã±ãŒãžã«ãããããŒã¿ã®æ€èšŒãã³ã¬ã¯ã·ã§ã³ãžã®ã€ã³ããã¯ã¹ã®è¿œå ãªã©ãç°¡åã«è¡ãããšãã§ããŸããããã±ãŒãžã«aldeed:simple-schema
ããã€ãã®æ°æ©èœãè¿œå ããŸãã
ãããŠãæ°ããã³ã¬ã¯ã·ã§ã³ãäœæããŸã
ãŸããã³ã¬ã¯ã·ã§ã³ãäœæãããšãã«ã¹ããŒã ãå®çŸ©ããŸãããããã«ãããããŒã¿ãæ€èšŒããããã€ãã®ãã£ãŒã«ããèªåçã«èšç®ã§ããŸããæ€èšŒã®è©³çŽ°ã«ã€ããŠã¯ãaldeedïŒsimple-schema package page ã§èŠã€ããããšãã§ããŸããéåžžã«è±å¯ãªæ©èœãããaldeed:autoform
ãŸããåãäœæè
ããè¿œå ããã±ãŒãžãã€ã³ã¹ããŒã«ãããšããšã³ããªãäœæãããšãã«ãšã©ãŒãããã«éç¥ãããã©ãŒã ãçæã§ããŸããããŒã¿ããŒã¹ã«æ°ããã³ã¬ã¯ã·ã§ã³Boards = new Mongo.Collection 'boards'
ãååšããªãå Žåã¯åŒã³åºãããæ¢åã®ã³ã¬ã¯ã·ã§ã³ã«æ¥ç¶ããŠãæ°ããã³ã¬ã¯ã·ã§ã³ãäœæããŸããååãšããŠãããã¯æ°ããã³ã¬ã¯ã·ã§ã³ãäœæããããã«å¿
èŠãªãã¹ãŠã®æ©èœã§ããäœææã«æå®ã§ãããªãã·ã§ã³ãããã€ããããŸãã䜿çšæ¹æ³allow
ã³ã¬ã¯ã·ã§ã³ã§ã¯ãã³ã¬ã¯ã·ã§ã³å
ã®ããŒã¿ãå€æŽããããã®ã¢ã¯ã»ã¹ãå¶åŸ¡ã§ããŸããçŸåšã®äŸã§ã¯ãèš±å¯ãããŠããªããã¹ãŠã®ãŠãŒã¶ãŒã®ã³ã¬ã¯ã·ã§ã³ã«æ°ãããšã³ããªãäœæããããšãçŠæ¢ããããŒãã®äœæè
ã®ã¿ãããŒã¿ãå€æŽã§ããããã«ããŸãããããã®ãã§ãã¯ã¯ãµãŒããŒäžã§å®è¡ããããããäœããã®ããã«ãŒãã¯ã©ã€ã¢ã³ãã®ãã®ããžãã¯ãå€æŽããããšãå¿é
ããå¿
èŠã¯ãããŸããããŸããããªããèªç±ã«äœ¿ããæ¹æ³ã¯ãã»ãŒåãdeny
ã§ãããã®æ¬è³ªã¯æããã ãšæããŸããallowãšdenyã®è©³çŽ°ãã芧ãã ãããããŒãã«ãŒãã衚瀺ãããšãã«ãããŒãäœæè
ã«é¢ããããŒã¿ãããã«è¡šç€ºãããããã ããããŒãã®ã¿ã«ãµãã¹ã¯ã©ã€ãããå Žåããã®ããŒã¿ã¯ã¯ã©ã€ã¢ã³ãã«éä¿¡ãããŸããããã ããæµæå
ã®åºçç©ã¯ãã³ã¬ã¯ã·ã§ã³ã«ãŠã³ã¿ãŒãªã©ãèªåçã«èšç®ãããä»»æã®ããŒã¿ããµãã¹ã¯ã©ã€ãããæ©èœãæäŸããŸãã
ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§çºçããããã«ãMongaã¯è€æ°ã®ã³ã¬ã¯ã·ã§ã³ãä»ããŠã¯ãšãªãå®è¡ããæ¢ã«åŠçãããããŒã¿ãè¿ãããšãã§ããªãããããã1ã€ã®ã¯ãšãªã䜿çšããŠããŒãã®äœæè
ã«é¢ããããŒã¿ãååŸããå¿
èŠããããããŒã¿ã¢ãã«ã®ãã¬ãŒã ã¯ãŒã¯å
ã§äœæ¥ããæ¹ã䟿å©ã§ãããŸãããªã¯ãšã¹ãã«å¿ããŠãããŒã¿ããŒã¹ããå¿
èŠãªããŒããååŸããŸãããã®åŸããŠãŒã¶ãŒã«å¥ã®ãªã¯ãšã¹ããéä¿¡ããå¿
èŠããããŸããã¡ãœããadded
ãchanged
ããã³removed
ãããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ã¯ãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããããŒã¿ã管çã§ããŸãããããªã±ãŒã·ã§ã³ã§ã³ã¬ã¯ã·ã§ã³ã«ãŒãœã«ãè¿ãå Žåããããã®ã¡ãœããã¯ã³ã¬ã¯ã·ã§ã³ã®ç¶æ
ã«å¿ããŠèªåçã«åŒã³åºããããããã«ãŒãœã«ãè¿ããŸããããããªã±ãŒã·ã§ã³èªäœã«å ããŠãããŒãã³ã¬ã¯ã·ã§ã³å
ã®ããŒã¿ã®å€æŽããµãã¹ã¯ã©ã€ãããå¿
èŠã«å¿ããŠãŠãŒã¶ãŒããŒã¿ãã¯ã©ã€ã¢ã³ãã«éä¿¡ããŸããWebãœã±ããã®æ¥ç¶ãã°ãŸãã¯ãã®ãŠãŒãã£ãªãã£ã䜿çšããŠããã®ã¢ãããŒããæé©ã«æ©èœããããšã確èªã§ããŸããããã§ã¯ããã®å ŽåããŠãŒã¶ãŒã³ã¬ã¯ã·ã§ã³ã®å€æŽãã¯ã©ã€ã¢ã³ããšåæãããªãããšãç解ããããšãéèŠã§ãããããã¯æå³ããããã®ã§ãããšããã§ãåçŽãªçµåã®å Žåããµãã¹ã¯ãªãã·ã§ã³ã®çµæãšããŠã«ãŒãœã«ã®é
åãåçŽã«è¿ãããšãã§ããŸãããŠãŒã¶ãŒããŒãã衚瀺ããããã«ãæ°ãããµãã¹ã¯ãªãã·ã§ã³ãã«ãŒã¿ãŒã«è¿œå ããå¿
èŠãªãã³ãã¬ãŒããäœæããŸããããäžèšã®ãã¹ãŠã®ãã€ã³ããæ¢ã«æ€èšããŸããããã¹ãŠã®å€æŽã«èå³ãããå Žåã¯ãããã§ç¢ºèªã§ããŸããããããæçµçã«ã¯ãããã©ãŒãã³ã¹ã確èªããããã«ã³ã³ãœãŒã«ãä»ããŠããŒããäœæããå¿
èŠããããŸããã次ã®ãã®ãååŸããå¿
èŠããããŸãããŸããmrtïŒreact-publishããã±ãŒãžã䜿çšããŠãªã¢ã¯ãã£ããããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸãã
ãµãŒããŒã®å€æŽ
ããŒãã®èæ¯ç»åãèšå®ããæ©èœãè¿œå ããŸãããããããè¡ãã«ã¯ããµãŒããŒããã¡ã€ã«ãåä¿¡ãåŠçãä¿åãèŠæ±æã«æäŸã§ããããã«ãµãŒããŒãæ§æããå¿
èŠããããŸããNPM
ç»ååŠçã®å ŽåãImageMagickã䜿çšããããšã«æ
£ããŠããŸããããŒãã«ã¯ããã®ã©ã€ãã©ãªãžã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸãã察å¿ããããã±ãŒãžããããŸããæµæã«npm
ããã±ãŒãžã䜿çšããæ©äŒãäžããã«ã¯ããè¿œå ããå¿
èŠãããmeteorhacks:npm
ãŸãpackages.json
ããã®åŸãå¿
èŠãªãã¹ãŠã®ããã±ãŒãžããã¡ã€ã«ã«èšè¿°ã§ããŸããããšãã°ãç§ã¯ããã¯ã®ã¿å¿
èŠGMãšç§ã¯packages.json
次ã®ããã«ãªããŸãã { "gm": "1.17.0" }
Iãnpm
ä»ããŠæ¥ç¶ããããã¹ãŠã®ããã±ãŒãžmeteorhacks:npm
ã¯1ã€ã®æµæããã±ãŒãžã«ã©ããããããããã³ãã³ãã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããã«ãmeteor build
ããå Žåãåé¡ã¯ãªãããã¹ãŠã®äŸåé¢ä¿ã¯èªåçã«è§£æ±ºãããŸããã³ãã³ãã䜿çšnpm
ããŠãµãŒããŒäžã®ããã±ãŒãžã«æ¥ç¶ããå¿
èŠããããŸããã³ãã³ãã¯ãããŒãå
ã®Meteor.npmRequire(<pkg-name>)
æ©èœãšåãããã«æ©èœrequire
ããŸããRPCããã³åæéåæé¢æ°åŒã³åºã
ã€ã¡ãŒãžãããŠã³ããŒãããŠåŠçããã«ã¯ãã¯ã©ã€ã¢ã³ãããåŒã³åºãããšãã§ãããµãŒããŒã¡ãœãããäœæããŸãã
ãã®ã¡ãœããã§uploadBoardImage
ã¯ãç»åãè¿œå ãããããŒãã®èå¥åãšããã®ç»åã®ãã€ããªããŒã¿ãå«ãè¡ãåãå
¥ããŸããã¡ãœããã§äŸå€ãã¹ããŒããããšãã³ãŒã«ããã¯ã®æåã®ãã©ã¡ãŒã¿ãŒã§ããã¯ã©ã€ã¢ã³ãã®ãŠãŒã¶ãŒã«äŸå€ãæž¡ãããŸãããããŠãã¡ãœããã«ãã£ãŠè¿ãããããŒã¿ã¯ã2çªç®ã®ã³ãŒã«ããã¯ãã©ã¡ãŒã¿ãŒãšããŠã¯ã©ã€ã¢ã³ãã«éãããŸããéåæããã°ã©ãã³ã°ã¹ã¿ã€ã«ã§äŸå€ãšé¢æ°ã®æ»ãå€ã䜿çšã§ããããã«ãæµæã®ãµãŒããŒåŽã«ã¯ããã¡ã€ããŒã©ã€ãã©ãªãä»ããŠéåæé¢æ°ãåæé¢æ°ã«ã©ããããã¡ãœããããããŸããèŠããã«ããã®ã©ã€ãã©ãªã®ãããã§ãã©ãããããé¢æ°ã®åŒã³åºããå®è¡ãã¥ãŒãå æããªãå ŽåããµãŒããŒäžã§åæã³ãŒããèšè¿°ã§ããã³ãŒãå®è¡ã®ééã£ãã·ãŒã±ã³ã¹ãå¿é
ããããšã¯ãããŸãããæ¹æ³Meteor.wrapAsync(<async-func>)
æåŸã®ãã©ã¡ãŒã¿ãŒãšããŠã³ãŒã«ããã¯ãåãé¢æ°ã¯ã©ãããããŸãããã®ã³ãŒã«ããã¯ã§ã¯ãæåã®ãã©ã¡ãŒã¿ãŒã¯ãšã©ãŒã§ããã2çªç®ã®çµæã¯ãããŒãå
ã®ãã¹ãŠã®æšæºã©ã€ãã©ãªãŒã®ãã©ã¡ãŒã¿ãŒã®åœ¢åŒãªã©ã§ãããšã©ãŒãå°çãããšãã©ãããããé¢æ°ã¯ãã®ãšã©ãŒã§äŸå€ãã¹ããŒããŸããããã§ãªãå Žåãã³ãŒã«ããã¯ã«è¿ããã2çªç®ã®ãã©ã¡ãŒã¿ãŒãé¢æ°ããè¿ãããŸããã«ãŒãã£ã³ã°
å€ãã®çç±ã§æ¢è£œã®ââçµã¿èŸŒã¿ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããŠãµãŒããŒããéçãçºè¡ããæ¹ãè¯ãããšãç解ããŠããŸãããããã§ã¯éçãããŒãã«æäŸããŸãã
æµæã«ã¯ãµãŒããŒã«ãŒãã£ã³ã°çšã®æšæºwebappããã±ãŒãžããããŸããããã©ãŒã ã«ã¯ãã£ãšäŸ¿å©ãªãœãªã¥ãŒã·ã§ã³ãæ¢ã«ã€ã³ã¹ããŒã«ãããŠãiron:router
ãŸããåæ§ã«ãã¯ã©ã€ã¢ã³ããšåæ§ã«ããµãŒããŒã«ãŒããäœæããŸãã
ããã§ã®äž»ãªããšã¯ãããããã£ãrouteã«æž¡ãããšã§ãwhere: 'server'
ãããããªããšæ©èœããŸãããå®éã«ã¯ãæå®ããããã¡ã€ã«ããã£ã¹ã¯ããèªã¿åãããšããŠããŸãããã®ãã£ã¬ã¯ããªã«ã¯åã圢åŒã®ç»åããååšããªãããããã®æ¹æ³ãå¯èœãªéãç°¡ç¥åããŸãããã«ãŒãã®ã³ã³ããã¹ãã§äœ¿çšã§ãããªããžã§ã¯ãrequest
ãšresponse
ãªããžã§ã¯ãã¯ãããããhttp.IncomingMessageããã³http.ServerResponseããŒãã®æšæºã©ã€ãã©ãªã®ã¯ã©ã¹ãªããžã§ã¯ãã§ããREST APIãäœæããããiron:router
ã®ã€ã³ã¿ãŒãã§ãŒã¹ããããŸãã
RPCã䜿çšãã
䜿çšããã«ã¯ãæ°ããããŒããè¿œå ããããã®ãã©ãŒã ãäœæããŸãããã次ã«ããŠãŒã¶ãŒãããŒãã«è¿œå ããããã®ãªãŒãã³ã³ããªãŒããäœæããŸãããããã§ã¯RPCã䜿çšãããŠããŸãããªããžããªã®å®è£
ã«ã€ããŠè©³ããç¥ãããšãã§ããŸãã
//- client/components/new_board_form/new_board_form.jade template(name='newBoardForm') //- .panel.panel-default.new-board-panel(style='{{panelStyle}}') .panel-body h1 New board form(action='#') .form-group input.form-control(type='text',placeholder='Board name',name='board[name]') .form-group textarea.form-control(placeholder='Description',name='board[description]') .form-group //- , , label.btn.btn-default(for='newBoardImage') Board image .hide input#newBoardImage(type='file', accept='image/*') button.btn.btn-primary(type='submit') Submit
ããã§ã¯ãã€ã¡ãŒãžãããŠã³ããŒãããŠåŠçããããã«ããéããŠãªã¢ãŒãã¡ãœãããå®è¡ãMeteor.call
ãŸããã芧ã®ãšãããã¯ã©ã€ã¢ã³ãã§ãªã¢ãŒãããã·ãŒãžã£ãåŒã³åºãããšã¯ãéåžžã®é¢æ°åŒã³åºããšããã»ã©å€ããããåŒæ°ã§æž¡ããããã¹ãŠã®ããŒã¿ã¯Webãœã±ãããä»ããŠãµãŒããŒã«ããŠã³ããŒããããŸãããŠãŒã¶ãŒãã¡ã€ã«ãèªã¿åãããã«ãHTML5ä»æ§ã®File APIã䜿çšããŸãããç»åãããŒãããäŸã¯ãæãæåãããšã¯éããŸããããæµæã®ãµãŒããŒåŽã®æ©èœããã瀺ããŠããŸããæ¬çªçšã«äœæããŠããå Žåã¯ãæ¢è£œã®CollectionFSãœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸãã
- çµæãããã«åçãã¢ããããŒãããŠãããŸããããŸããã§ãããå¯äžã®ãã®ã¯ImageMagickã§ããå¯äžã®ãã®ã¯ãã¹ãã¬ãŒãžçšã«ç¬èªã®ãã£ã¬ã¯ããªãäœæã§ããªãããšã§ãã
- ãªããžããª
ååãšããŠããã®ã¬ãã¹ã³ã§ã«ããŒãããã£ãã®ã¯ããã ãã§ãããå®å
šãæãããã«ãããŒãã®ã«ãŒãã®æ©èœãçµäºããŸãããã®ã¬ãã¹ã³ã«ãªããã®ã¯äœ¿çšããŸããããªããžããªã§éåžžã©ããå€æŽã確èªã§ããŸããåç
§è³æ