Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

GDG神戸 Angular勉強会#3 2015年4月29日発表分の資料をSlideShareより再掲。
http://www.slideshare.net/armorik83/angular3-gdgkobe150429

OKUNOKENTARO

April 29, 2015
Tweet

More Decks by OKUNOKENTARO

Other Decks in Programming

Transcript

  1. Angularと私 • 2013年秋、AngularJS 1.2とTypeScriptに出会う • 2014年6月、この勉強会の第一回に参加 • 2014年後半、『AngularJSアンチパターン集』や
 『モダンAngularJS』といった記事が割と受け入れられる •

    AngularJSが嫌われてる? といった風潮とReact.jsの流行に過敏になる • 突然のAngularJSのお仕事 • 2015年3月、東京でのng-japanに出席 ←いまこの辺
  2. Root Directive • View, Dispatcher, StoreでいうViewの部分 • グラフ描画ライブラリの都合で、Storeはどうしても2つにする
 必要があった •

    利用者の行動 →
 Dispatcher → Store → View → 即Action
 Dispatcher → グラフ描画ライブラリ → View • Q. 2周って無駄じゃね? • A. そうやってViewが複数と相互にやりとりしていたのが
 従来のMVW、流れは常に1方向に限定する
 2周するEmitの速度は全く気にするレベルではない
  3. Flux模倣の実装 • 全てTypeScriptで記述 • CommonJSのrequire()で記述、Browserifyでビルド • Emitterにはビルトインの$broadcast, $on
 $emitは上下関係での挙動の違いが複雑になるので不採用 •

    Dispatcherのイベント名は全て定数管理"constant.ts"を 作ってまとめておく • APIとしては、StoreからDispatcherはaddHandlers()
 StoreからDirectiveに対してはaddListener()を備える
  4. 進捗どうですか • 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の開発も予告
  5. @Decorators • ECMAScriptの仕様策定としてはまだまだ
 ミーティングでの議題にのぼってる段階
 (具体的にはES7 Stage 1 Proposal) • Babelでは--optional

    es7.decoratorsで利用可能 • TypeScript 1.5.0-alphaでは、もう利用可能
 TypeScript 1.5.0-betaというのも控えてた • Angular側が想定してる構文と仕様にすれ違いがあって
 正直まだグラグラしてる
 4月中だけでいくつバグが直ったか…
  6. 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; } }
  7. 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に相当
  8. Cresc Toccata • クレス・トッカータ • npm install --save toccata •

    今日もう少し安定して使えるところまで進めたかった
 Angular 2.0が想像以上にバギーだったので難航
  9. Cresc Toccata • Decorators構文を採用したTypeScriptユーザ前提の
 ライブラリ • AngularJS 1.3.14以上に対応できるよう開発中 • Angular

    2.0とAPIに互換性を持たせて提供 • AngularJS 1.x系でもAngular 2.0の「書き方」で開発ができる • Toccata<伊>とは「急な変化と流れを持つ即興的な音楽」
 を意味する音楽用語で、即興、試し弾きという意味がある
  10. 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が動く
  11. 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パターン
  12. 移行ビジョン • Toccata独自のDecorators APIとして
 @NgController, @NgDirectiveの2つをサポートする • まずは今動いているAngularJSからコピペで
 この独自Decoratorsに移す •

    そこから段階的にAngular 2.0互換のAPI
 @Component, @Viewに置き換える • 最終的にはToccataを外して、Angular 2.0のみの
 運用にもできる • 一歩一歩着実に、せーのでやらずに済ませたい!
  13. 予定機能 • 前半に話したFluxは、毎回実装するのが面倒なので
 Angular用Flux実装としてEmitterとAbstract Storeを組み込む • Angular 2.0はJSソースだけでなくHTML面でも構文に変化がある
 <input type="text"

    #name (keyup)> • toccata-convという変換ユーティリティを現在開発中 • 規則性のある構文なので普段は2.0の構文で書いて、1.x系の構文に
 変換できるよう準備を進めている • 最適化先輩に教わりながら複雑なパターンのテストを追加している段階 • 分かりやすいサンプルとして公式のTodoアプリをToccataで書く