SlideShare a Scribd company logo
イベント駆動AngularJS
Angular勉強会#3 GDGKobe - Apr 29, 2015
Who
• 奥野 賢太郎 @armorik83
• 京都市
•  
AngularJS勉強会#1に参加して5ヶ月
AngularJSのお仕事いただきました
Angularと私
• 2013年秋、AngularJS 1.2とTypeScriptに出会う
• 2014年6月、この勉強会の第一回に参加
• 2014年後半、『AngularJSアンチパターン集』や

『モダンAngularJS』といった記事が割と受け入れられる
• AngularJSが嫌われてる? といった風潮とReact.jsの流行に過敏になる
• 突然のAngularJSのお仕事
• 2015年3月、東京でのng-japanに出席 ←いまこの辺
なので、先日やった

AngularJS 1.3の話します
まずはDemo
http://likr.github.io/interactive-sem/
SPA開発と学習コスト
• 1画面完結

DBのAPI、ページのルーティングは無い
• 実質納期は1ヶ月程度
• グラフ描画ライブラリはD3.jsベース(ここは作ってない)

UIのデザイン・実装を担当

ほぼスクラッチ
• 自分にはAngularJSの知識が占めていたので、これを採用
AngularJSの良さって
• もともと『HTMLを拡張した構文』を採用していた点が

好きだった
• 自分がWebデザイナ由来で".html"が並んでる安心感

みたいなところはある
• JSXはどうにも抵抗が大きかった

(React.createElementがあるよ! ってのもちょっと違ってて)
Reactのヘビーユーザではないので、フェアな比較ではない
でも遅いんでしょ?
• AngularJS 1.2はたしかに遅かった
• 1.3でマシになった
• 一覧表示などで、むやみにDOMを更新しなければ十分
• ジャブジャブ使うときは気にする必要がでてくる

とにかく速い方がいい! 魂が震えない! という人には向いてない
• 最適化についてはdigest loopでググれば知見が山ほど
初心に返った
• 雑にHTMLに{{}}を並べて書いて
• Controllerをパパっと書いたらもうバインドできてる!

嬉しさ!!
• この「すぐできる感」がAngularJS
でも雑にやると破綻するのが
AngularJS
APIが多すぎ?
• 散々言われてるけど、APIが散らばってるのは事実
• ひとつのことを実現するのに3, 4通りあるのは当たり前
• 内部を成り立たせるコアAPIはpublicになっている
• 逆にそこを直接叩けるのは強み

$compile, $templateCache, $injectorなど
Angular 2.0
今後1.x系どうやって使おう
• 2014年10月に墓標が乱立
• あれだけ並べられたら、さすがにどうしよう
• とりあえずRIPされてるものは使わない
モダンAngularJSの実践
• 2.0を見据えてどうするかは

『モダンAngularJS』のスライドで

けっこう話した
• ng-controller, service不使用
• jQuery不使用
• いい機会なので本当にうまくいくか実践する
http://www.slideshare.net/armorik83/angularjs-141206
この時にあった懸念
• $scopeは無くなる
• 値の共有を、意識せずに親子取り放題にすると死
• 何も考えずに$broadcast, $onで飛び交わせても死
なにか良いイベントの扱い方は…
そうか…! Fluxだ!
Flux
• Facebook社が提唱するアーキテクチャ

こういう名前のライブラリ・フレームワークがあるわけではない
• React界隈では、もはや常識
• うちはAngularJSだから…と気にしないのは勿体無い

設計手法として触れておくべき
Fluxに関する資料
• 昨年末くらいから、じわじわ増えてはいた

最近どっと増えた
• おすすめしたいのは以下
• 今話題のReact.jsはどのようなWebアプリケーションに適しているか?
@hokaccha
• 社内勉強会でReactとFluxについて喋った

inside.pixiv.net
• 10分で実装するFlux

@azu_re
いつもの図
AngularJSでやるなら
引用 http://azu.github.io/slide/react-meetup/flux.html
AngularJSでやるなら
引用 http://azu.github.io/slide/react-meetup/flux.html
DIRECTIVES
具体的な話
• ng-route使ってる

