ng-kyoto meetup 3で発表した #ng_kyoto

ng-kyoto.connpass.com

2015/11/22に開催された ng-kyoto meetup #3 で発表してきた。

経緯

10月頭頃、ng-kyoto が弊社オフィスで開催されるという知らせを聞いた。
ng-kyoto の存在は以前から知っていた。
京都はエンジニアコミュニティが少ないので、せっかくだから交流してみたいと思い、発表に名乗りでた。

自分のトークについて

speakerdeck.com

ng2 の Decorator、なんか特殊じゃね?と探っていったら AtScript の Annotation にぶち当たったという話。

Angular は1年前に4週間だけ触ったことがあるのだけど、それ以降の変化は全く追っていないし知見もない。
そこで、もうすぐベータがリリースされると噂の Angular2 を触ってみることにした。

まずは公式サイトの QuickStart をやってみる。

angular.io

僕はTypeScriptをほぼ知らないので Angular2 for JavaScript を選択。
サンプルコードは ng.Component().Class() とかやっているのだけど、もっとスマートに書きたい。
「Angular2 では Decorator を使ってコンポーネントを書ける」というのを前情報で聞いていたため、TypeScript の方のサンプルコードを参考に Babel を使って Decorator で書いてみたが、どうも上手く実行されない。
エラーの原因を探っていたら ng2 での Decorator の実装や AtScript の Annotation に出くわす事になり面白かったので、今回は Decorator / Annotation をテーマに発表することにした。

結局 QuickStart +α 程度しかやっていないので、ng2の知識ゲットには失敗したといえる……

ng2のソースちょっと読んだ感想

Angular2、まだまだ alpha ということで、変にブログ記事とか探さずに公式のリソースを見ること。
あと、公式ドキュメントは充実しているのだけど、コメントから生成されたものっぽい。
日本人の場合は、英語ドキュメント頑張って読むよりもソースコード読んだほうが理解しやすいと思う。

ソース綺麗で、TypeScript知らない僕でも割とスラスラ読めた。
ただディレクトリ構造が複雑なので、import 辿っていくより GitHub 検索つかったり git grep したほうが目的のコード見つけるの楽だった。

reflect-metadata について

ES2015では Reflect というグローバルなAPIが追加されている。
Reflectはメタプロ向けの便利メソッド集といった趣で、Function.prototype.apply() の改良版や、__proto__ を触らずに合法的に prototype を変更するメソッドなどがある。
詳しくは↓の解説エントリを見てくれ。

http://www.2ality.com/2014/12/es6-proxies.html

この Reflect に対し、Objectに任意のメタデータを追加する Reflect.defineMetadata() 等のAPIを追加する proposal が出ている。
reflect-metadata は この proposal を実現する polyfill である。

実装をみると、WeakMap に Object 毎の metadata を保存している事がわかる。
https://github.com/rbuckton/ReflectDecorators/blob/master/Reflect.ts#L31

WeakMapで事足りるのだから、JS本体の仕様に入れる必要は無いと思うんだよな……
polyfill をそのままライブラリとして公開すればみんな幸せ、なはず。

というか WeakMap は metadata そのものという感じもする。

トークでは「Angular のために ES に proposal 出すの、豪腕政治っぽい」って言ってしまったけど、一応 proposal 出してるのは Google じゃなくて MS の人だった
うーん謎だ

会場運営について

今回は僕の働いているオフィスが会場だったのだけど、発表の準備で精一杯で、会場の準備について全く考えていなかった。
結果、ビル入り口の案内、プロジェクタへ接続する変換コネクタの手配、懇親会の準備等けっこうgdgdになってしまった。
参加者の皆様スミマセンでした 🙇🙇🙇🙇

またオフィスでイベントを開催する機会はあると思うので、次はしっかりできるといいな。

参加者/運営の皆様、ありがとうございました!