
ããã«ã¡ã¯ãhabrasocietyïŒ ãã®èšäºã§ã¯ãè¶³å Žã·ã¹ãã Yeomanã®ãžã§ãã¬ãŒã¿ãŒãäœæããçµéšã«ã€ããŠèª¬æããŸãã ãŸãããã®ã·ã¹ãã ãšãã®ã·ã¹ãã ãããã§èª¬æãããŠããªãããšã«å°ãé©ããŠããŸããããã ããé ãé¢ãã2012幎ã®1ã€ã®å°ããªèšåïŒ Yeoman.ioãé€ããŸãã äžèšã§æžããããã«ããã®èšäºã§ã¯ããããžã§ã¯ãçšã®Yeomanãžã§ãã¬ãŒã¿ãŒã®æ®µéçãªäœæãæ€èšããŸãã
yeomanãžã§ãã¬ãŒã¿ãŒïŒä»¥äžãåã«ãžã§ãã¬ãŒã¿ãŒãšåŒã³ãŸãïŒã¯ãyeomanãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ãæ§ç¯ãããã£ã¬ã¯ãã£ãã®å©ããåããnpmããã±ãŒãžã§ãã ãã®èšäºã§ã¯ããããžã§ã¯ãã§äœ¿çšããã¢ãŒããã¯ãã£ãŒïŒããªãªããããã³ãŒããŒãsass +ã³ã³ãã¹ãrequireïŒã®è¶³å Žãšãªããžã§ãã¬ãŒã¿ãŒã®äœæäŸãæ€èšããŸãã
åæããŒã¿
nodejs ã npm ã yeomanããã³npm-package generator-generatorãã€ã³ã¹ããŒã«ããããã·ã³ãå¿ èŠã§ãã
次ã«ããžã§ãã¬ãŒã¿ãŒãé 眮ãããã£ã¬ã¯ããªãäœæããå¿ èŠããããŸãïŒç§ã¯generator-puppeteerãšããååãä»ããŸããïŒã ãã©ã«ããŒãgenerator- prefixã§å§ãŸãããšã¯éåžžã«éèŠã§ãã ãã以å€ã®å Žåãäœæ¥ã®éå§æã«ãyeomanã¯ååãžã§ãã¬ãŒã¿ãŒ-<ãžã§ãã¬ãŒã¿ãŒå>ã§ã¢ãã«åããããã©ã«ããŒãäœæããŸãã
ã¹ããã1-ãžã§ãã¬ãŒã¿ãŒã®è¶³å Ž
# $ mkdir generator-puppeteer && cd $_ # $ yo generator
githubã®ãŠãŒã¶ãŒåãšãžã§ãã¬ãŒã¿ãŒã®ååã«é¢ãã2ã€ã®è³ªåã®åŸãyeomanã¯å°æ¥ã®ãžã§ãã¬ãŒã¿ãŒã®ã¹ã±ã«ãã³ããããã€ããŸãã
yeomanãçæãããã®ãèŠãŠã¿ãŸãããã
ãã£ã¬ã¯ããªïŒ
app-ãããžã§ã¯ãã³ã³ãã³ãã«é¢é£ãããã¹ãŠã®ãã¡ã€ã«ãé 眮ããããã£ã¬ã¯ããªãããšãã°ãbower.jsonãpackage.jsonããã¹ãŠã®ããŒãžã®ãã³ãã¬ãŒããªã©ã
node_modules- ãã§ãŒã¯ãmochaãªã©ãpackage.jsonã§æå®ããããžã§ãã¬ãŒã¿ãŒäŸåé¢ä¿ãæã€ãã£ã¬ã¯ããªã
ãã¹ã -ããã§ã¯ããžã§ãã¬ãŒã¿ãŒã®ãã¹ãŠã®ãã¹ãããããŸãã
ãã¡ã€ã«ïŒ
.editorconfig-ããã¹ããšãã£ã¿ãŒã®æ§æ
.gitattributes -gitã®ç¹å®ã®ãã£ã¬ã¯ããªãŸãã¯ãã¡ã€ã«èšå®
.gitignore -gitãã€ã³ããã¯ã¹ãäœæããªããã¡ã€ã«ãšãã£ã¬ã¯ããªã®ãªã¹ã
.jshintrc -jshint config
package.json-ãžã§ãã¬ãŒã¿ãŒäŸåé¢ä¿ãã¡ã€ã«
README.md -githubã®ãããžã§ã¯ãèšè¿°ãã¡ã€ã«
.travis.yml -CIã®ãã©ãããã©ãŒã ã瀺ããŸã
ãããã£ãŠããžã§ãã¬ãŒã¿ãŒã®ã¹ã±ã«ãã³ããããã€ãããŸãã
ã¹ããã2-å®è¡ãã¡ã€ã«ã®ç·šé
å人çã«ããªãã¿ã®ãªãã¢ãŒããã¯ãã£ãèŠããšãè«ççãªçåãçããŸãããããžã§ã¯ããžã®ãšã³ããªãã€ã³ãã¯ã©ãã§ããã ç§ãã¡ã®å Žåãããã¯appãã£ã¬ã¯ããªã«ããindex.jsãã¡ã€ã«ã§ãã 次ã®ããã«æ©èœããŸãããŸããpackage.jsonãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããåæåå®äºã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããŸãã --skip-installãã©ã°ãæž¡ãããªãã£ãå ŽåãåæååŸã«package.jsonããã³bower.jsonã§æå®ãããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããŸãã è€éãªããšã¯ãããŸãããïŒ è¶³å Žã®æšæºUIãã«ã¹ã¿ãã€ãºããŠã¿ãŸãããã ãããè¡ãã«ã¯ãaskForã¡ãœãããå€æŽããå¿ èŠããããŸããåæååŸã«æåã«åŒã³åºããããŠãŒã¶ãŒããå¿ èŠãªæ å ±ãããŒãªã³ã°ãã責任ããããŸãïŒãŸããããªãçŽ æµãªASCIIã¢ãŒããæç»ããŸãïŒã ãã®ã¡ãœããã¯Inquirerã©ã€ãã©ãªã®å®è£ ã䜿çšããŸããããã«ããã質åãäœæãããŠãŒã¶ãŒããæ å ±ãåãåãããšãã§ããŸãã ãŠãŒã¶ãŒã®èå³ãåŒããã®ãããšãã°ã¢ããªã±ãŒã·ã§ã³ã®ååãèŠã€ããŠã¿ãŸãããã
ãœãŒã¹ã³ãŒãïŒ
var prompts = [{ type: 'confirm', name: 'someOption', message: 'Would you like to enable this option?', default: true }]; this.prompt(prompts, function (props) { this.someOption = props.someOption; done(); }.bind(this));
ç·šéãããã³ãŒãïŒ
var prompts = [{ type: 'prompt', name: 'appName', message: 'Could you tell me the name of your new project?', }]; this.prompt(prompts, function (answers) { this.appName = answers.appName; done(); }.bind(this));
ãªããžããªã®ãµã³ãã«ããŒãžã§è©³çŽ°ã確èªã§ããŸã ã ããã§ãã®ã©ã€ãã©ãªã䜿çšãããšããããžã§ã¯ãã«å«ããå¯èœæ§ã®ããè¿œå ã®ãã¯ãããžãéžæããæ©äŒããŠãŒã¶ãŒã«äžããå Žåã«æã圹ç«ã¡ãŸããããšãã°ããããžã§ã¯ãã«ããŒãã¹ãã©ããã䜿çšããæ©èœãå«ãããã©ããããŠãŒã¶ãŒã«ç¢ºèªã§ããŸãã ãæ°ã¥ãã®ããã«ããã¹ãŠã®å€æ°ã¯ãžã§ãã¬ãŒã¿ãŒã€ã³ã¹ã¿ã³ã¹ã®ããããã£ãšããŠæžã蟌ãŸããŸã-åŸã§ããã³ãã¬ãŒãå ã§äœ¿çšããŸãã
ã¹ããã3-ã¢ããªã±ãŒã·ã§ã³æ§é ã®è¶³å Žãšãªããã£ã¬ã¯ãã£ãã®äœæ
次ã«ããžã§ãã¬ãŒã¿ãŒã®äžå¿ã§ããã¢ããªé¢æ°ãèŠãŠã¿ãŸãããã ããã§ãã¢ããªã±ãŒã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯ãçµã¿ç«ãŠãŸãã ãã®é¢æ°ã®æ¬äœã§äœãèµ·ãããïŒ
app: function () { this.mkdir('app'); this.mkdir('app/templates'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); }
ã芧ã®ãšãããããã©ã«ãã§ã¯ãã¹ãŠãæ°é®®ã§ãã2ã€ã®ãã£ã¬ã¯ããªãäœæãã2ã€ã®ãã³ãã¬ãŒãããããžã§ã¯ããã£ã¬ã¯ããªã«ã³ããŒããã ãã§ãã ã³ããŒæ©èœã¯ãsourceRootããã®ãœãŒã¹ãã¡ã€ã«ãštargetRootã«äœæããããã¡ã€ã«ã®ååã®2ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãåããŸãã index.htmlãã¡ã€ã«ãäœæããã³ãŒããæžããŸãããã ãããããããããã€ã³ã¹ããŒã«åã«éžæã§ãããªãã·ã§ã³ã«å¿ããŠãã€ã³ããã¯ã¹ã®å 容ãå€æŽãããã§ãããã ããšãã°ãã¿ã°ã«ãããžã§ã¯ãã®ååãèšå®ããã-this.copyã¯ããã§ã¯äžååã§ããthis.templateã¯ããã§åœ¹ç«ã¡ãŸãã ãããã®é¢æ°ã«ã€ããŠããã«è©³ããèŠãŠãããŸãããã äž¡æ¹ã®æ©èœã¯ã¢ã¯ã·ã§ã³/ã¢ã¯ã·ã§ã³ã®äžçŽç©ã®äžéšã§ããããã³ãã¬ãŒããã£ã¬ã¯ããªããã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªã«ãã¡ã€ã«ã移åããããã«å®è¡ãããŸããã1ã€ã®äŸå€ããããŸãã ãã³ãã¬ãŒãæ©èœã¯ãã³ãã¬ãŒãã䜿çšã§ããŸãã ãã®å©ããåããŠãsourceRootãããã¡ã€ã«ãã³ããŒãããã®ãã¡ã€ã«ã«ããŒã¿ã貌ãä»ããŠãtargetRootã«éä¿¡ã§ããŸãã äžèšã®äŸã䜿çšããŠããããå®è¡ããŠã¿ãŸãããã ãããžã§ã¯ããã£ã¬ã¯ããªïŒããã©ã«ãã®ã¢ããª/ãã³ãã¬ãŒãïŒã®sourceRootã«_index.htmlãã¡ã€ã«ãäœæããŸãã äŸãšããŠããã®èŠç¹ã䜿çšã§ããŸãã 次ã®ããã«å°ããªã¢ããªé¢æ°ãè¿œå ããŠã¿ãŸãããã
app: function () { this.mkdir('app'); this.mkdir('app/templates'); this.template('_index.html', 'index.html'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); }
ã§ã¯ããã³ãã¬ãŒãã®ããŒã¿ã¯ã©ãã§ååŸããŸããïŒ ããã©ã«ãã§ã¯ãããŒã¿ã3çªç®ã®å±æ§ã«ãã£ãŠæ瀺çã«æž¡ãããªãå Žåããã³ãã¬ãŒããšã³ãžã³ã¯ãžã§ãã¬ãŒã¿ãŒã®ã¹ã³ãŒããããŒã¿ã®ããã·ã¥ãšããŠäœ¿çšããŸãã this.appNameã®ããã³ãããä»ããŠå ¥åãããappNameãä¿åãããšããã¹ãŠã®ãã³ãã¬ãŒãã§èªåçã«å©çšå¯èœã«ãªããŸããïŒããŒã¿ããã·ã¥ãçŽæ¥æå®ãããŠããªãå ŽåïŒã ããã§ããã¡ã€ã«ããã©ã¡ãŒã¿ãŒåã§ããããã«ãªããŸããã 次ã®ã¹ãããã¯ãã¢ãŒããã¯ãã£èšèšã§ãã ç§ã¯èªåã®ãããžã§ã¯ãã®ã¢ãŒããã¯ãã£çšã®ãžã§ãã¬ãŒã¿ãæžããŠããã®ã§ããã®èšäºã§ã¯ãã®ã¢ãŒããã¯ãã£ã«äŸåããŸããã€ãŸãïŒ
app-ã¢ããªã±ãŒã·ã§ã³ã«ãŒã
ã¢ããª/ãã³ãã¬ãŒã -ãã³ãã¬ãŒã
ã¢ããª/ã³ã¢ -åºæ¬ã¯ã©ã¹
ã¢ããª/å ±é -ããŸããŸãªäžçŽç©ãªã©
ã¢ããª/éç -éçïŒç»åããã©ã³ãïŒ
ã¢ããª/ã³ã³ããŒãã³ã -ã³ã³ããŒãã³ã
ã¢ããª/ã¢ãžã¥ãŒã« -ã¢ãžã¥ãŒã«
ã¢ããª/ã¹ã¿ã€ã«ã·ãŒã -ã¹ã¿ã€ã«
app / libs-ãµãŒãããŒãã£ã©ã€ãã©ãª
ããã§ã¢ãŒããã¯ãã£ã³ã³ããŒãã³ããå®æããããã©ã«ãã§äœ¿çšããã©ã€ãã©ãªãèšå®ããã ãã«ãªããŸãã ããããåé¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã«é¢ããèŠè§£ãå ±æããããŸããŸãªäººã ã䜿çšãããžã§ãã¬ãŒã¿ãŒãäœæããããšã§ããããããã¯ãã¹ãŠåãããŒã«ãã§ãŒã³ã䜿çšããã®ã§ããããïŒ ã»ãšãã©ãªãã ãã¡ããããŸãšããªéçºè ãšããŠãç§ãã¡ã¯ãã®ãããªç¬éãäºèŠãããžã§ãã¬ãŒã¿ãŒããç®±ããåºããŠããµããŒãããããšãèšç»ããŠããæè¡ã®å°ãªããšãæå°éã®éžæãè¿œå ããå¿ èŠããããŸãã ç§ã®å ŽåãRequireJSãCoffeeScriptãSASS + Compassã§ããããžã§ãã¬ãŒã¿ãŒã䜿çšãããã³ã«ããããžã§ã¯ãã«è¿œå ãããã¯ãããžãŒãå°ããããŸãã Gruntfileãè¿œå ããããšãå¿ããªãã§ãã ããïŒ ãããã®è¿œå ãèæ ®ãããšãappã¡ãœããã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
app: function () { // Core application folder this.mkdir('app'); // Templates application folder this.mkdir('app/templates'); // Folder for base classes this.mkdir('app/core'); // Common project files this.mkdir('app/common'); // Static content, like images or fonts this.mkdir('app/static'); // Logic components for the project this.mkdir('app/components'); // Modules of the project this.mkdir('app/modules'); // Stylesheets directory this.mkdir('app/stylesheets'); // 3-rd party members libs this.mkdir('app/libs'); this.template('Gruntfile.js', 'Gruntfile.js'); this.template('_index.html', 'index.html'); // RequireJS config & App this.copy('js/app.js', 'app/app.js'); this.copy('js/main.js', 'app/main.js'); this.copy('_package.json', 'package.json'); this.copy('_bower.json', 'bower.json'); this.copy('_.bowerrc', '.bowerrc'); }
æåŸã«.bowerrcãã¡ã€ã«ãè¿œå ããäŸåé¢ä¿ãapp / libsãã£ã¬ã¯ããªã«ä¿åããããšã瀺ããŠããããšã«æ³šæããŠãã ããã
ã¹ããã4-ãµããžã§ãã¬ãŒã¿ãŒã®äœæ
ãããã£ãŠãããã»ã©æ·±ãã¯ãããŸãããããããžã§ã¯ãæ§é ãšindex.htmlã®åçŽãªãžã§ãã¬ãŒã¿ãŒãäœæããããšãã§ããŸãããããã¯ãããžã§ã¯ãã®ãšã³ããªãã€ã³ãã«ãªããŸãã ããããã§ããã ãããããšãŒãã³ã¯ãã£ãšå€ãã®ããšãã§ããŸãïŒ ããå°ãçµã£ãŠã¿ãŸãããïŒ
ãã§ã«èšè¿°ããå 容ã«åºã¥ããŠãyeomanã¯åæ段éã§ã¢ãŒããã¯ãã£ãå±éããããã«ã®ã¿äœ¿çšãããŸãããã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã®ãã³ãã¬ãŒããäœæããããã«äœ¿çšããŸãã äžã§æžããããã«ãç§ãã¡ã®ãããžã§ã¯ãïŒå°ãªããšããããžã§ã¯ãã®ã¢ãŒããã¯ãã£ïŒã§ã¯ãapp / componentsãã©ã«ããŒãè¿œå ããŸããããã®ãã©ã«ããŒã«æœè±¡çãªã³ã³ããŒãã³ããè¿œå ããŸãã ããå°ã詳ããïŒã³ã³ããŒãã³ããšã¯ãMVCã®ãããªã³ãŒãã®ç¹å®ã®çµç¹ãæå³ããŸããããã«ãããè«çãšã³ãã£ãã£ã®æäœã容æã«ãªããŸãã ãããã£ãŠãããšãã°ãã³ã¡ã³ãã®ãããããã¯ã¯ã¢ããªã±ãŒã·ã§ã³ã®è€æ°ã®ããŒãžã«é 眮ããå¿ èŠããããŸãã ã¢ãžã¥ãŒã«ããã³ãŒããã³ããŒïŒããŒã¹ããããåžžã«äžè²«ããç¶æ ã«ä¿ã€ããã«ãCommentComponentãäœæããŸããããã¯ãAPIãä»ããŠç°ãªãã¢ãžã¥ãŒã«ããåŒã³åºããŸããããšãã°ã
var _this = this; var commentComponent = new CommentComponent; commentComponent.getUserComments({user_id: 1}).done(function(commentsView) { _this.layout.comments.show(commentsView); });
ãããã£ãŠããã®ãããªã³ã³ããŒãã³ããå¯èœãªéãè¿ éã«äœæã§ããã°å®³ã¯ãããŸããïŒçµå±ã®ãšããã誰ããã¡ã€ã«ããã©ã«ããŒãäœæããã®ã奜ãã§ã¯ãããŸãããïŒïŒã ã³ã³ããŒãã³ãã䟿å©ãªããŒã ã«ãã£ãŠäœæãããå Žåãã©ã®ããã«èšããŸãã
# CommentsComponent $ yo puppeteer:component 'Comments'
ããã§ã¯ããã®ããŒã ãã§ããããšã決ããŸããããïŒ ããšãã°ãapp / components / commentsãã©ã«ãã«MVCã¢ãŒããã¯ãã£ãäœæããå¿ èŠãªæå°éã®ãã¡ã€ã«ã»ãããçæããŸãã
ã¢ãã«/ comment.js
ã³ã¬ã¯ã·ã§ã³/ comments.js
ãã¥ãŒ/ comments.js
ãã¥ãŒ/ comment.js
controller.js
äœãããå¿ èŠãããã®ãââèŠãŠã¿ãŸãããã ãŸãããµããžã§ãã¬ãŒã¿ãŒãã¬ãŒã ãäœæããŸãããã ãããè¡ãã«ã¯ããžã§ãã¬ãŒã¿ãŒã®ã«ãŒããã©ã«ããŒãã次ã®ã³ãã³ããå®è¡ããŸãã
# - "component" $ yo generator:subgenerator 'component'
ã ããã圌ãç§ãã¡ã®ããã«çæãããã®ãèŠãŠã¿ãŸãããïŒ
ã¢ããª/ã³ã³ããŒãã³ã
ã¢ããª/ã³ã³ããŒãã³ã/index.js
ã¢ããª/ã³ã³ããŒãã³ã/ãã³ãã¬ãŒã/ somefile.js
ã³ã¢ã§ã¯ããµããžã§ãã¬ãŒã¿ãŒã¯åãéåžžã®ãžã§ãã¬ãŒã¿ãŒã§ãããåãAPIãæã¡ããã®å ãšã»ãŒåãæ§é ãæã£ãŠããŸãã ãããã£ãŠãindex.jsãéãããšãã«äœã衚瀺ãããŸããïŒã³ã³ããŒãã³ãã¯NamedBaseãç¶æ¿ãã2ã€ã®å®çŸ©æžã¿ã¡ãœããïŒinitãšfilesãæã£ãŠããŸãã ãæ³åã®ãšãããinitã§ã¯åŒã³åºãå ã®ãµããžã§ãã¬ãŒã¿ãŒã®greetings-msgãååŸããfilesã¡ãœããã§ã¯ãžã§ãã¬ãŒã¿ãŒã®ãã¹ãŠã®ããžãã¯ãçŽæ¥èšè¿°ããŸãã ç§ã¯ããã«çŠç¹ãåãããŸãã ããã«ã¯æ°ãããã®ã¯äœããããŸããã ç§ã®ãµã³ãã«index.js ãèŠç¹ã§èŠãããšãã§ããŸãã
次ã«ããã¡ã€ã«èªäœã®ãã³ãã¬ãŒããäœæããŸãã ãŸããæ°ããããšã¯äœããããŸãããããã¯æ¢ã«äžèšã§è¡ã£ãŠããŸãã ãã€ãã®ããã«ã ããã§ç§ã®ããŒãžã§ã³ãèŠã€ããããšãã§ããŸãã
ã¹ããã5-ãžã§ãã¬ãŒã¿ãŒã®èµ·å
ãžã§ãã¬ãŒã¿ãŒãèµ·åããã«ã¯ããŸãnpmããã±ãŒãžãžã®ãªã³ã¯ãäœæããå¿ èŠããããŸãã ãããè¡ãã«ã¯ããžã§ãã¬ãŒã¿ãŒãã©ã«ããŒãã次ã®ã³ãã³ããå®è¡ããå¿ èŠããããŸãã
$ npm link
ãªã³ã¯ãäœæãããã®ã§ããã¹ããã£ã¬ã¯ããªãäœæããŠãååŸããå 容ã確èªã§ããŸãã
$ mkdir TestProject && cd $_ && yo puppeteer