設計段階で必要なかったけど、拡張余地のため
• ng-routeではControllerは指定しない
• 単一のDIrectiveのタグのみ置く
function RouteConfig(
$routeProvider: ng.route.IRouteProvider
) {
$routeProvider
.when('/', {template: '<tag></tag>'})
.otherwise({redirectTo: '/'});
}
Root Directive
• View, Dispatcher, StoreでいうViewの部分
• グラフ描画ライブラリの都合で、Storeはどうしても2つにする

必要があった
• 利用者の行動 →

Dispatcher → Store → View → 即Action

Dispatcher → グラフ描画ライブラリ → View
• Q. 2周って無駄じゃね?
• A. そうやってViewが複数と相互にやりとりしていたのが

従来のMVW、流れは常に1方向に限定する

2周するEmitの速度は全く気にするレベルではない
複数のStore
• 複数のStoreってやってもいいの? という不安があった

最近の資料だと、この辺もうちょっと分かりやすい
• SOでFacebookの中の人が複数Storeの可能性を回答
していたので、大丈夫そう
• 今回は、全ての操作がグラフ再描画と結びつくので、

グラフ描画に使う値の格納Storeと、描画ラッパーStore
の二段構えで回る
http://stackoverflow.com/questions/26597311/flux-multiple-store-instances
Flux模倣の実装
• 全てTypeScriptで記述
• CommonJSのrequire()で記述、Browserifyでビルド
• Emitterにはビルトインの$broadcast, $on

$emitは上下関係での挙動の違いが複雑になるので不採用
• Dispatcherのイベント名は全て定数管理"constant.ts"を
作ってまとめておく
• APIとしては、StoreからDispatcherはaddHandlers()

StoreからDirectiveに対してはaddListener()を備える
つまりはこう
引用 http://azu.github.io/slide/react-meetup/flux.html
DIRECTIVES
Storeが

Dispatcher#addHandlers()

を呼ぶ
Directiveが

Store#addListener()

を呼ぶ
Directiveが

$broadcast()を呼んで

Diapatcherに$on()を実装
子Directive
• 子DirectiveはStoreのシングルトンを持ってはいけない
• 持っていいのはRootのみ
• 子Directiveが出来るのはActionの発行→Dispatcherへ
• 値はすべて共有せず、isolated scopeにする
• すべてに'&'を指定しreadonlyにする

[ここらでDirective Scope] [検索]
出てきそうな疑問
• Fluxは仮想DOMを扱うReactだからこそ効いてくる

アーキテクチャなのでは?
• AngularJSでFluxなんてやったら遅いのでは?
自分の解釈
• Fluxをやってもやらなくても、$digestが回り続ける
AngularJSでは、この走査を減らす工夫の方が重要
• Fluxを採用しなくてもガンガン回ってドンドン遅くなる

設計は十分に起こりうる
• それより、$scopeのグローバル共有問題や

イベント煩雑問題をどう解決するかが課題だった
結果
• 流れが一方向なので

MVWより「どこに何を実装すればよいか」が明確
• アプリ内各所にイベントが飛び散らない
• いい感じでした
全部解説するのは大変
なんとオープンソースなので、気になった方は読んでみて
https://github.com/likr/interactive-sem
まだ時間ある?
もうちょっと喋ります
今から書くAngular 2.0
Angular勉強会#3 GDGKobe - Apr 29, 2015
Who
• 奥野 賢太郎 @armorik83
• 京都市
•  
Angular 2.0
• Angularの新バージョン
• 2014年10月 ng-europeにて、方向性が発表

2015年3月 ng-confにて、具体的な発表
• AngularJS 2.0とは呼ばず

Angular 2.0 for JavaScriptと呼んでいる
進捗どうですか
• https://github.com/angular/angular にて開発中
• 現在2.0.0-alpha.21

これをDeveloper Previewと位置付けている
• さっきハンズオンでやったComponent Routerは

Angular 2.0ではビルトインされる予定

