Yeomanã§ããã³ãã¨ã³ãã¨ããã¯ã¨ã³ããµã¼ããä¸ç·ã«éçºãã
å æãHTML5ãªã©åå¼·ä¼ã«åå ããæãéè«ã¿ã¤ã ã§
ã yeoman ã使ã£ã¦ããã¯ã¨ã³ãã®éçºã¨ãã§ããªãã§ããï¼ ã
ã¨ããå 容ã«å¯¾ãã¦ããã©ãã¼ã¨ãã¦
ï½¢ gruntã§ãªãã¼ã¹ãããã·ä½¿ãã¾ãã ï½£
ã£ã¦ããã話ãããã
ãã®ã¾ã¾è¨äºã«æ¸ãããã¾ãã§ç³ã訳ãªããªã¼ã¨æã£ã¦ãããã@bathtimefish ãããããã°ãã¢ããããã¦ããã
ãã®è¨äºã
Yeomanã§ããã³ãã¨ã³ãã¨REST APIãµã¼ãã¼ãåæã«éçºããæ¹æ³
ã§ãªãã¼ã¹ãããã·ã使ã£ãææ³ãæãã£ã¦ããã®ã§ãããgruntã®ã¢ã¸ã¥ã¼ã«ã使ãã¨ããå°ã楽ãã§ãããã
ç§ã¯ãeasymock ãç¥ããªãã£ãã§ããããã¯ãyeoman 使ã£ã¦ã人ãå¨ãã«ãã¾ãããããååã®åå¼·ä¼ã¯é常ã«åå¼·ã«ãªã£ãã®ã§ãããã¯ä¸ã¤å¾¡ç¤¼ã®æå³ãè¾¼ãã¦ããã°ãæ¸ããã¨æãã¾ãã
ã¨ãããã¨ã§ãyeoman(grunt) ã使ã£ãããã¯ã¨ã³ãéçºã®ããä¸ã¤ã®ææ³ãæ¸ãã¦ããã¾ãã
ãã¦ãããããæ¬é¡ã
ãã¼ã¹ã¨ãªãæé ã¯å ã®è¨äºãè¦ã¦ããã ãã¤ã¤ãéä¸ã¾ã§ã¯ã ãããåãã§ãã
Yeomanã¯ä½¿ããç°å¢ãæ´ã£ã¦ããã®ãåæã
使ããªãå ´åã¯Yeoman å°å
¥ç·¨ãåç
§ãã¦ã¿ã¦ãã ããã
ã¾ã REST APIãµã¼ãã®ã¢ãã¯ãç°¡åã«ä½ãã easymock ãã¤ã³ã¹ãã¼ã«
$ npm install -g easymock
Node.jsã®v0.10.1 ã§ã¯ã¤ã³ã¹ãã¼ã«ã§ããªãã£ãã®ã§ä»åã¯v0.8.14ã§ã
次ã«yeomanã§ããã³ãã¨ã³ãã®ç°å¢ãæ§æ
$ mkdir /path/to/test
$ cd /path/to/test
$ yo webapp
_-----_
| |
|--(o)--| .--------------------------.
`---------´ | Welcome to Yeoman, |
( _´U`_ ) | ladies and gentlemen! |
/___A___ '__________________________'
| ~ |
__'.___.'__
´ ` |° ´ Y `
Out of the box I include HTML5 Boilerplate, jQuery and Modernizr.
Would you like to include Twitter Bootstrap for Sass? (Y/n) y
Would you like to include RequireJS (for AMD support)? (Y/n) y
...(çç¥)
ãããããeasymock ç¨ã®ãã©ã«ããä½æã
$ mkdir -p server/api-server/api/items
次㫠easymock ã®è¨å®ãã¡ã¤ã«ãä½æ
$ vim server/api-server/api/config.json
{
"simulated-lag": 1000,
"cors": false,
"jsonp": false,
"proxy": {
"server": "http://api.realserver.com",
"default": false
},
"variables": {
"server": "http://api.realserver.com"
},
"routes": [
"/items/:itemid"
]
}
ã¢ãã¯ã¨ãªãjsonãä½æ
$ vim server/api-server/api/items/_get.json
[
{ "id": 1, "user": "john", "message": "hello" },
{ "id": 2, "user": "bob", "message": "Hi!" },
{ "id": 3, "user": "mike", "message": "good bye." }
]
APIã¢ãã¯ç¨ã®ãµã¼ãã¼ããã¡ããã¦ã¿ã¾ãã
$ cd server/api-server
$ easymock
Server running on http://localhost:3000
Server running on http://localhost:3000/_documentation/
http://localhost:3000/api/items/
ã«ã¢ã¯ã»ã¹ããã¨é
ç½®ããjsonãã¡ã¤ã«ãåºåããã¦ãã¾ãã
[
{
"id": 1,
"user": "john",
"message": "hello"
},
{
"id": 2,
"user": "bob",
"message": "Hi!"
},
{
"id": 3,
"user": "mike",
"message": "good bye."
}
]
ã§ã¯ãããã³ãå´ãæ§æãã¦ããã¾ãã
$ cd /path/to/test/
ã¾ããindex.htmlã®ã³ã³ããé¨åãæ¸ãæãã¾ãã
$ vim /app/index.html
<div class="container">
<div class="hero-unit">
<h1>API Data</h1>
<ul>
</ul>
<h3>Enjoy coding! - Yeoman</h3>
</div>
</div>
次ã«app.coffeeãã¡ã¤ã«ãä½æãã¾ãã
$ vim /app/scripts/app.coffee
define(['jquery'], ($)->
'use strict'
$.getJSON('api/items/', (data)->
ul = document.querySelector('div.hero-unit > ul')
for row in data
li = document.createElement 'li'
txt = document.createTextNode "#{row.id}, #{row.user}, #{row.message}"
li.appendChild txt
ul.appendChild li
)
'loading api data.'
)
ã²ã¨ã¾ãyeomanåç¬ã§åããã¦ã¿ã¾ãã
$ grunt server

