68
覚醒JavaScript ES6で作るIsomophicアプリケーション 株式会社サイバード ゲーム事業本部イケメンスタジオ 大西 啓太郎

覚醒JavaScript -ES6で作るIsomophicアプリケーション-

Embed Size (px)

Citation preview

Page 1: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

覚醒JavaScriptES6で作るIsomophicアプリケーション

株式会社サイバードゲーム事業本部イケメンスタジオ大西 啓太郎

Page 2: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

自己紹介

{ name: '大西 啓太郎',

twitter: '@keitarouhoge', job: { company: 'CYBIRD', team: 'イケメンスタジオ',

role: 'WEBエンジニア',

age: '2014年新卒入社2年目'

}, skills: ['PHP', 'Ruby', 'JavaScript', 'Node.js', 'Java']}

Page 3: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
Page 4: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
Page 5: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

今日話したいこと

Page 6: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
Page 7: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

そう、JavaScriptです

Page 8: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

今日話したいこと• ES6ってなんぞや• Isomophicってなんぞや• 実際に現場でES6を導入してみたという話

Page 9: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6ってなんぞや

Page 10: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6って何?ES6(ECMAScript6)は次のECMAScriptのスタンダードであり、2015年6月に仕様が確定し、現在色々なブラウザやNode.jsなどのJavaScript実行エンジンで実装が進んでいます。新しい構文のサポートなどでJavaScriptでのプログラミングの表現力が増します!

*ECMAScript: Ecma Internationalによって標準化されたスクリプト言語である。実装ごとの互換性が低い JavaScript 類(特に JScript)の標準を定めたものである

Page 11: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6 -> ECMAScript 2015(ES2015)ES6と今まで呼ばれていたものが改名された。今後は年単位のより細かいリリースを計画しているようです

Page 12: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ECMAScript7

Page 13: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6のFeatureを一部紹介

Page 14: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

class構文をサポートclass Animal{ constructor(name) { this.name = name; } sayName() { console.log('my name is %s', this.name); } tree() { return 'Animal'; } static classname() { return 'Animal'; }}

Page 15: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

class構文をサポート継承も簡単にできるようになりましたclass Dog extends Animal{ sayName() { console.log('wanwan. my name is %s', this.name); } tree() { return (super.tree() + ':Dog'); }}

Page 16: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Generatorをサポートfunction* anotherGenerator(i) { yield i + 1; yield i + 2; yield i + 3;}function* generator(i){ yield i; yield* anotherGenerator(i); yield i + 10;}

var gen = generator(10);console.log(gen.next().value);

Page 17: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Generatorはすごい• Generatorが関数の実行を状態を保ったまま中断できる特性を活かして非同期処理の制御を行うことができる

• 非同期処理に対して、手続き型ちっくなアプローチが可能でtry~catch構文もカジュアルに利用することができる

• 『co』というライブラリと一緒に使うことですごい使いやすくなる

Page 18: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

1秒後に足し算結果を返す非同期関数var calc = function(a, b){ return new Promise(function(resolve) { setTimeout(function() { resolve(a + b); }, 1000); });}

Page 19: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

var calc = function(a, b){ return new Promise(function(resolve) { setTimeout(function() { resolve(a + b); }, 1000); });}

calc(10, 20).then(function(result){ console.log(result);});

Page 20: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Call Back Hellcalc(1, 2).then(function(result){ console.log(result); calc(10, 20).then(function(result){ console.log(result); calc(100, 200).then(function(result){ console.log(result); }); });});

Page 21: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

then Chaincalc(1, 2) .then(function(result){ console.log(result); return calc(10, 20); }) .then(function(result){ console.log(result); return calc(100, 200); }) .then(function(result){ console.log(result); });

Page 22: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

非同期処理の並列実行Promise.all([ calc(1, 2), calc(10, 20), calc(100, 200), ]) .then(function(results){ console.log(results); });

Page 23: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Generatorを知らないJavaScriptはこれが限界

Page 24: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