どっちのRepoで続けるか揉めてた
• AngularJS 1.x系は1.4がRC1で控え、1.5の開発も予告
@Decorators
• Angularチーム開発の拡張構文AtScriptで採用
• 2015年3月、AngularチームとMicrosoftが協力し
AngularはTypeScriptで実装されることが決定
• DecoratorsはTypeScript 1.5.0-alphaに

急に追加された構文
@Decorators
• ECMAScriptの仕様策定としてはまだまだ

ミーティングでの議題にのぼってる段階

(具体的にはES7 Stage 1 Proposal)
• Babelでは--optional es7.decoratorsで利用可能
• TypeScript 1.5.0-alphaでは、もう利用可能

TypeScript 1.5.0-betaというのも控えてた
• Angular側が想定してる構文と仕様にすれ違いがあって

正直まだグラグラしてる

4月中だけでいくつバグが直ったか…
Qiitaで割とガチにまとめました
[Qiita Decorators] [検索]
http://qiita.com/armorik83/items/e3a0ce67f569ddc4b432
Angular 2.0とDecorators
@Component({
selector: 'greet',
injectables: [Greeter]
})
@View({
template: `{{greeter.greet('world')}}!`,
directives: Child
})
class HelloWorld {
greeter: Greeter;
!
constructor(greeter: Greeter) {
this.greeter = greeter;
}
}
API今覚えておくならこの辺
• @Component - いわゆる1.xでのDirectiveに相当
• @View - TemplateHTMLなどを記述、1.xのDirectiveの設定が

@Componentと@Viewに分かれたイメージ
• @Decorator - restrict: 'A'(HTML属性として使う)のDirectiveに相当
• @Viewport - ng-ifやng-repeatなどの制御Directiveが実装しやすい

らしい、まだあまり触れてない
• @Parent, @Ancestor - 親Directiveを使う、1.xでのrequireに相当
早速やりたい方は 5min Quickstartから
https://angular.io/
とはいえ、まだ急いでやらなくていいです
Decorators構文の仕様が安定していない、挙動もちょくちょくバギー
でも今後移行とか考えると

つらくない?
イベント駆動AngularJS / 今から書くAngular 2.0
Cresc Toccata
• クレス・トッカータ
• npm install --save toccata
• 今日もう少し安定して使えるところまで進めたかった

Angular 2.0が想像以上にバギーだったので難航
Cresc Toccata
• Decorators構文を採用したTypeScriptユーザ前提の

ライブラリ
• AngularJS 1.3.14以上に対応できるよう開発中
• Angular 2.0とAPIに互換性を持たせて提供
• AngularJS 1.x系でもAngular 2.0の「書き方」で開発ができる
• Toccata<伊>とは「急な変化と流れを持つ即興的な音楽」

を意味する音楽用語で、即興、試し弾きという意味がある
Cresc Toccata
import {* as angular} from 'angular';
import {* as toccata_} from 'toccata';
!
const toccata: Toccata = toccata_(angular);
const {Component, View, bootstrap} = toccata;
!
@Component({
selector: 'hello'
})
@View({
template: `<p>Hello!</p>`
})
class HelloController {
constructor() {
// noop
}
}
!
bootstrap(HelloController);
このソースで

AngularJS 1.3.15が動く
Cresc Toccata
import {* as angular} from 'angular';
import {* as toccata_} from 'toccata';
!
const toccata: Toccata = toccata_(angular);
const {Component, View, bootstrap} = toccata;
!
@Component({
selector: 'hello'
})
@View({
template: `<p>Hello!</p>`
})
class HelloController {
constructor() {
// noop
}
}
!
bootstrap(HelloController);
ここをAngular 2に差し替えても動く
要はAdapterパターン
なぜ作ろうと思ったか
• AngularチームもMigratorの話をしていたが、いつになるか分からない
• ぶっちゃけAngularチームのAPI策定、微妙なところがあるので

Migratorは信頼しきってない(上出来だったら万々歳)
• オレオレではなく、常にAPI互換を念頭に

今のうちからアダプタ実装を開始しておく
• 手元に既に複数のAngularJSプロジェクトが控えている

これを2.0リリース後に一斉に移行させるのはしんどい