$.getJSONã®åå¾å ããªãã®ã§scriptã§åå¾ãããã¨ãã¦ãjsonã®å¤ã¯è¡¨ç¤ºããã¦ãã¾ããã
ã§ããããããå è¨äºã¨éãã¨ããã§ããã
grunt ã«ãªãã¼ã¹ãããã·ç¨ã®ã¢ã¸ã¥ã¼ã«ãããã®ã§ããã使ãã¾ãã
- grunt-connect-proxy
- https://github.com/drewzboto/grunt-connect-proxy
å é¨çã«http-proxyãå¼ãã§ããã®ã§ãããGruntfile.js ã§ç®¡çã§ããã®ã§é常ã«ä¾¿å©ã§ãã
$ npm install -D grunt-connect-proxy
-D (--save-dev) 㯠ã¤ã³ã¹ãã¼ã«ããã¢ã¸ã¥ã¼ã«ãpackage.jsonã«æ¸ãè¾¼ãããã«ãªãã·ã§ã³ã§æå®ãã¾ãã
次ã«ãªãã¼ã¹ãããã·ã®è¨å®ãè¡ãã¾ãã
- 1, ãããã·ç¨ã¹ããããã®ãã¼ã
- 2, ãããã·ã®è¨å®(/api 対象)
- 3, configureProxies ã¿ã¹ã¯ã®è¿½å
$ vim Gruntfile.js
'use strict';
var lrSnippet = require('grunt-contrib-livereload/lib/utils').livereloadSnippet;
//(proxyç¨ã¹ããããã追å )ã»ã»ã»1
var proxySnippet = require('grunt-connect-proxy/lib/utils').proxyRequest;
var mountFolder = function (connect, dir) {
return connect.static(require('path').resolve(dir));
};
//...ï¼çç¥ï¼
connect: {
options: {
port: 9000,
// change this to '0.0.0.0' to access the server from outside
hostname: 'localhost'
},
livereload: {
options: {
middleware: function (connect) {
return [
lrSnippet,
proxySnippet, //ã¹ãããã追å ã»ã»ã»1
mountFolder(connect, '.tmp'),
mountFolder(connect, 'app')
];
}
}
},
//ãããã·è¨å®ã»ã»ã»2
proxies: [{
context: '/api',
host: 'localhost',
port: '3000',
https: false,
changeOrigin: false
}],
test: {
//...(çç¥)
}
});
grunt.registerTask('server', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'open', 'connect:dist:keepalive']);
}
grunt.task.run([
'clean:server',
'concurrent:server',
'configureProxies', //ã¿ã¹ã¯è¿½å ã»ã»ã»3
'livereload-start',
'connect:livereload',
'open',
'watch'
]);
});
};
yeomanã®ããã³ããµã¼ãããã¡ããã¦ã¿ã¾ãã
ï¼è£ã§easymockãèµ·åããã®ãå¿ããã«ï¼
$ grunt server
...(çç¥)
Running "configureProxies" task
Proxy created for: /api
Running "livereload-start" task
... Starting Livereload server on 35729 ...
Running "connect:livereload" (connect) task
Starting connect web server on localhost:9000.
...(çç¥)
yeomanå´ã®ããã³ããµã¼ããèµ·åãã¦ãã¾ããã/api 以ä¸ã®ã¢ã¯ã»ã¹ã«å¯¾ãã¦ã¯ 3000ãã¼ã(easymockå´)ã®APIãµã¼ããå©ãã¦ãã¾ãã