yieldによる関数実行の中断var calc = function(a, b){ return new Promise(function(resolve) { setTimeout(function() { resolve(a + b); }, 1000); });}

var co = require('co');co(function *(){ var a = yield calc(1, 2); console.log(a);});

Page 25: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Call Back Hell, then Chainいらないvar co = require('co');

co(function *(){ var a = yield calc(1, 2); console.log(a);

var b = yield calc(10, 20); console.log(b);

var c = yield calc(100, 200); console.log(c);});

Page 26: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

並列実行も簡単var co = require('co');

co(function *(){ var results = yield [ calc(1, 2), calc(10, 20), calc(100, 200), ]; console.log(results);});

Page 27: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Generator + co 最高!

Page 28: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

大本命『Async, Await』ES7でやってくるvar run = async function(){ var result = await calc(1, 2); console.log(result); var result = await calc(10, 20); console.log(result); var result = await calc(100, 200); console.log(result);};run();

Page 29: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

JavaScriptの非同期処理制御の歴史1. Ajaxの登場による非同期処理に対する需要が高ぶる2. Callback Hell(コールバック地獄)(Ajax浸透)

3. ThenableインタフェースによるCallback Hellからの脱出・高度な非同期処理制御の提供開始(Promise)

4. Generator構文, coによる手続き型ちっくな効果可読性を重視した制御が可能に(ES6)

5. 言語レベルでの非同期処理制御のサポート(ES7)

Page 30: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Template Strings

`string text`

`string text line 1 string text line 2`

`string text ${expression} string text`

Page 31: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Default Paramaters

function add(x=10, y= 20){ return x+y;}

console.log('1+2 = %s', add(1,2));console.log('1 = %s', add(1));console.log(' = %s', add());

Page 32: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6によってJavaScriptがもっと楽しく書けるようになった!!

Page 33: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ブラウザでのES6対応状況https://kangax.github.io/compat-table/es6/

Page 34: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

デスクトップブラウザ

Edge > Firefox > Chrome >>>> IE, Safari

Page 35: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

サーバーランタイム・モバイルブラウザ

Node.js v4から一気対応が増えた!モバイルはまだまだ時間がかかりそう

Page 36: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

こう思いませんか??

• なんだ数年後の話か• こんな未来の話はいつの間にか消え去るのがいつもの流れ• やっぱTypeScriptが最高なんや!

Page 37: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Babel

Page 38: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
Page 39: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

つまりどういうことだってばよES6で書かれたJavaScriptのコードをES5(従来のブラウザで実行できる形に変換します)『トランスコンパイラ』と呼ばれています。$ babel xxx.js > yyy.js$ babel-node xxx.js

Page 40: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

これがclass Animal{ constructor(name) { this.name = name; } sayName() { console.log('my name is %s', this.name); }}

Page 41: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

'use strict';

var _createClass = .......

function _classCallCheck(instance, Constructor) { ..... }

var Animal = (function () { function Animal(name) { _classCallCheck(this, Animal);

this.name = name; }

_createClass(Animal, [{ key: 'sayName', value: function sayName() { console.log('my name is %s', this.name); } }]);

return Animal;})();

※一部削っています。

Page 42: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

今日からES6でJavaScriptは書ける!!

Page 43: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

自動化!自動化!

Page 44: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

JavaScriptビルドツール• Grunt• Gulp• Flyこれらのツールを使うことでBabelでのトランスコンパイル作業を自動化することも簡単にできるようになります。※FlyはES6/ES7で作られたビルドツールです。

Page 45: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Isomophicってなんぞや

Page 46: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Isomophicのコンセプトアプリケーションの状態とコードは、ブラウザとサーバ間で共有されています。サーバがリクエストを受け取ると、新しいflux-reactアプリケーショ ンインスタンスを生成してレンダリングをします。すると、ストレージ(アプリケーション)の状態がそのレンダリング済みのHTMLアウトプットに渡されま す:サーバはこのレンダリング済みのファイルで応答します。 ブラウザは(BrowserifyやWebpackで作られた)同じコードをロードし.....

※http://postd.cc/from-angularjs-to-react-the-isomorphic-way/