→今のうちに、分かるところから始めたい

 でも安定した1.x系で運用したい
移行ビジョン
• Toccata独自のDecorators APIとして

@NgController, @NgDirectiveの2つをサポートする
• まずは今動いているAngularJSからコピペで

この独自Decoratorsに移す
• そこから段階的にAngular 2.0互換のAPI

@Component, @Viewに置き換える
• 最終的にはToccataを外して、Angular 2.0のみの

運用にもできる
• 一歩一歩着実に、せーのでやらずに済ませたい!
予定機能
• 前半に話したFluxは、毎回実装するのが面倒なので

Angular用Flux実装としてEmitterとAbstract Storeを組み込む
• Angular 2.0はJSソースだけでなくHTML面でも構文に変化がある

<input type="text" #name (keyup)>
• toccata-convという変換ユーティリティを現在開発中
• 規則性のある構文なので普段は2.0の構文で書いて、1.x系の構文に

変換できるよう準備を進めている
• 最適化先輩に教わりながら複雑なパターンのテストを追加している段階
• 分かりやすいサンプルとして公式のTodoアプリをToccataで書く
今後、様々なAngularの勉強会・ハンズオンなどで
ユーザの意見を聞きながら
Toccataにフィードバックしていきます
Angular 2.0への移行が嫌だから…
と離れていく姿はもう見たくないんだ!
Follow me!
• @armorik83
• Angular 2.0の動向をキャッチしてTwitter, Qiita,

勉強会等で伝えていくので是非フォローしてみてください
• Toccataの進捗も伝えていきます

もし気になったら覗いてみてください
ありがとうございました
Angular勉強会#3 GDGKobe - Apr 29, 2015
©2015 Crescware

More Related Content

PDF
Angular 4がやってくる!? 新機能ダイジェスト
PDF
Angular jsの継続的なバージョンアップ
PDF
Directiveで実現できたこと
PDF
Angular2
PDF
開発ライフサイクルから見たAngularJS
PDF
Angular1&2
PDF
俺とAngular JS 2
PDF
Enterprise x AngularJS
Angular 4がやってくる!? 新機能ダイジェスト
Angular jsの継続的なバージョンアップ
Directiveで実現できたこと
Angular2
開発ライフサイクルから見たAngularJS
Angular1&2
俺とAngular JS 2
Enterprise x AngularJS

What's hot (20)

PDF
AngularJSとFluxとRiotJSと
PPTX
Angular js開発事例
PDF
noteをAngularJSで構築した話
PDF
Angular#Kanazawa
PPTX
Angular2実践入門
PDF
クリエイティブの視点から探るAngular 2の可能性
PDF
AngularJS 概説
PDF
angular1脳で見るangular2
PDF
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
PDF
Angularモダンweb開発セミナー紹介 20170923
PDF
超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
PPTX
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
PDF
angular X designer - デザイナからみたAngularJS #ten1club
PDF
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
PDF
One-time Binding & $digest
PDF
今後のWeb開発の未来を考えてangularJSにしました
PDF
CSS Living StyleGuide
PDF
スキスキIonic
PPTX
JavaScript使いのためのTypeScript実践入門
PDF
いい感じのフロントエンド開発環境を作ってみた
AngularJSとFluxとRiotJSと
Angular js開発事例
noteをAngularJSで構築した話
Angular#Kanazawa
Angular2実践入門
クリエイティブの視点から探るAngular 2の可能性
AngularJS 概説
angular1脳で見るangular2
今後のWeb開発の未来を考えてangular jsにしました(拡大版)
Angularモダンweb開発セミナー紹介 20170923
超初心者でも大丈夫!AngularJSでフォームページをちょっとリッチに改造してみよう
TechFeedのつくりかた - Angular2/Webpack/Ionic2/Cordova実践入門
angular X designer - デザイナからみたAngularJS #ten1club
受託開発でのAngularJS - 第1回AngularJS 勉強会 at LIG
One-time Binding & $digest
今後のWeb開発の未来を考えてangularJSにしました
CSS Living StyleGuide
スキスキIonic
JavaScript使いのためのTypeScript実践入門
いい感じのフロントエンド開発環境を作ってみた
Ad

