Dart 1.16 リリースノート

こんにちは。リリース予定日からかなり遅れた形となりましたが、Dart1.16がリリースされました。

[Dart News &amp; Updates: Dart 1.16: Faster tools, updated HTML APIs](http://news.dartlang.org/2016/04/dart-116-faster-tools-updated-html-apis.html)

簡単に変更点をまとめていきたいと思います。CHANGELOGは[こちら](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#1160)。

# TL;DR

* dev_compilerがSDKに実験的に追加された
* pubのパフォーマンスが改善された
* HTML APIがDartiumのChromeのバージョンに合わせてアップデートされた。

# 1.16変更点

## ツール変更点

### pub

* `pub serve`がキャッシュヘッダに対応しました。これは大きなファイルを複数回取得する際のパフォーマンスの改善となるはずです。
* `pub get`と`pub upgarade`コマンドにおいて実行ファイルのプリコンパイルや依存関係のトランスフォームを無効にする`--no-precompile`フラグが追加されました。
* `pub publish`がgitレポジトリを公開した場合でもシンボリックリンクを解決するようになりました。



### Dart Dev Compiler

* `dartdevc`が実験的にSDKに追加されました。
* これは実装の検証・そのフィードバックを助けるものです。`dartdevc`はまだ**実験段階**です。

さらに詳しいことは[dev_compilerのレポジトリページ](https://github.com/dart-lang/dev_compiler)を見るのが良いかと思います。まだUSAGEが更新されていませんが、簡単につかってみることはできます。

## 標準ライブラリの変更点

### dart:convert
* `BASE64URL`定数が追加されました。
[BASE64URL constant - dart:convert library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-convert/BASE64URL-constant.html)

(BASE64URLのexampleは間違っていますので、こちらの[commit](https://github.com/dart-lang/sdk/commit/c9397d0493ae71b7c252bca690d8de6281e3740b)で変更されたものを見ると良いと思います。)

* `ChunkedConverter` クラスが追加されました。また、`Converter`クラスの`startChunkedConversion`がdeprecatedになりました。
[ChunkedConverter class - dart:convert library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-convert/ChunkedConverter-class.html)
[startChunkedConversion method - Converter class - dart:convert library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-convert/Converter/startChunkedConversion.html)

### dart:html
今回のリリースでは最近のChromeの変更に伴ういくつかの**破壊的変更**があります。

* Chromeの`ShadowRoot`は`getElementById`や`getElementsByClassName`, `getElementsByTagName`をサポートしなくなります。

```dart
elem.shadowRoot.getElementsByClassName('clazz')
```

のようなコードは、

```dart
elem.shadowRoot.querySelectorAll('.clazz')
```

のように記述するようになりました。

* `KeyEvent`クラスと`Event`クラスから`clipboardData`プロパティが取り除かれました。`copy`,`cut`,`paste`などのイベントで使われているこれらは`ClipboardEvent`クラスに移動しました。
[ClipboardEvent class - dart:html library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-html/ClipboardEvent-class.html)

* `layer`プロパティが`KeyEvent`クラスと`UIEvent`クラスから取り除かれ、`MouseEvent`クラスに移動しました。
[MouseEvent class - dart:html library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-html/MouseEvent-class.html)
* `page`プロパティが`UIEvent`クラスから取り除かれました。`MouseEvent`クラスと`Touch`クラスには存在しています。
[Touch class - dart:html library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-html/Touch-class.html)

他にも、ChromeのAPIをv39からv45に引き上げたことで、 `dart:html`,`dart:indexed_db`,`dart:svg`,`dart:web_audio`,`dart:web_gl`に多くの変更が行われています。破壊的な変更のほとんどはJavaScriptにコンパイルするときや最新のChrome上で実行した際に例外が発生していたのを修正するものです。

### dart:io

* `SecurityContext.alpnSupported`が追加されました。これはそのプラットフォームがALPNをサポートしていればtrue、そうでなければfalseを返します。
[alpnSupported property - SecurityContext class - dart:io library - Dart API](https://api.dartlang.org/stable/1.16.0/dart-io/SecurityContext/alpnSupported.html)

## JavaScript interop

パフォーマンス改善のため、JS interopに**破壊的変更**が追加されています。

`@JS`アノテーションを使用する場合はライブラリ宣言にも`@JS`をつけることが必要となります。`part`をつかって読み込んだDartファイルで`@JS`アノテーションを使用している場合も同じです。

このため、相互運用したいJSライブラリごとにライブラリを作る必要があります。アプリケーションの一部で`@JS`アノテーションを使うことはできなくなり、JS interopを利用したライブラリとJSライブラリが1:1で対応するようになりました。

CHANGELOGの[こちら](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#javascript-interop)もあわせて御覧ください。
chartjs.dartの[変更対応commit](https://github.com/google/chartjs.dart/commit/2b3e06ba6916f16a01e0cfbe8a0416dc0458141c)も参考になるかもしれません。

## Analyzer

`for in`文が静的解析されるようになりました。

```dart
// Not Iterable.
for (var i in 1234) { ... }

// String cannot be assigned to int.
for (int n in <String>["a", "b"]) { ... }
```

このような警告が出るようになります。

DartPadなどで実際に試してみるのがわかりやすいと思います。サンプルは[こちら](https://dartpad.dartlang.org/832151fe45afa73b88c5c3c66bf525b3)。


# 最後に

ちょっと前のニュースになりますが、Dart Developer Summit 2016も発表されました。2016年10月26~27日に、ドイツのミュンヘンで行われるようです。公式サイトは[こちら](https://www.dartlang.org/events/2016/summit/)。

dev_compilerに関しては、近いうちにUSAGEが更新されるはずです。新たな発表が大きいものであったらまたまとめたいと思います。

(翻訳を [@laco0416](http://qiita.com/laco0416) さんに改善していただきました。Thanks!)