Angular2 Dart版のForkとその後の開発の動向

７月下旬に、Angular2 Dart版が従来のTypeScript版からコンパイルされたコードベースから独自リポジトリに移行し、専業チームの手でDartに最適化されたものに進化させていくことが発表された。あれから二週間ほど経過し、リポジトリにChangelogやCI等が整備されCommitが増えてきたので、このタイミングで[Dart News](http://news.dartlang.org/2016/07/angulardart-is-going-all-dart.html)の抄訳をし、[リポジトリ](https://github.com/dart-lang/angular2)上の活動から見えるAngular2Dartの開発の動向をまとめてみる。

# 追記

AngularDartのハイレベルロードマップの草稿が発表されたので抄訳してみた。
http://qiita.com/ntaoo/items/347f9a2cb6b71f7e4bf0

# AngularDart is going all Dart (抄訳)

http://news.dartlang.org/2016/07/angulardart-is-going-all-dart.html

Angular2のコードベースをTypeSript/JavaScript版とDart版に分離し、AngularDartの専業チームを結成した。これによりAngularDartは、よりDartの作法に則ったフレームワークとなり、TypeScriptには沿わないようなDart独自の機能を取り入れていき、より高速化される。

またこれはTypeScript/JavaScript版にとっても、APIが整理され、性能が向上し、コントリビュートをしやすくなるので[素晴らしいニュースだ](http://angularjs.blogspot.jp/2016/07/a-dedicated-team-for-angulardart.html)。

Angular2 DartはAdWordsチームに採用されたことが有名だが、それ以外でも既にGoogle社内の多くのチームに採用されている。それらの多くは大型のモバイルフレンドリーなウェブアプリだ。それらのチームからの要望で最も多いものは、APIをDartのスタイルに合うように改善すること、開発サイクル(edit->refresh)の高速化、パフォーマンスの向上だった。これはまさにAngular2 Dartチームが目標とするところで、既に[strong mode](https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md)のwarningのfixなどを進めている。


## Material Design Components

Angular2 DartのためのMaterial Design Componentライブラリのリリースを予定していることをお知らせしたい。これは(JS製UIライブラリのラッパーなどではなく)Dartで開発されており、Googleで開発しているアプリで実際に使用されている。以下の画像で紹介しているものはそれら多くのComponentのうちの一つだ。

![](https://1.bp.blogspot.com/-WAVRnMD6LZ0/V4Z3pcz2b5I/AAAAAAAANXs/I2iKy2cgwmo84LnCZMZU8PmBqdAQJSR4QCKgB/s1600/angulardart-material-component-preview.gif)


Dartには安定した[スタンダードライブラリ](https://www.dartlang.org/guides/libraries/library-tour)、[信頼できるツール](https://www.dartlang.org/tools)、そして素晴らしいフレームワークが揃っており、間もなくこれらに加え、プロダクションで使用された実績を積んだ確かな品質のUIウィジェットが提供されることになる。


# dart-lang/angular2の開発の動向

次に、[dart-lang/angular2](https://github.com/dart-lang/angular2)をwatchして把握しているAngular2Dartの開発動向をまとめる。


## 大掃除

リポジトリのFirst commitでは、TypeScript版からコンパイルされたものでなければ不要なコードがそのまま多く残されており、まずはそれらの除去が進められている。

その大部分はsrc/facade/に存在しており、それらはTypeScript版からコンパイルした際のコードとDartのスタンダードライブラリAPIのコードのギャップを埋めるために使用されていたようだ。例えばDartのFuture APIを使用するためのJSのPromise APIラッパーなど。これらはDartスタンダードライブラリの主要なAPIのfacadeとしてコードベースの多数の箇所で使用されており、その結果Dart版のコードの見通しが悪化し、またパフォーマンス低下の要因になっていた。新しいコードのコントリビュートもしづらいため早く完全に除去されて欲しいところだ。

また、TypeScript版のままになっているAPIのdocコメントの書き換え、使用されていないファイルやAPIの整理(Dart版では不要なforwardRef()の除去や、ChangeDetecitonが実行中に例外を投げるための内部APIの整理や、古いbind()APIの廃止等)、その他[Dart Style](https://www.dartlang.org/guides/language/effective-dart/style)に沿うためのリファクタリングも徐々に進められている。


## 開発基盤の整備、ライブラリとエコシステム等

CI環境の整備、テストの追加、依存パッケージのバージョンのアップデート、コンパイラテストの追加等。
また、DDCサポートのためのStrong modeの強制とそれにより起こる多数のエラーの修正。そして現時点でのWeb worker関連の実装が削除された。これは現状の実装でのコードカバレッジの改善のため。将来、dart:htmlの機能を使用して再実装される予定。
加えてBrowser adapterで内部的に使用されるごく一部のJSをラップするための方法をdart:jsからpackage:jsへ移行している。その他一部のセキュリティアップデートが初期コミットに紛れて追加されている。

Transformerやbuilderについても現状は制約が色々強いため、この進化に取り組むことが明言されている。

また、angular2_testing packageはAngular2Dartのリポジトリに統合される方向。angular2_testing.beta17はangular2.beta18以降では依存解決できずにインストール出来ない上に、元のリポジトリからは既に削除されているため、自分のリポジトリではcomponent test周りのコードの移行を見合わせている。個人的には早急にfixしてほしいところだ。

## APIの変更

現状ではconst Providerの第二引数を`const Provider(Foo, useClass:Foo)`などと明示的に書かなくてはならず、省略して`const Provider(Foo)`などと書くと実行時にDI関連の不可解なエラーを吐かれてしまっていたのだが、beta.18より`const Provider(Foo)`で`const Provider(Foo, useClass:Foo)`と解釈してくれるようになった。
しかし、自分の環境では相変わらず変更前APIの挙動のままでエラーを吐かれるなので、現時点ではちゃんと動いていないのでは?という疑惑を持っている。


## Dart版独自のtemplate syntaxの追加

Null-aware operatorの一部(`??`と`?.`)がtemplate syntaxに追加される方向のようだ。おそらく外部のcontributorのPull Requestが受け入れられる気配。これは例えば`var foo = bar ?? baz`や`foo?.bar`。[Dart本体には一年前に追加された機能](http://news.dartlang.org/2015/08/dart-112-released-with-null-aware.html)。Compound operator(??=等)もこの調子で追加されるかもしれない。

これが追加されるならば、template syntaxは徐々にTypeScript版との互換性重視の方針から離れ、letからvarへの変更なども期待できる。個人的には互換性よりもDartのイディオムを最大限活用したtemplate syntaxを追求していってほしい。


## Google内部での開発

[Contributing guide](https://github.com/dart-lang/angular2/blob/master/CONTRIBUTING.md#merging-pull-requests)で説明されているように、AngularDartリポジトリのコードベースは、はGoogle内部のリポジトリのコードベースのサブセットが定期的に同期されるスタイル。

恐らくしばらくは、AngularDartの今後の方向性や新機能は、Google内部のAngularDart採用チームのフィードバックを重視するなどしてGoogle内部で議論され、よく揉まれた決定済みのものが公開されていくのではないか。TypeScript版Angular2での新機能との互換性等、どういう戦略で臨んでいくのか疑問は色々あるが、現状はFork後の基盤整備のフェーズだと思われるのでしばらくは静観するほうがよさそうだ。


## HTTP CLIENT, Component Router, NgModule等

現時点では自分が知るかぎりアナウンスは無い。
HTTP CLIENTに関しては、Dartには既に安定した`package:http`があるため、もしTypeScript版に追随するにせよ、このままこのパッケージがベースになるのではと思う。
Component Router, NgModuleはそれらが安定したらDart版にもいずれ移植されるのではないか。Google外部のコントリビューターが移植を試みても内部で行われている作業と重複するものになるものと思われる。


## Style Guide

TypeScript版はdirectory structureなどの詳細がかなり詰められるなど[既に充実しており](https://angular.io/docs/ts/latest/guide/style-guide.html)、それを前提としたBarrelなどのシステムがあるようだ。しかし、DartにはDartのstyleがあり、analyzerやlinerもそれを前提に作られているので、別途それらによく適合するStyle Guideとシステムが作成されていくと予想している。


# 所感

TypeScript版はもうすぐ安定版のリリースになりそうな気配がするが、Dart版はしばらくの間はベータ版のままアップデートを重ねて品質を高めていくのだろう。

最近のDart Web開発では、Angular2というキラーWebフレームワーク、品質の高いUIライブラリ、[ヒューマンリーダブルでモジュラーなES6コードを吐くtranspiler](https://github.com/dart-lang/dev_compiler)と、大きなミッシングリンクが埋まりつつある。

特にMaterial Design Componentsは、TypeScript版[angular/material2](https://github.com/angular/material2)とは異なるコードベースで、近々公開されるとアナウンスされた。material2は未だアルファ版の開発が続いている最中なので、Dart版ではTypeScript版に先駆けて完成度の高いMaterial Design Componentsが利用可能になると思われる。

Dart SDK自体も非常に活発にcommitが続いており、プロモーションを控えて静かに打ってきた布石とともにそのポテンシャルを徐々に開放してきた感がある。