Viewers also liked (20)

PPTX
AngularJS2でつまづいたこと
PDF
SPAと覚悟
PPTX
僕はどうしてAngular2をテーマに登壇することになってしまったのか
PDF
AngularJS入門の巻2
PDF
AngularJS入門の巻
PPTX
AngularJS入門
PDF
TypeScriptで書くAngularJS @ GDG神戸2014.8.23
PPTX
TypeScriptをオススメする理由
PDF
新世代Java scriptコントロール wijmo5 devsumi_150219
PDF
Angular.jsについてちょっとしゃべる
PDF
AngularJSについて
PDF
Are you a Designer or an Engineer?
PDF
iPhoneアプリを Javaで書くよ?
PDF
Angular1.4で作られた自社マイクロサービスを2へマイグレーション
PDF
そろそろ押さえておきたい AngularJSのセキュリティ
PDF
Angular+Dart=より快適なSPA開発
PDF
あなたの言葉で伝えるWebアクセシビリティ
PPTX
React を導入した フロントエンド開発
PDF
JenkinsをJava開発でこんな感じで使っています
PDF
Webサイトパフォーマンス管理の基礎知識
AngularJS2でつまづいたこと
SPAと覚悟
僕はどうしてAngular2をテーマに登壇することになってしまったのか
AngularJS入門の巻2
AngularJS入門の巻
AngularJS入門
TypeScriptで書くAngularJS @ GDG神戸2014.8.23
TypeScriptをオススメする理由
新世代Java scriptコントロール wijmo5 devsumi_150219
Angular.jsについてちょっとしゃべる
AngularJSについて
Are you a Designer or an Engineer?
iPhoneアプリを Javaで書くよ?
Angular1.4で作られた自社マイクロサービスを2へマイグレーション
そろそろ押さえておきたい AngularJSのセキュリティ
Angular+Dart=より快適なSPA開発
あなたの言葉で伝えるWebアクセシビリティ
React を導入した フロントエンド開発
JenkinsをJava開発でこんな感じで使っています
Webサイトパフォーマンス管理の基礎知識
Ad

Similar to イベント駆動AngularJS / 今から書くAngular 2.0 (19)

PPTX
Our Track to Modern Angular
PPTX
初心者 × AngularJS × TypeScript
PDF
はじめてのAngular その1
PPTX
エンタープライズ分野での実践AngularJS
PDF
今からでも遅くない! 2から始めるangular js
PDF
サーバサイドエンジニアが 1年間まじめにSPAやってみた
PDF
20140823 LL diver Angular.js で構築した note に関して
PPTX
AngularJSを触ってみた
PDF
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
PDF
traceur-compilerで未来のJavaScriptを体験
PDF
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
PDF
20140529 JS Ojisan #2 LT あの「note」はAngular.js
PPTX
Our Track to Modern Angular #2
PDF
Ecmascript2015とその周辺について
PPTX
angularJS vs angular2
PDF
Angular の紹介
PDF
AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)
PDF
AngularJS+TypeScript - AngularJS 1周年記念勉強会
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
Our Track to Modern Angular
初心者 × AngularJS × TypeScript
はじめてのAngular その1
エンタープライズ分野での実践AngularJS
今からでも遅くない! 2から始めるangular js
サーバサイドエンジニアが 1年間まじめにSPAやってみた
20140823 LL diver Angular.js で構築した note に関して
AngularJSを触ってみた
AngularJSでwebアプリを作ってみた!(2014/6/8 GDGKobe)
traceur-compilerで未来のJavaScriptを体験
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
20140529 JS Ojisan #2 LT あの「note」はAngular.js
Our Track to Modern Angular #2
Ecmascript2015とその周辺について
angularJS vs angular2
Angular の紹介
AngularJS x Chrome Apps (2014.08.23 #gdgkobe event)
AngularJS+TypeScript - AngularJS 1周年記念勉強会
ng-japan 2015 TypeScript+AngularJS 1.3

イベント駆動AngularJS / 今から書くAngular 2.0