Angular 2 alpha.18 に挑んだら想像以上に険しかった
「まだ早い!!」
@armorik83 です。時間ができたのでng-japan終了後、ようやく Angular 2 を触ることができました。導入が想像以上にきつく、ES6 やコンパイルといった昨今の JS 事情に詳しくなければ、alpha 段階で触るのは避けたほうがいい、というのが現段階での印象です。
足を踏み入れたのが早すぎるだけで、時間が解決するものだと思っています。
(150415 追記: かなり解決されてきたので書きました → どうしても今 Angular 2 with Babel を触ってみたい人のためのビルドスクリプト)
何が険しいか
文章化する体力が残されていないので箇条書きで。
traceur-compiler
-
npm i angular2
して落ちてくるAngular 2の JavaScript ソースがすべてtraceur-compilerのランタイムに依存している- すでに ES5 化されているためBabelは使えない
- Babel 使いとしては、これは不採用
- https://github.com/angular/quickstartは遅いらしい(試してすらいない)
- systemjsの話全然聞かない
node_modules 内をコンパイルしてしまうのか問題
-
./node_modules/angular2/es6/dev/
に traceur-compiler 適用前のソースが入っている- 理屈ではこのソースを Babel でコンパイルすれば動く(はず)
- node_modules 内を変換するという抵抗感
- Angular 2 実装内に相対パスではなく、node_modules 基準
from 'angular2/foobar'
のパス表記があるため、単純なコンパイルではリンク切れを起こす
babel --blacklist useStrict
-
eval 問題
まさかの実装内eval()
使用と、"use strict"
必須にしてくる Babel が相性最悪- 正しくは「strict 下で予約語扱いの eval を Angular 2 側がメソッド名に使っていたため Babel の
'use strict'
とバッティングする」でした - Babel の
--blacklist useStrict
で回避可能
- 命名に
eval
を用いたことにいい印象は無いが、一応 valid なため Babel 側のバグ
constructor が decorator にならない件
- Angular 2 において
@Component()
というアノテーション (decorator) で使われているComponent
はclass constructor なためBabel のランタイム_classCallCheck()
で落ちる-
_classCallCheck()
とは「constructor
は常にnew
を付けて呼べ」と怒るためのチェック -
constructor
を直接 decorator 利用しているため怒られる - ダメ元で Babel 開発者に確認していますが、たぶん Babel 側が正しい挙動をしてそう
-
自分の App ソースを TypeScript で書けない問題
-
TypeScript 1.5-alpha で decorator 構文をコンパイルしたとき問題発生
-
--blacklist strict
しないと TypeScript が出力するthis.__decorator
がundefined
に置き換えられてしまう(参考: FAQ Why is this being remapped to undefined?) - 根本的に前節『constructor が decorator にならない件』で落ちるから関係無かった
- ~~AtScript は TypeScript になりまぁす!~~この件どうなってる
-
自分の App ソースを es6 + Babel で書けない問題
- 『constructor が decorator にならない件』がやっぱり問題になる
-
babel-plugin-angular2-at-annotationを用いて
babel --plugins angular2-at-annotation --optional es7.decorators
だと、なんとかコンパイルできる
-
babel-plugin-angular2-at-annotationを用いて
zone.js が Browserify に対応してない問題
-
zone.js何者ですか
-
window.zone
に対してグローバルに格納するのでBrowserifyお手上げ - 百歩譲って
<script src="zone.js"></script>
にしたくても bower 非対応なので泥臭く手で記入 - browserify-shimを使えばいけるかもしれないが、このライブラリ更新が止まっているのでもう避けたい
- ソースを読んだところ、グローバル変数化のバグを取り除けば動きそう
- 手元の修正では動いたので、様子を見ながら PR を検討中
-
結果、大惨敗
Babel + Browserify でbootstrap()
するところまで進めたものの、最後の最後でzone.js
内の promise で落ちて原因が全く分からなかったので、この時点で挫折しました。
Angular 2 で遊びたいんだけど
ご安心ください! そんなチャレンジャーな貴方のために、@shuhei 先生によってhttps://github.com/shuhei/babel-angular2-appというスケルトンが作成されました!(全て克服されていて感動しました)
Qiita の『Angular 2 を試してみた感想とハマりどころ』も必読かと思います。
宣伝
ここで宣伝です。2015 年 4 月 29 日に開催されるGDGKobe Angular 勉強会#3では、ちょっと早すぎる?Angular 2 の導入法や、Angular 2 alpha で実際に動作するアプリケーションのサンプル(今作ってる)、これから Angular 1.3|1.4 を使う我々にできることは何か、といったセッションを担当します。上のような険しい話は避けますが、中級者〜上級者にご満足いただける内容にするため果敢に体当たりを繰り返しているところです。
神戸ではありますが、ご興味がありましたら是非!
さいごに感想
自力で Hello もできず、最終的に破棄して shuhei さんのスケルトンを使うまでに丸一日を費やした。ロトのしるし取るために毒沼を何往復もして死んだ感じです。
半年後に起こして。
Discussion