Page 47: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

なんか難しい

Page 48: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

私の中のIsomophicのキーワード• Node.js/JavaScriptで書かれたコードである• サーバーサイド・ブラウザ(クライアント)環境にてソースコード・ライブラリを使い回すことができる

• サーバーサイド・ブラウザどっちでも動くプログラムである

Page 49: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Isomophicであることによるメリット

Page 50: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Validation処理を1つのソースコードで定義することでサーバー・クライアント両方でValidationできるゲームであればチート対策などに効果的!しかも低コスト!

Page 51: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

サーバー・クライアントのどっちかソースコードを修正するだけでもう片方の振る舞いも変化させることができる。ソースコードの修正が少なくて低コスト!

Page 52: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

全部JavaScriptで書くことができる学習コストが低い!サーバー担当・クライアント担当みたいな変な役割を無くすことでコミュニケーションコスト削減!

Page 53: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ブラウザ用JavaScriptの出力などは自動化!

• RequireJS

• Browserify

• Webpack

最近はWebpackが流行っている模様

Page 54: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

こんなはなしがやってきた• 某シリーズもののゲームの集計システムを作ってくれ。• バッチ処理で夜間に集計を集計をブンブン回して、集計結果をAPIで取得できて、ブラウザで閲覧できるやつね。

• 将来的に色々なタイトルで利用するから汎用性高くてイケてるやつね。

Page 55: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

こんな構成に• バッチ処理: Node.js

• API: Node.js(Express)

• ブラウザ: Backbone.js / Marionette.js

Page 56: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

お気づきでしょうか・・・

Page 57: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

そう、すべてJavaScriptで作られていることに• Node.js(v4.0.0)

• ECMAScript6

• トランスコンパイラ: Babel

Page 58: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

他にも• ソースコードのリポジトリも1つで全部やっています。• OSSのライブラリに頼って開発していますが、全部同じライブラリを使っています。

• テスティングフレームワークも『Mocha』『power-assert』『Nightmare2』などを使って同じしくみでテストができています。

Page 59: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ビルドフロー

Page 60: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
Page 61: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

export function* build () { yield this.start(['to5', 'browserify'])}export function* to5 () { yield this.clear(paths.dist.lib) yield this .source(paths.src) .babel({ stage: 0, sourceMaps: true }) .target(paths.dist.lib)}export function* browserify () { yield this.clear(paths.dist.browser) yield this .source(paths.dist.lib + '/www/public/app.js') .browse() .concat('app.js') .target(paths.dist.browser)}

Page 62: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6/Isomiphic使ってよかったこと• Class構文により、やっとJavaScriptが普通の言語になったので、他の言語の人もJavaScriptにとっつきやすくなった

• Generatorの導入によって非同期処理の制御が簡単にできるようになった

• 書くソースコードの量が圧倒的に少なくて楽できている• JavaScript芸人というポジションを確立できたこと

Page 63: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ES6/Node.jsを現場に浸透させるための苦労• 社内・社外のパートナー含め、周りはPHPの人が多い• JavaScriptはある程度触れる人は多いが、新しく覚えてもらうことも多い

Page 64: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

Lesson教材が実は充実している• javascripting(JavaScriptお勉強用ライブラリ)

• learnyounode(Node.jsお勉強用ライブラリ)

• tower-of-babel(ES6お勉強用ライブラリ)

• how-to-npm(パッケージ管理に関してのお勉強ライブラリ)

Page 65: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-
Page 66: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

辛い話• 他の言語も書いてみたい(Golang, Elixir, Rubyとかね)

• Class構文でPropertyを扱いづらいclass Sample{ name: 'sample';

sayName() { console.log('my name is %s', this.name); }}

// my name is undefinednew Sample().sayName();

Page 67: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

※半年後にはどうなっているかわかりませんが常に最新のJavaScriptを追い求めていきます!みんなでJavaScriptの波に乗りましょう!

Page 68: 覚醒JavaScript  -ES6で作るIsomophicアプリケーション-

ご清聴ありがとうございました。