http://localhost:9000/api/items
ã¸ã¢ã¯ã»ã¹ããã¨ã
http://localhost:3000/api/items
ã®å
容ã表示ããã¦ãããã¨ããããã¾ãã

ã¡ãªã¿ã«Gruntfile.jsã®ãããã·è¨å®ã®contextã®å¤ãï½¢/ï½£ã«ããã¨9000çªãã¼ãã¸ã®ãã¹ã¦ã®ã¢ã¯ã»ã¹ã3000çªãã¼ãã¸ã¨æµãã¾ãã
proxies: [{
context: '/',
host: 'localhost',
port: '3000',
https: false,
changeOrigin: false
}],
ãã®å ´åãããã³ãã§èµ·åããyeoman(grunt server)ã®å½¹ç®ã¯LiveReloadã ãã«ãªããããã¯ã¨ã³ãã®ãµã¼ãã®å
容ã表示ããã¾ãã
ãã¨ã¯watchãããã¡ã¤ã«ãé©å®ä¿®æ£ããã°OKã§ãã
ããå°ãYeomanã§ã®ç®¡çæ§æã¨ãã¦è¸ã¿è¾¼ãã¨ãããªã easymock ãå¥ã§èµ·åããã®ãé¢åãªã®ã§ãgrunt ãã node ã® child_process ã使ã£ã¦ä¸æ¬ã§èµ·å管çãããã¨ããã§ãã
ããã§æ¸ãã¨è¨å®ãè¦è¾ããªãã®ã§ã¾ã次ã®æ©ä¼ã«ã
â¡â¡â¡â¡â¡â¡
ãªãã¼ã¹ãããã·ã使ããã¨ã«ãã£ã¦ãããã¯ã¨ã³ããApacheãnginxãNode.jsã§ããªãã§ã使ãã¾ãã
ã§ãã®ã§ãä»åã¯easymockãããã¯ã¨ã³ããµã¼ãã¨ãã¦èµ·åãã¦ãã¾ããããWordPressãªãããåããã¤ã¤ãã¼ãã®CSSãç£è¦ãã¦ã©ã¤ããªãã¼ãããããã§ãã¾ãããç§ã¯Node.jsã使ãã®ã§ãExpressã®æ§æã§coffeeã¨Sassã®ã©ã¤ããªãã¼ãããããããã³ãã¬ã¼ããã¤ãã£ãããã¦é常ã«æ¥½ããéçºãã§ãã¦ã¯ãã©ãã¾ãã
ã¨ãããã¨ã§ä¸åº¦ä½¿ã£ã¦ã¿ã¦ã¯ãããã§ãããã