2æ¥ã§ã§ãã JavaScriptTraining
==============================
JavaScript åå¿è
ã JS ã®æªæ¥ãè¦æ®ãã¤ã¤ã
åºç¤ãã²ã¨ã¨ãã身ã«ä»ããããã®è³æã§ãã
ãã® README 㯠`npm run presentation` ã§
åçãããã¨ãã§ãã¾ãã
è§£çã»è§£èª¬ã«ã¤ãã¦
------------------
è§£ç㯠[2015-example-solution](https://github.com/mixi-inc/JavaScriptTraining/compare/2015...2015-example-solution) ã§è¦ããã¾ãï¼
ãã¬ã¼ãã³ã°ã®ç®æ¨
------------------
ãã®ãã¬ã¼ãã³ã°ã®ç®æ¨ã¯ã
**ã¢ã¸ã¥ã¼ã«ãèªã¿æ¸ãã§ããããã«ãªãã**
èªåã®å¥½ããªã¢ã¸ã¥ã¼ã«ã
ã¤ãããããã«ãªããã¨ã§ãã
ãã¬ã¼ãã³ã°ã®åã«ãã»ããã¢ããã
çµãããã¦ãã¾ãã¾ãããã
ã»ããã¢ãã
------------
### 1. ç°å¢ãã»ããã¢ãã
ãã®ç ä¿®ã§ã¯ [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html) ãå©ç¨ãã¾ãã
ä¸ã®ãªã³ã¯ãã Chrome ãã¤ã³ã¹ãã¼ã«ãã¦ãã ããã
[Node.js](http://nodejs.jp/nodejs.org_ja/) ãå©ç¨ãã¦ãã¾ãã
ãã¡ããä¸ã®ãªã³ã¯ããã¤ã³ã¹ãã¼ã«ãã¦ãã ããã
### 2. JavaScriptTraining ã fork
JavaScriptTraining ã®å¦ç¿å±¥æ´ãæ®ãããã«ã
JavaScriptTraining ãªãã¸ããªã fork ãã¾ãã
ç»é¢å³ä¸ã«ãã fork ãã¿ã³ãæ¼ãã¦ãã ããã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/fork-button.png)
### 3. å¿
è¦ãªãã®ããã¦ã³ãã¼ã
ããããã¯ã¿ã¼ããã«ä¸ã§ã®æä½ã«ãªãã¾ãã
ãªãã¸ããªã® URL ãã³ãã¼ããä¸ã®ã³ãã³ãã
ã¿ã¼ããã«ã§å®è¡ãã¦ãã ããã
git clone ã³ãã¼ããURL
### 4. ã»ããã¢ãã
ä¸ã®ã³ãã³ããã¿ã¼ããã«ã§å®è¡ãã¦ãã ããã
cd JavaScriptTraining
npm install
### 5. webãµã¼ãã¼ãç«ã¡ä¸ãã
ä¸ã®ã³ãã³ããã¿ã¼ããã«ã§å®è¡ãã¦ãã ããã
ãªãããã¬ã¼ãã³ã°ä¸ã¯ãã®ã³ãã³ãã
çµäºããªãã§ãã ããã
npm run serve
### 6. ããããã¼ã¸ã«ã¢ã¯ã»ã¹ãã
ãã©ã¦ã¶ãã [http://localhost:8000](http://localhost:8000) ã¸
ã¢ã¯ã»ã¹ãã¦ãã ããã
ãã¬ã¼ãã³ã°ã®ä¸è¦§ã表示ããã¦ããã°å®äºã§ãã
ãã¬ã¼ãã³ã°åã¬ã¯ãã£ã¼
------------------------
### JavaScript ã¨ã¯
> JavaScript ã¯ã¦ã§ãã®è¨èªã§ãã
>
> ã¦ã§ããã¼ã¸ã«ããç¹å®ã®è¦ç´ ã
> æä½ããææ®µã¨ãã¦å§ã¾ãã¾ãããã
> éæ¹ããªãæé·ãã¾ããã
>
> (JavaScript ãã¿ã¼ã³, O'Reilly)
### JavaScript ã®ãããã¨ãã
> ã¯ã©ã¹ã¨ãããã®ããªãã
> 第ä¸ç´ãªãã¸ã§ã¯ãã§ãã颿°ã
> å¤ãã®ä»äºã«ä½¿ããã¾ãã
>
> (JavaScript ãã¿ã¼ã³, O'Reilly)
> Java ã PHP ã追å ãã¯ããã
> ã¯ãã¼ã¸ã£ã¼ãç¡å颿°ã¨ãã£ã
> æ©è½ã¯ãJavaScript éçºè
ã
> 楽ããã§ããæ©è½ã§ããã
> ããã®ãå½ç¶ã ã¨æããã¦ãã¾ããã
>
> (JavaScript ãã¿ã¼ã³, O'Reilly)
### 楽ããã§ããæ©è½ï¼ï¼ï¼
```javascript
['Foo', 'Bar', 'Buz'].forEach(function(name) {
console.log('hello ' + name);
});
```
ï¼ã¯ãã¼ã¸ã£ã¼ã¯ãã¬ã¼ãã³ã°ã§æ±ãã¾ãï¼
### JavaScript ã¯ã©ãã§åãã®ã
- Web ãã©ã¦ã¶
- Node.js, io.js
JavaScript ã®ç¹è²ã®ã²ã¨ã¤ã¯ããã©ã¦ã¶ä¸ã§
åä½ããã¨ãããã¨ã§ãããã©ã¦ã¶ä¸ã§åä½ã§ãã
è¨èªã¯ããã¤ãããã¾ãããä¸è¬çã«
JavaScript ããã使ããã¾ãã
### ã㤠JavaScript ã使ãã®ã
- Web ãã¼ã¸ã«ç¬èªã®åããã¤ãããã¨ã
ï¼ä¸é¨ã¯ CSS ã§ã§ãã¾ãï¼
- ãã¼ã¸é·ç§»ãªãã«ãµã¼ãã¼ã¨éä¿¡ãããã¨ã
- ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°
- ããã³ãã¨ã³ãã¨ã³ã·ã¹ãã 使ãããã¨ã
ï¼ã¿ã¹ã¯ã©ã³ãã¼ã¨ãããã±ã¼ã¸ããã¼ã¸ã£ï¼
### JavaScript ã使ãã¨â¦
- ã¢ãã¡ã¼ã·ã§ã³ã®ä¾: [Si digital](http://sidigital.co/)
- ã¤ã³ã¿ã©ã¯ã·ã§ã³ã®ä¾: [Vim.js](http://coolwanglu.github.io/vim.js/emterpreter/vim.html)
- Web API ã®ä¾: [Google Map](https://www.google.co.jp/maps)
JavaScript ã«ä¼ãã«ããã
-------------------------
### 1. éçºãã¼ã«ãéã
Chrome ã§ [http://localhost:8000](http://localhost:8000) ãéãã¾ãã
Web ãã¼ã¸ã®é©å½ãªå ´æã§
å³ã¯ãªã㯠> è¦ç´ ã®æ¤è¨¼
ã¾ãã¯
- Mac ã®äººï¼ â + ⥠+ i
- Windows ã®äººï¼Ctrl + Shift + i
### 2. Console ãéã
éçºãã¼ã«ã鏿ããEsc ãã¼ã
æ°åããã¦ã¿ã¦ãã ããã
ããã¨ãä¸ã« Console ãåºã¦ãã¾ãã
ãã® Console ãããJavaScript ã
å®è¡ãããã¨ãã§ãã¾ãã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/console.png)
### 3. ä½ãå®è¡ãã¦ã¿ã
試ãã« `alert('Foo');` ã¨å®è¡ãã¦ã¿ã¦ãã ããã
ã¢ã©ã¼ããããã¢ããã表示ããã¾ãã
### 4. è¨ç®ããã¦ã¿ã
`1 + 1` ã `'Foo' + 'Bar'` ãªã©ãå®è¡ã§ãã¾ããã
### 5. 夿°ä»£å
¥ã»åç
§ãã¦ã¿ã
夿°ä»£å
¥ã»åç
§ãã§ãã¾ããã
```javascript
var foo = 'bar';
foo;
```
### 6. ãã©ã¦ã¶ãªãã¸ã§ã¯ããããã
ãã©ã¦ã¶ãªãã¸ã§ã¯ããããã£ã¦ã¿ã¾ãããã
```javascript
document.title = 'ããªãã¨java ä»ãããã¦ã³ãã¼ã';
```
Chrome ã®ã¿ãåãæ¸ãå¤ããã¾ããã
### 7. ãã¼ã¸ãåèªã¿è¾¼ã¿ããã¨æ»ã
ãã¼ã¸ãåèªã¿è¾¼ã¿ãã¦ã¿ã¦ãã ããã
ããã¾ã§ã®å¤æ´ã¯ãã¹ã¦ãªã»ããããã¾ãã
ï¼ã¤ã¾ãããã®æ¹æ³ã§æ¬çªãªãªã¼ã¹ã¯
ã§ããªãã¨ãããã¨ã§ããï¼ï¼
### 8. JavaScript ã¨ããã§ä¼ãã
- ã¹ã¯ãªããèªã¿è¾¼ã¿ãã¿ã¼ã³ï¼æ¨å¥¨ï¼
<script src="foo.js"></script>
- ã¤ã³ã©ã¤ã³ãã¿ã¼ã³
<script>alert('inline!');</script>
- ã¤ã³ã©ã¤ã³ã¤ãã³ããã³ãã©ã¼ãã¿ã¼ã³
<img src="buz.png" onerror="alert('onerror!')">
- ããã¯ãã¼ã¯ã¬ãããã¿ã¼ã³
<a href="javascript: alert('bookmarklet!')"></a>
éçºç°å¢éå ´
------------
ï¼ãããã¯ãã¨ã ï¼
JavaScript ãå¹ççã«æ¸ããããã«ããããã«
æä½éã®éçºç°å¢ãæ´ãã¾ãã
JavaScript ã«ç²¾éãã¦ããªã人ã«
ãã©ããªãã¼ã«ã使ã£ããããã§ããï¼ãã¨
èããããã¨ãããããã¾ãã
ç§ã¯ãæ§æãã¤ã©ã¤ã㨠lint ã使ãã¨ããã§ãããã
ã¨çãããã¨ã«ãã¦ãã¾ãã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/syntax-error.png)
ã²ã¨ã¤ã¨ãã½ã¼ããç´¹ä»ãã¾ãã
JavaScript ã«ã¯éç忤æ»ããªããã¨ãã
è¨å·ãå¤ãæ§æããã¾ãã仿§ãããã¤ãããã®ã§ã
ãã¹ãç¯ããããè¨èªã®ä¸ã¤ã§ãã
ãã¨ãã°ãJavaScript ã«ã¯ `"use strict"` ã¨ãã
宣è¨ãããã¾ãããã®å®£è¨ã¯ JavaScript ã®
ã¾ãã仿§ã®ä¸é¨ãã¨ã©ã¼ã«ãããã¨ã§ä¿®æ£ã
ä¿ã广ããããããè¨è¿°ãæ¨å¥¨ããã宣è¨ã§ãã
ããããã¸ã§ã¯ãã§æ°ãå©ããã
ããã°ã©ãã¼ã `"use strict"` ã
æ°ããã¹ã¯ãªããã§ä½¿ãå§ãã¾ããã
```javascript
"use strict";
// Do something...
```
ããã¯ãéçºæã®ãã¹ãæ©æçºè¦ã§ããããã«
ããããæ¹æ³ã§ãï¼
ãããããªãªã¼ã¹å¾ãæ°ããã¹ã¯ãªããã¨ã¯
é¢ä¿ãªãã¯ãã® JavaScript ã«ãã
ã¡ãã¥ã¼ãåä½ããªããªã£ã¦ãã¾ããã
ãªãã§ããããï¼
ããã¯ãããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ã®ä¸ç°ã§
è¤æ°ã® JavaScript ãã¡ã¤ã«ãçµåãã¦ãããã¨ã
ãã¡ã¤ã«ã«å¯¾ãã `"use strict"` ãå©ç¨ãã¦ãã
ãã¨ã®2ã¤ãåå ã¨ãªã£ã¦èµ·ããä¸å
·åã§ãã
`"use strict"` ãçµåããã
ãã¹ã¦ã®ãã¡ã¤ã«å
¨ä½ã«å¹ãããã«
ãªãã`"use strict"` ã«å¯¾å¿ãã¦ããªã
å¤ããã¡ã¤ã«ãã¨ã©ã¼ãåºãããã«
ãªã£ã¦ãã¾ã£ã¦ããã®ã§ããã
ãã®ã¨ãã½ã¼ãã¯ããããã**åè¦æ®ºã**ã§ãã
ãä½ããã©ããã¦ãããªä»æ§ãªã®😱ã
ã¨è¨ããããªãã¾ããã
æ²ãããã¨ã«ããã®ãããªè½ã¨ãç©´ã¯
JavaScript ã®ä»æ§ã»æåã«æ°å¤ã
æ½ãã§ãã¾ãã
ãããã®ãã¹ãã©ã®ããã«ããã
é²ããã®ã§ããããï¼
[ESLint](http://eslint.org/) ã [JSHint](http://jshint.com/)ã [JSLint](http://www.jslint.com/) ã®ãã㪠lint ã
使ãã¾ãããã
ãã¨ãã°ãESLint ãå®è¡ããã¨
ä¸ã®ãããªè¦åãåºããã¾ããããã«ãã£ã¦ã
æ½å¨çãªä¸å
·åãã ãã¶æ¸ãããããã«ãªãã®ã§ãã
Use the function form of "use strict".
ï¼é¢æ°å½¢å¼ã® "use strict" ã使ã£ã¦ãï¼
ãã¹ãé²ãããã«ã¯ããé å¼µããã¨ã
ãæ³¨æãããã®ãããªç²¾ç¥è«ã§ã¯ãªãã
lint ã«ãã£ã¦é²æ¢ãããã¨ãå¿
è¦ã§ãã
ããªãã JavaScript ã«ã¾ã ç²¾éãã¦ããªãã®ã§
ããã°ãçã£å
ã«ãããã¹ã㯠lint ãªã®ã§ãã
1. lint ãããã¦ã¿ã
ã¿ã¼ããã«ã§ä¸ã®ã³ãã³ããå®è¡ãã¦ãã ããã
ESLint ãå®è¡ããã¾ãã
npm run lint-stage-1
2. æ§æãã¤ã©ã¤ããå¹ããã
ã»ã¨ãã©ã®ã¨ãã£ã¿ã¯æ§æãã¤ã©ã¤ãã
ãµãã¼ããã¦ãã¾ããVim ã®ããã«
æ§æãã¤ã©ã¤ããé¸ã¹ãã®ã§ããã°ã
ãããã¹ã®ããããããæ§æãã¤ã©ã¤ãã
å©ç¨ãã¾ãã
ãã¬ã¼ãã³ã°
------------
### ã¹ãã¼ã¸1
DOM è¦ç´ ãåå¾ãããã¬ã¼ãã³ã°
#### DOM ã¨ã¯
Web ãã¼ã¸ã¯ HTML ã®ã¿ã°ã«ãã£ã¦
æ§æããã¦ãã¾ãã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github.png)
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github-elements.png)
ãã® 3D ãã¥ã¼ãè¦ãã¨ãè¤æ°ã® HTML ã¿ã°ãã
Web ãã¼ã¸ãæ§æããã¦ãããã¨ããããããã¾ãã
ãã® HTML ã¿ã°ã¯ä¸ã®ãããªæ¨æ§é ãã¨ã£ã¦ãã¾ãã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github-elements.png)
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github-tree.png)
å®éã«ã[mixi-inc/JavaScriptTraining](https://github.com/mixi-inc/JavaScriptTraining) ãéãã
éçºã³ã³ã½ã¼ã«ã®Element ã¿ãã«è¡¨ç¤ºããã¦ãã
æ§é ã確èªãã¦ã¿ã¦ãã ããã
DOM (Document Object Model) ã¯ããã® HTML ã®ã¿ã°ã
JavaScript ã®ä¸çã§æä½ãããã¨ãã§ãã API ã§ãã
HTML ã¿ã°ã¯ãJavaScript ã®ä¸çã§
DOM è¦ç´ ã¨ãããªãã¸ã§ã¯ãã¨ãã¦æ±ããã¾ãã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/github-tree.png)
HTML ã®ã¿ã°ã JavaScript å´ã§æä½ããããã«ã¯
HTML ã®ã¿ã°ã HTML ææ¸ããåãåºãã
JavaScript ã®ä¸çã¸ã¨åã£ã¦ããªããã°ãªãã¾ããã
ãã®ã¹ãã¼ã¸ã§ã¯ãHTML ãã DOM è¦ç´ ã
åå¾ããã¨ããæä½ã«ã¤ãã¦å¦ã³ã¾ãã
HTML ã¿ã°ã«ã¯ãç®å°ã¨ãªãããã¤ãã®æ
å ±ã
ä»å±ãã¦ãã¾ãããã¨ãã°ãä¸ã® div ã¿ã°ã«ã¯
ID 屿§ãä»å±ãã¦ãã¾ãã
```html
foo
```
JavaScript ã¯ãã®ç®å°ã DOM API ã«æ¸¡ããã¨ã§ã
DOM è¦ç´ ãåå¾ãããã¨ãã§ãã¾ãã
```javascript
var div = document.getElementById('foo');
```
ä»ã«ã CSS ã¯ã©ã¹ãã¿ã°åããã®ä»ã®å±æ§ããã
DOM è¦ç´ ãåå¾ãããã¨ãã§ãã¾ãã
```html
foo
```
#### CSS ã»ã¬ã¯ã¿ã«ã¤ãã¦
ã¾ããç®å°ã®æå®ã®ä»æ¹ã®ã²ã¨ã¤ã«ã
CSS ã»ã¬ã¯ã¿ãããã¾ãã
ãã¨ãã°ã`foo` ã¨ãã ID ã®ã¤ããã¿ã°ã§ããã°ã
```html
foo
```
```javascript
var div = document.querySelector('#foo');
```
ã¨ããããã«ãID ã®å
é ã« `#` ãã¤ãã
IDã»ã¬ã¯ã¿ `#foo` ã§ãåå¾ããã DOM è¦ç´ ãæç¤ºãã¾ãã
ãã®æ¹æ³ã®å©ç¹ã¯ãè¤éãªä½ç½®ã«ãã DOM è¦ç´ ã
åå¾ãããã¨ãã§ããã¨ãããã¨ã§ãããã
ä¸ã® HTML ã® bar ãå
ã `div` ã¿ã°ã«ããã
DOM è¦ç´ ãåå¾ããå ´åã
```html
```
```javascript
var div = document.querySelector('.foo div:last-child');
```
ã¨ããããã«ãCSS ã¯ã©ã¹ã»ã¬ã¯ã¿ `.foo` ã«
該å½ããè¦ç´ ã®åè¦ç´ ãåå«ã»ã¬ã¯ã¿ (ã¹ãã¼ã¹) ã§
åå¾ãããã®ãã¡ `div` ã¿ã°ãã CSS çä¼¼ã»ã¬ã¯ã¿
`:last-child` ã«ããããããã®ãåå¾ãã
ã¨ããæä½ã«ãªãã¾ãã
å³ã«ããã¨ããã®ããã«ãªãã¾ãã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/css-selector-example.png)
CSS ã»ã¬ã¯ã¿ã«ã¤ãã¦ã¯ã[MDN ã®CSS ãªãã¡ã¬ã³ã¹](https://developer.mozilla.org/ja/docs/Web/CSS/Reference#Selectors) ã
åèã«ãªãã¾ãã
仿§ãè¦ãªãã¨ææ
¢ãªãã¬ï¼ã¨ããç«æ´¾ãªæ¹ã¯ã
[ã»ã¬ã¯ã¿ Level 3 仿§](http://standards.mitsue.co.jp/resources/w3c/TR/css3-selectors/) ãè¦ãã¨ããã§ãããã
#### å®ç¿
ä¸ã®ãã¹ãã green ã«ãªãããã«ã
`public/stage1/tests.js` ã
ä¿®æ£ãã¦ãã ããã
[http://localhost:8000/stage1/](http://localhost:8000/stage1/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-1
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
### ã¹ãã¼ã¸2
DOM è¦ç´ ã®å±æ§ã»ããã¹ãã夿´ãã
ãã¬ã¼ãã³ã°
ãã®ã¹ãã¼ã¸ã§ã¯ãã¹ã¿ã¤ã«ã®å¤æ´ã
表示æååã夿´ããããæ¹ãå¦ã³ã¾ãã
#### DOM è¦ç´ ã®å±æ§ã»ããã¹ã
DOM è¦ç´ ã«ã¯ã
- å
ã»ã© DOM API ã«æ¸¡ãã ID 屿§
- CSS ã¯ã©ã¹å±æ§ãªã©ã®ç®å°ã¨ãªã屿§
- è¦ãç®ãæä½ããã¹ã¿ã¤ã«å±æ§
ãªã©ãä»å±ãã¦ãã¾ãã
ï¼DOM ã®å±æ§ã®ä¸è¦§ã¯ [MDN DOM ãªãã¡ã¬ã³ã¹](https://developer.mozilla.org/ja/docs/DOM/DOM_Reference) ã
åç
§ãã¦ãã ããï¼
ãã®ãã¡ãã¹ã¿ã¤ã«å±æ§ãç·¨éããã¨ãDOM è¦ç´ ã®
è¦ãç®ãå¤åããããã¨ãã§ãã¾ãã
ãã¨ãã°ãGithub ã®ãããã® octocat ã®
style.color 屿§ã夿´ãã¦ã¿ã¾ããã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/octocats.png)
ãã®ã¹ã¿ã¤ã«å±æ§ã¯ CSS ã®ä»æ§ã¨å¯¾å¿ããããã«
å®ãããã¦ãã¾ãã
ãã ãã¢ãã¡ã¼ã·ã§ã³ãå«ããè¦ãç®ã®å¤æ´ã¯
CSS ã¯ã©ã¹åã®è¿½å /ç·¨é/åé¤ã«ãã£ã¦ãããªã
ãã¨ãæ¨å¥¨ããã¦ãã¦ãã¾ãã
ï¼[ã¬ã³ããªã³ã°ã¨ã³ã¸ã³ã«ããæé©åãå¹ãã®ã§ãï¼](https://developer.mozilla.org/ja/docs/Web/Guide/CSS/Using_CSS_animations)ï¼
JavaScript ã¯è¦ãç®ã®å¤æ´ã®ãã£ããã
ä¸ããã ãã«ã¨ã©ããã®ãã䏿ãª
HTML/JavaScript/CSS 忥ã®åºæ¬ã§ãã
æ®å¿µãªãç¥ããã§ããã
ä»åã®ãã¬ã¼ãã³ã°ã¯ CSS ã
æ¸ããããã«ãªããã¨ãç®çã§ã¯ãªãã®ã§ã
ã¬ã¬ã·ã¼ãª element.style ãç·¨éããããæ¹ã
å¦ã³ã¾ãã
ã¬ã¬ã·ã¼â¦ 😱
ã¾ããè©ãè½ã¨ããªãã§ãã ããã
ã¬ã¬ã·ã¼ã¨ã¯ãããã¬ã¬ã·ã¼ãã©ã¦ã¶ã¼ã
ç¸æã«ããã©ã¤ãã©ãªãèªã¿æ¸ãããã¨ãã«ã¯ã
ã©ããã¦ãå¿
è¦ã«ãªãã¾ãã
ã¡ãªã¿ã«ããã¬ã¬ã·ã¼ï¼å¸°ããã¦ããã ãã¾ããã¯
ããã³ãã¨ã³ãã¨ã³ã¸ãã¢ã¨ãã¦å¤§åãªæè¦ã§ãã®ã§
大äºã«ãã¦ãã ããã
#### å®ç¿
ä¸ã®ãã¹ãã green ã«ãªãããã«ã
`public/stage2/tests.js` ã
ä¿®æ£ãã¦ãã ããã
[http://localhost:8000/stage2/](http://localhost:8000/stage2/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-2
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
### ã¹ãã¼ã¸3
DOM ã®æ§é ã夿´ãããã¬ã¼ãã³ã°
#### DOM ã®æ§é
ãã®ã¹ãã¼ã¸ã§ã¯ãDOM ã®å±æ§ã§ã¯ãªãã
æ§é ã夿´ãããã¬ã¼ãã³ã°ããããªãã¾ãã
ãã¨ãã°ãæ¸ç±ãæ¤ç´¢ãã Web API ã使ã£ã¦ã
æ¸ç±æ¤ç´¢ãµã¼ãã¹ãéçºãããã¨ãä¾ã«ã
DOM ã®æ§é ã夿´ããå¿
è¦æ§ãèãã¦ã¿ã¾ãã
æ¸ç±æ¤ç´¢ãµã¼ãã¹ã® API ã¯ãæ¤ç´¢çµæã
ä¸ã®ããã«è¿ããã¨ãã¾ãããã
```javascript
[
{
"title": "ç´
",
"score": 5
},
{
"title": "åç°å°å¥³",
"score": 5
},
{
"title": "SHI-NO -ã·ã- é»ãéã®å°å¥³",
"score": 5
},
...
]
```
ãã®ã¨ããç»é¢ã«è¡¨ç¤ºããããã«ä¸ã®ãã㪠HTML ã
追å ãããã¨ã«ãªãã¾ãã
```html
```
ãµã¼ãã¼å´ã§ä¸ã®ãã㪠HTML ã
çæãã¦ãããã®ã§ããã
JavaScript ã«ãã DOM æ§é ã®æä½ã«
ãã£ã¦å®ç¾ããããã¨ãã§ããã°ã
è»½å¿«ãªæ¸ç±æ¤ç´¢ãµã¼ãã¹ãã¤ãããã¨ãã§ãã¾ãã
ï¼ãã¼ã¸ã®ãªãã¼ããå¿
è¦ãªãããã§ããï¼ï¼
ãã®ããã«ãWeb ãµã¼ãã¹ã®ä½¿ããããã
追æ±ããããã«ã¯ãJavaScript ã«ãã
DOM æ§é ã®æä½ãéè¦ãªã®ã§ãã
#### å®ç¿
ä¸ã®ãã¹ãã green ã«ãªãããã«ã
`public/stage3/tests.js` ã
ä¿®æ£ãã¦ãã ããã
[http://localhost:8000/stage3/](http://localhost:8000/stage3/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-3
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
### ã¹ãã¼ã¸4
DOM ã¤ãã³ããå©ç¨ãããã¬ã¼ãã³ã°
### DOM ã¤ãã³ã解説編
ã¦ã¼ã¶ã¼ããã¿ã³ãæ¼ãããã
æ¤ç´¢æ¬ã«å
¥åããã¨ããJavaScript ã¯
DOM ã¤ãã³ããããã¨ããã¨ãã§ãã¾ãã
ãã¨ãã°ãä¸ã®ãã¿ã³ã¯ click ã¤ãã³ãã
å¼ãããã¨ãã¦ãDOM æ§é ãæ¸ãæãã¾ãã
click ã¤ãã³ã以å¤ã«ã夿§ãªã¤ãã³ããããã¾ãï¼
- dblclick: è¦ç´ ä¸ã§ããã«ã¯ãªãã¯ãããã¨ã
- mousemove: è¦ç´ ä¸ã§ãã¤ã³ã¿ãç§»åãã¦ããã¨ã
- scroll: ç»é¢ãã¹ã¯ãã¼ã«ãããã¨ã
- unload: 次ã®ãã¼ã¸ã«é·ç§»ããç´å
- keydown: ãã¼ãã¼ããæ¼ãããã¨ã
- animationstart: CSS ã¢ãã¡ã¼ã·ã§ã³ãéå§ããã¨ã
- offline: ãã©ã¦ã¶ããªãã©ã¤ã³ã«ãªã£ãã¨ã
ããã«è¼ã£ã¦ããªãã¤ãã³ãã®ä¸è¦§ã¯
[MDN DOM ã¤ãã³ããªãã¡ã¬ã³ã¹](https://developer.mozilla.org/ja/docs/Web/Reference/Events) ã
åç
§ããã¨ããã§ãããã
試ãã«ããã®ãã¼ã¸ãå¶å¾¡ãã JavaScript ã
ç£è¦ãã¦ããã¤ãã³ããè¦ã¦ã¿ã¾ãããã
éçºãã¼ã«ãéããElements ã¿ãã®ä¸æ®µã«ãã
Event Listeners ã¿ããéãã¦ã¿ã¦ãã ããã
[
](http://mixi-inc.github.io/JavaScriptTraining/images/chrome-dev-tool-event-debugging.png)
ããããã®ã¤ãã³ããç»é²ããã¦ãã¾ããã
ã§ã¯ããããã®ã¤ãã³ãã®ä½¿ãæ¹ã解説ãã¦ããã¾ãã
#### DOM ã¤ãã³ãå®è£
ç·¨
DOM ã®ã¤ãã³ãã JavaScript å´ã§ç£è¦ããã«ã¯ã
ããã¤ãã®æ¹æ³ãããã¾ãã
- addEventListener ã¹ã¿ã¤ã«
```javascript
var button = document.getElementById('button');
button.addEventListener('click', function(event) {
console.log(event);
});
```
- ã¤ã³ã©ã¤ã³ã¤ãã³ããã³ãã©ã¼ã¹ã¿ã¤ã«
```html
```
- ã¤ãã³ã屿§ã¹ã¿ã¤ã«ï¼ã¬ã¬ã·ã¼ï¼
```javascript
var button = document.getElementById('button');
button.onclick = function(event) {
console.log(event);
};
```
ãã®ãã¡ã `addEventListener` ã¹ã¿ã¤ã«ã
ãè¡åã®ããæ¹æ³ã ã¨ãããã
æ¨å¥¨ããã¦ãã¾ããã
```javascript
// ãè¡åã®ãã
button.addEventListener('click', function(event) {
console.log(event);
});
```
ãããã[AngularJS](https://angularjs.org/) ã¨ããæè¿ã®
ãã¬ã¼ã ã¯ã¼ã¯ã§ã¤ãã³ã屿§ã¹ã¿ã¤ã«ã
ç©æ¥µçã«æ¡ç¨ããåããããã¾ãã
```html
```
ãã®ãããªå ´åã¯ãç¡çã« `addEventListener` ã
使ããã«ããã®ãã¬ã¼ã ã¯ã¼ã¯ã®ããããã«
å¾ãã¨ããã§ãããã
### DOM ã¤ãã³ã伿¬ã®ä»çµã¿
次ã«ãDOM ã®ã¤ãã³ã伿¬ï¼propagationï¼
ã«ã¤ãã¦è§£èª¬ãã¾ãã
ä¸ã®ãããªãã¿ã³ãä¾ã«ã伿¬ã®å¿
è¦æ§ã
èãã¦ããã¾ãããã®ãã¿ã³ã¯ãã¢ã¤ã³ã³ã¤ãã§
表示ããããã¨ãæå³ãã¦ãã¾ãã
```html
```
ãã® button è¦ç´ ã® `click` ã¤ãã³ãã
ç£è¦ãããã¨ãèãã¾ãã
button è¦ç´ ã« `addEventListener` ããã°ããããã«
è¦ãã¾ãããã¢ã¤ã³ã³ç»åãã¯ãªãã¯ãããå ´å
ã©ããªãã®ã§ããããï¼
å®ã¯ãåè¦ç´ ã§çºçãã DOM ã¤ãã³ãã¯
親è¦ç´ ãããç£è¦ãããã¨ãã§ãã¾ãã
ãã®ä»çµã¿ã DOM ã¤ãã³ãã®ä¼æ¬ã§ãã
[
](http://www.w3.org/TR/DOM-Level-3-Events/#event-flow)
`addEventListener` ã®å¼æ°ã§
1-2-4 ã 2-3-4 ã®ã©ã¡ãããé¸ã¹ã¾ãã
1. capturing ãã§ã¼ãº
ã«ã¼ãè¦ç´ ããã¤ãã³ãã®å¯¾è±¡è¦ç´ ã¾ã§éãã¦ãã
2. target ãã§ã¼ãº
ã¤ãã³ãã®å¯¾è±¡è¦ç´ ã«å°ç
3. bubbling ãã§ã¼ãº
ã¤ãã³ãã®å¯¾è±¡è¦ç´ ããã«ã¼ãè¦ç´ ã¾ã§æã£ã¦ãã
4. ãã©ã¦ã¶æ¢å®ã®å¦çããããªããããã§ã¼ãº
ãªã³ã¯ãªã©ã«ããç»é¢é·ç§»ããããªããã
å
ã»ã©ã®ãã¿ã³ã®ä¾ã§ã¯ãimg è¦ç´ ã®
click ã¤ãã³ã㯠bubbling ã«ãã£ã¦
button è¦ç´ ã¾ã§éç¥ãããã®ã§ãã
```html
```
```javascript
// button ã¸ã® addEventListener ã§ OK
button.addEventListener('click', function(event) {
// Do something
});
```
#### å®ç¿
ä¸ã®ãã¹ãã green ã«ãªãããã«ã
`public/stage4/tests.js` ã
ä¿®æ£ãã¦ãã ããã
[http://localhost:8000/stage4/](http://localhost:8000/stage4/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-4
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
### ã¹ãã¼ã¸5
éåæå¦çã®ãã¬ã¼ãã³ã°
JavaScript ã®ç¾ããæ©è½ã®ã²ã¨ã¤ã«
éåæå¦çãããã¾ãã
ä¸ã®ã³ã¼ã㯠1 ç§ã¾ã£ããã¨ã«
`console.log(1)` ãå®è¡ããã³ã¼ãã§ãã
```javascript
setTimeout(function() {
console.log(1);
}, 0);
console.log(2);
```
ãã®ã³ã¼ããå®è¡ããã¨ã`1` 㨠`2` ã®
ã©ã¡ããå
ã«è¡¨ç¤ºãããã§ããããã
çãã¯ã`2` ã§ãã`setTimeout` ã«ç»é²ããã
颿°ã¯ãã¾å®è¡éä¸ã®ãã¹ã¦ã®é¢æ°ãçµäºãã¦ãã
å¼ã³åºããã¾ãï¼[JavaScriptã®setTimeoutãçè§£ãã](http://blog.mouten.info/2014/09/20/article/)ï¼ã
ããã§ã¯ã颿°ãå®è¡ããã¿ã¤ãã³ã°ã
å¾åãã«ãããã¨ã«ãã£ã¦ãå¾
ã£ã¦ããéã«
å¥ã®ãã¨ãã§ãããã¨ãããã¨ãè¦ãã¦ãã ããã
ãã®å¾
ã¡æéã®éã«å¥ã®å¦çãå®è¡ãã
ããæ¹ãéåæå¦çã¨å¼ã³ã¾ãã
#### ãµã¼ãã¼ã¨ã®éä¿¡
éåæå¦çã®ä»£è¡¨ä¾ã¨ããã°ãµã¼ãã¼ã¨ã®éä¿¡ã§ãã
ãµã¼ãã¼ã¨ã®éä¿¡ã¯ãããã¯ã¼ã¯ãééããããã
ããªãã®æéããããã¾ããããã§ãã¬ã¹ãã³ã¹ã
è¿ã£ã¦ããã¾ã§ã®éã«ãå¥ã®å¦çããããªããã¨ã«
ãã£ã¦ãæéãæå¹æ´»ç¨ãããã¨ãéè¦ã«ãªãã¾ãã
JavaScript ã«ã¯ãµã¼ãã¼ã¨éåæã«éä¿¡ããããã®
API ãç¨æããã¦ãã¾ãã
- [Fetch API](http://www.hcn.zaq.ne.jp/___/WEB/Fetch-ja.html)
ç¾å¨çå®ä¸ã®æ°ããæ¨æºä»æ§
- [XMLHttpRequest](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest)
jQuery.ajax ã®ãããªã·ã§ã¼ããã³ãã使ããã
ãã¨ãå¤ããå®éæã§æ¸ããã¨ã¯ã»ã¨ãã©ãªã
ä»åã¯ãJavaScript ã®å°æ¥ãè¦æ®ãã¦ã
Fetch API ã«ãããµã¼ãã¼ã¨ã®éä¿¡ã
ãã¬ã¼ãã³ã°ãã¾ãã
#### Fetch API
Fetch API ã¯ä¸ã®ããã«æ¸ãã¾ãã
ãã®ã³ã¼ãã¯ã`/users.json` ã
åå¾ãã¾ãã
```javascript
fetch('/users.json')
.then(function(response) {
return response.json()
})
.then(function(json) {
console.log('parsed json', json)
})
.catch(function(error) {
console.error('parsing failed', error)
});
```
`.then`ã`.catch` ã¨ãã䏿è°ãªã¡ã½ããã§
ã¤ãªãã£ã¦ãã¾ãã
#### Promise ã使ã£ãéåæå¦ç
ããã»ã©ã® `.then`ã`.catch` ã¯ãéåæå¦çã®
çµæãã弿°ã«æ¸¡ãã颿°ã§åãåãããã«
ç¨æããã¦ãã¾ãã
ãã¨ãã°ã`.then` ã使ãã¨ãæ£å¸¸ã«ã¬ã¹ãã³ã¹ã
åãåããå ´åã«é¢æ°ãå®è¡ã§ãã¾ãã
```javascript
fetch('/users.json')
.then(function(response) {
// /users.json ãæ£å¸¸ã«åå¾ã§ããã¨ãã«ã
// response ããã°ã«åºåãã
console.log(response);
});
```
ã¨ã©ã¼ããã£ãå ´åã¯ããã°åºåã¯å®è¡ããã¾ããã
ã¾ãã`.catch` ã使ãã¨ãã¨ã©ã¼ãçºçããå ´åã«
颿°ãå®è¡ã§ãã¾ãã
```javascript
fetch('/users.json')
.catch(function(errror) {
// /users.json ã®å徿ã«ã¨ã©ã¼ãã§ãã¨ãã«ã
// error ããã°ã«åºåãã
console.error(error);
});
```
ãã¡ãã¯ãæ£å¸¸ã«ã¬ã¹ãã³ã¹ãåãåããå ´åã¯ã
ãã°åºåã¯å®è¡ããã¾ããã
ãªããå
ã»ã©ã®ä¾ã®ããã« `.then` 㨠`.catch` ã
åæã«ã¤ãããã¨ãã§ãã¾ãã
ãµã¼ãã¼ã¨éä¿¡ããã ããªã®ã«ã
ãªããè¤éããããããªâ¦ï¼
å®ã¯ãã® Promise ã¨ããè¤éãªä»çµã¿ã使ãçç±ã¯ã
- 並è¡éåæå¦ç
- ç´åéåæå¦ç
ãæ¸ãããããããã¨ãããã¨ãªã®ã§ãã
#### Promise ã«ãã並è¡éåæå¦ç
`Promise.all` ã使ãã¾ãã
```javascript
// 2ã¤ã® Web API ããã¬ã¹ãã³ã¹ã欲ããï¼
Promise.all([
fetch('/api/foo'),
fetch('/api/bar')
])
.then(function(responses) {
var responseFoo = responses[0];
var responseBar = responses[1];
doSomething(responseFoo, responseBar);
});
```
#### Promise ã«ããç´åéåæå¦ç
`.then` ã§æ¬¡ã
ã«å¦çãé£çµã§ãã¾ãã
```javascript
// Web API ã®çµæãå©ç¨ãã¦å¥ã® API ãå®è¡ãããï¼
fetch('/api/foo')
.then(doSomething)
.then(function() { return fetch('/api/bar'); })
.then(doSomething)
.then(function() { return fetch('/api/buz'); })
.then(doSomething);
```
#### å®ç¿
ä¸ã®ãã¹ãã green ã«ãªãããã«ã
`public/stage5/tests.js` ã
ä¿®æ£ãã¦ãã ããã
[http://localhost:8000/stage5/](http://localhost:8000/stage5/)
#### åèã«ãªãè³æ
- [Promise ã«é¢ããåèæ
å ±](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)
- [Promise åèæ
å ±ï¼ééç´ï¼](http://azu.github.io/promises-book/)
- [Fetch API ã«é¢ããåèæ
å ±](https://github.com/github/fetch)
- [Github API ã«é¢ããåèæ
å ±](https://developer.github.com/v3/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-5
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
### ã¹ãã¼ã¸6
ã¢ã¸ã¥ã¼ã«ãå®è£
ãããã¬ã¼ãã³ã°
JavaScript ã¯è¨èªæ©è½ã¨ãã¦ã¢ã¸ã¥ã¼ã«ã®
ä»çµã¿ããã£ã¦ãã¾ããã
è¨èªæ©è½ã¨ãã¦ã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ãå©ç¨ããã«ã¯
[ECMAScript 6](https://developer.mozilla.org/ja/docs/Web/JavaScript/ECMAScript_6_support_in_Mozilla) ãå¾
ããªããã°ãªãã¾ããã
ã¨ã¯ãã£ã¦ããã¿ããªã¢ã¸ã¥ã¼ã«ã使ãããã£ãã®ã§ã
ãã¾ãã¾ãªã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã¨ããã«ä»éãã
ã¨ã³ã·ã¹ãã ãéçºããã¦ãã¾ããã
- bower
- component
- jam
- volo
- npm with browserify
- spm
- jspm
- duo
(source: [wilmoore/frontend-packagers](https://github.com/wilmoore/frontend-packagers))
ãâ¦ãã£ã¡ãå¤ãâ¦😵
ä»åã¯ãå©ç¨æ¹æ³ãã·ã³ãã«ãªã[bower](http://bower.io)ãã使ãã¾ãã
#### bower
bower ã¯ãJavaScriptãHTMLãCSSãªã©ã
å
±æãã¦ä½¿ããããã«ããããã³ãã¨ã³ãã®
ã¨ã³ã·ã¹ãã ã§ãã
ä»ã®äººãä½ã£ãã¢ã¸ã¥ã¼ã«ãå©ç¨ãããã¨ãã
èªåãä½ã£ãã¢ã¸ã¥ã¼ã«ãå
¬éãããã¨ã
ã§ãã¾ãã
ãã ãbower ã¯ã¢ã¸ã¥ã¼ã«èªã¿è¾¼ã¿ã®
ä»çµã¿ãæä¾ãã¦ãã¾ããã
ãã®é¨å㯠RequireJS ãªã©ãå¥ã®
ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã«é ¼ããã¨ã«ãªãã¾ãã
ã©ã®ã¢ã¸ã¥ã¼ã«ã·ã¹ãã ã«å¯¾å¿ãããã¨ãã鏿ã¯ã
bower ã«ãã£ã¦èªã¿è¾¼ã¾ããããã±ã¼ã¸å´ã«
è£éï¼è²¬åï¼ãããã¾ãã
ãã®æ¹éã[å
¬å¼ããã¥ã¡ã³ã](http://bower.io/#getting-started)ã¯ç«¯çã«
è¨ã表ãã¦ãã¾ãã
> How you use packages is up to you.
>
> ï¼ã©ã®ããã«ãã¦ããã±ã¼ã¸ã使ãã®ãã¯ããªã次第ã§ãï¼
#### å®ç¿
ã¾ããbower ãå®è¡ãããã¨ãä½é¨ãã¦ã¿ã¾ãã
bower ã®è¨å®ãã¡ã¤ã« bower.json ã対話çã«
使ãã¾ãã
cd public/stage6/sample
bower init
ãã¨ã¯èª¬æã«å¾ã£ã¦é¸æãã¦ããã¨ãbower ã®
ããã±ã¼ã¸è¨å®ãã¡ã¤ã« `bower.json` ã使ããã¾ãã
##### 1. name
ãã®ããã±ã¼ã¸ã®ååãæå®ãã¾ãã
ããã±ã¼ã¸ã¨ãã¦å
¬éããå ´åã«ã¯ãæ¢ã«åã
ããã±ã¼ã¸åãåå¨ãã¦ããªãã確ãããå¿
è¦ã
ããã¾ãã
ãã®ç ä¿®ã§ã¯ãå
¬é/éå
¬éãåããªãã®ã§ã
ã好ããªååãã¤ãã¦ãã ããã
##### 2. version
ãã®ããã±ã¼ã¸ã®ãã¼ã¸ã§ã³ãæå®ãã¾ãã
ãã¼ã¸ã§ã³ã®å½¢å¼ã¯ [Semantic Versioning](http://semver.org/lang/ja/) ã«
æºæ ãã¦ãã¾ãã
ãã®å½¢å¼ã¯ãä¸è¬çã« `X.Y.Z` ã¨è¨è¿°ããã¾ãã
- `X` 㯠major versionï¼å¾æ¹äºææ§ããªããªã夿´ï¼
- `Y` 㯠minor versionï¼åæ¹äºææ§ããªããªã夿´ï¼
- `Z` 㯠patch versionï¼ãã°ä¿®æ£ãªã©ï¼
ä»åã¯éçºçãªã®ã§ã0.0.0 ã«ãã¦ããã¾ããã
ï¼major versionã® 0 ã¯éçºçã§ãããã¨ã示ãã¾ãï¼ã
##### 3. description
ããã±ã¼ã¸ã®ç°¡åãªæ¦è¦ãè¨è¿°ãã¾ãã
æåã©ããã®èª¬æãã¿ã¦ã¿ã¾ãã
- bootstrap: The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.
- angular-latest: HTML enhanced for web apps
- less.js: Leaner CSS
##### 4. main file
ãã®ããã±ã¼ã¸ãå¤é¨ã®ããã±ã¼ã¸ã«å
¬éããã
ãã¡ã¤ã«ãæå®ãã¾ããæååã¨é
åãæå®ã§ãã¾ãã
ä»åã¯ç©ºã§åé¡ããã¾ããã
##### 5. what types of module does this package expose?
ãã®ããã±ã¼ã¸ãå¤é¨ã«ã¨ã³ããã¤ã³ããå
¬éãã
æ¹æ³ãæç¤ºãã¾ãã
- amd: [Asynchronouse Module Definition](https://github.com/amdjs/amdjs-api/wiki/AMD) ([åèè³æ](http://www.matzmtok.com/blog/?p=845))
- es6: [EcmaScript 6](http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:ecma-262_edition_6_03-17-15-releasecandidate3.pdf) ([åèè³æ](https://www.xenophy.com/javascript/8447#run-time-renaissance))
- globals: ã°ãã¼ãã«å¤æ°çµç±ã§ã¨ã³ããã¤ã³ãå
Ž
- node: [Node.js](https://nodejs.org/api/modules.html)
- yui: [YUI](http://yuilibrary.com/yui/docs/yui/create.html) (ã¡ã³ã忢ããã®ã§ããããã¾ããã)
ä»åã¯ä½ã鏿ããªãã§åé¡ããã¾ããã
##### 6. keywords
ãã®ããã±ã¼ã¸ãæ¤ç´¢ã§ããããããããã®
ãã¼ã¯ã¼ããæå®ãã¾ãã
##### 7. authors
ãã®ããã±ã¼ã¸ã®ä½è
ãæå®ãã¾ãã
##### 8. license
好ããªã©ã¤ã»ã³ã¹ãé¸ã¶ã¨ããã§ãã
ããã©ã«ã㯠[MIT ã©ã¤ã»ã³ã¹](http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license)ã§ãã
##### 9. homepage
ãã®ããã±ã¼ã¸ã®æ
å ±ãè¦ããã URL ãè¨è¿°ãã¾ãã
##### 10. set currenttly installed components as dependencies?
æ¢ã« `bower_components` ã«å«ã¾ãã¦ãã
ã³ã³ãã¼ãã³ããããã±ã¼ã¸è¨å®ã«
å«ã¾ããããã«ãããã©ãããæå®ãã¾ãã
n ã§æ§ãã¾ããã
##### 11. add commonly ignored files to ignore list?
`.gitignore` ãªã©ã®ãã¡ã¤ã«ããã
ããã±ã¼ã¸ã«å«ããªããã¡ã¤ã«ã®æå®ã
èªã¿è¾¼ããã©ããæå®ãã¾ãã
y ã§èªã¿è¾¼ã¾ãã¾ãã
##### 12. would you like to mark this package as private which prevents it from being accidentaly published to the registry?
bower ã®ã¬ã¸ã¹ããªã¸ç»é²ã§ããªãããã«ããã
ã©ããæå®ãã¾ãã
y ã§ã¬ã¸ã¹ããªã¸ã®å
¬éãã§ããªãããã«è¨å®ãã¾ãã
##### 13. Looks good?
ãã®è¨å®ã§åé¡ãªããã° y ãå
¥åãã¾ãã
##### bower install
ãããããããã±ã¼ã¸ã追å ãã¦ããã¾ãã
ããã±ã¼ã¸ã¯ [Search Bower packages](http://bower.io/search/) ã§
æ¤ç´¢ãããã¨ãã§ãã¾ãã
ãããã¯
bower search Buttons
ã§ãæ¤ç´¢ãããã¨ãã§ãã¾ãã
ã§ã¯ã試ãã« [Buttons](https://github.com/alexwolfe/Buttons) ããã±ã¼ã¸ã
追å ãã¦ã¿ã¾ãããã
ä¸ã®ã³ãã³ãã«ãã£ã¦ãButtons ããã±ã¼ã¸ãã
`bower_components` 以ä¸ã«é
ç½®ããã¾ãã
bower install --save Buttons
`--save` ã¯ããã±ã¼ã¸è¨å®ã«ä¾åãã¡ã¤ã«ã
追è¨ãã广ãããã¾ãï¼`bower.json` ã®
å
容ãå¤åãã¦ããã®ã§ãè¦ã¦ã¿ã¦ãã ããï¼ã
ããã§è¨å®ã«è¿½è¨ãããããã±ã¼ã¸ã¯ã
次åãã `bower install` ã§ã¾ã¨ãã¦
åå¾ãããã¨ãã§ããããã«ãªãã¾ãã
ä»åã¯ãç°¡åã®ããã« script ã¿ã°ã§ç´æ¥
`bower_components` 以ä¸ã® JavaScript/CSS ã
èªã¿è¾¼ã¿ã¾ãã
ä»åã®å®ç¿ã¯ãã¹ãé§åå½¢å¼ã§ã¯ããã¾ããã
æºè¶³ã®ãã Web ã¢ããªã±ã¼ã·ã§ã³ãæ¸ãããã
`qualityOfYourAppliation` ã« `true` ã
代å
¥ãã¦ãã ããã
[http://localhost:8000/stage6/](http://localhost:8000/stage6/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-6
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
### ã¹ãã¼ã¸7
ããããã¤ãã£ãªã ãèªããã¬ã¼ãã³ã°
ãã®ã¹ãã¼ã¸ã§ã¯ããããã JavaScript ã®
䏿è°ãªæ¸ãæ¹ãå¦ã³ã¾ãã
ãªããä»åã¯ãã³ããããã¾ããï¼
ãã²èªåã§èª¿ã¹ã¦ãçµæã確ããã¦ã¿ã¦ãã ããï¼
ãªããèå³ã®ããæ¹ã¯ãã¹ãã¼ã¸ãéãã«
ææ¦ãã¦ã¿ã¦ãã ãããï¼
`.skip` ãåé¤ããã°ææ¦ã§ããããã«ã«
ãªãã¾ãã
#### å®ç¿
ä¸ã®ãã¹ãã green ã«ãªãããã«ã
`public/stage7/tests.js` ã
ä¿®æ£ãã¦ãã ããã
[http://localhost:8000/stage7/](http://localhost:8000/stage7/)
#### ã¯ãªã¢ã§ããã
Lint ãããã¦ã¿ã¾ãããã
npm run lint-stage-7
è¦åãããã°ãä¿®æ£ãã¦ã¿ã¦ãã ããã
ä»é²
----
### Promise ã«ã¤ãã¦
#### Promise ã«ãã並è¡éåæå¦ç
Promise ã«ãã並è¡éåæå¦çãé常ã®ããããã¨ã
Promise ãããããæ¹ã¨ã§ãã£ã¦ã¿ã¾ããã
ã³ã¼ããæ¯è¼ãã¦ã¿ã¦ãã ããã
```javascript
// 2ã¤ã® Web API ããã¬ã¹ãã³ã¹ã欲ããï¼
var done = { foo: false, bar: false };
var responses = { foo: null, bar: false };
fetch('/api/foo').then(function(responseFoo) {
if (!done.bar) {
done.foo = true;
responses.foo = responseFoo;
return;
}
doSomething(responseFoo, responses.bar);
});
fetch('/api/bar').then(function(responseBar) {
if (!done.foo) {
done.bar = true;
responses.bar = responseFoo;
return;
}
doSomething(responses.foo, responseBar);
});
```
ã¬ã¹ãã³ã¹åå¾ã®å¾
ã¡åããå¦çãããã
ç¶æ
ãè¤æ°ãã¤åä»ãªã³ã¼ãã«ãããã£ã¦ãã¾ããã
```javascript
// 2ã¤ã® Web API ããã¬ã¹ãã³ã¹ã欲ããï¼
Promise.all([
fetch('/api/foo'),
fetch('/api/bar')
])
.then(function(responses) {
var responseFoo = responses[0];
var responseBar = responses[1];
doSomething(responseFoo, responseBar);
});
```
`Promise.all` ã使ãã¨ãå¾
ã¡åããå¦çã
ãªãã¹ãããªï¼
#### Promise ã«ããç´åéåæå¦ç
ç´åéåæå¦çã«ã¤ãã¦ããé常ã®ããæ¹ã¨ã
Promise ãããããæ¹ã§ãã£ã¦ã¿ã¾ããã
ã³ã¼ããæ¯è¼ãã¦ã¿ã¦ãã ããã
```javascript
// Web API ã®çµæãå©ç¨ãã¦å¥ã® API ãå®è¡ãããï¼
fetch('/api/foo').then(function(responseFoo) {
doSomething(responseFoo);
fetch('/api/bar').then(function(responseBar) {
doSomething(responseBar);
fetch('/api/buz').then(function(responseBuz) {
doSomething(responseBuz);
});
});
});
```
ã³ã¼ãããã¹ããã¦ããã®ã§ãå¾ãã®æ¹ã®
颿°ã®ã¹ã³ã¼ããæ·±ããªã£ã¦ãã¾ã£ã¦ãã¾ãã
夿°ã追跡ããã®ã«æéããããããã§ãã
ãã¹ãã®å¤ã«åºãã ããªãã°ãçµäºã³ã¼ã«ããã¯ã
å¼ã³åºã[ç¶ç¶æ¸¡ãã¹ã¿ã¤ã«](http://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E6%B8%A1%E3%81%97%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB) ã§
æ¸ããã¨ãã§ãã¾ãã
```javascript
// Web API ã®çµæãå©ç¨ãã¦å¥ã® API ãå®è¡ãããï¼
fetch('/api/foo').then(callbackFoo);
function callbackFoo(responseFoo) {
doSomething(responseFoo);
fetchBar(callbackBar);
}
function fetchBar(callback) {
fetch('/api/bar').then(callback);
}
function callbackBar(responseBar) {
doSomething(responseBar);
fetchBuz(callbackBuz);
}
function fetchBuz(callback) {
fetch('/api/buz').then(callback);
}
function callbackBuz(responseBuz) {
doSomething(responseBuz);
}
```
æµãã追ãã¥ããï¼
ã¯ãã¼ã¸ã£ã¼ + ç¶ç¶æ¸¡ãã¹ã¿ã¤ã«ã使ãã¨â¦
```javascript
// Web API ã®çµæãå©ç¨ãã¦å¥ã® API ãå®è¡ãããï¼
fetch('/api/foo').then(fetchBar(fetchBuz(doSomething)));
function fetchBar(callback) {
return function(responseFoo) {
doSomething(responseFoo);
fetch('/api/bar').then(callback);
};
}
function fetchBuz(callback) {
return function(responseBar) {
doSomething(responseBar);
fetch('/api/buz').then(callback);
};
}
```
ããã¯ããã§ç¾ããâ¦😌
ï¼JS ã«æ
£ããã¾ã§ã¯ã¡ãã£ã¨èªã¿ã¥ããã¨æãã¾ãï¼
Promise ãããããæ¹ãã¨ã㨠`.then` ã§
次ã
ã«å¦çãé£çµã§ãã¾ãã
```javascript
// Web API ã®çµæãå©ç¨ãã¦å¥ã® API ãå®è¡ãããï¼
fetch('/api/foo')
.then(doSomething)
.then(function() { return fetch('/api/bar'); })
.then(doSomething)
.then(function() { return fetch('/api/buz'); })
.then(doSomething);
```