Object.observeのGoogle Chromeでの先行実装とAngularについて

読みました。

Angularが好き - Can I do web?

https://twitter.com/agektmr/status/519128909695045633

僕の中で、Object.observe なんてどうみてもangularのためじゃんって雰囲気が最初からあって、あまりにも当前だと思っていたので、さも事実のように書いてしまってました。 実際に検索してみたところ、その関係に実際に言及するような資料は発見できませんでした。この点は僕の想像でした。申し訳ありません。

ですが、検索すると僕以外にも多くの人がそう思っており、それなりに根拠もあります。なぜそう思っていたのか、その理由を提示します。

2012/06

Angularの公開リリース

2012/11

Object.observeの仕様の初出 http://wiki.ecmascript.org/doku.php?id=harmony:observe&rev=1348241079

(es wikiにまとまったのがこの時期で、Draftの提案はもうちょっと早い時期のはず)

2013/04 あたり

Object.observe が ES6 の仕様から外れてES7以降へ延期

ES6,ES7,ES8 and beyond. A Proposed Roadmap.

↑が直接的なソースかはわからないが、少なくともこの記事の前後には現行のES6には不採用に

2014/03

AngularJS: AngularJS 2.0 で Angular2.0は Object.observe 前提なデザインで動くようにするとのこと

この時、延期されたはずの非標準APIに依存するのはあまりに危険なのでは?という意見が多かった

2014/07/16

Chrome 36で、Object.observeをデフォルトで有効化

ちなみにV8のみの先行実装で、他のブラウザは一切追従してない。 ECMAScript 7 compatibility table

先のAngular2.0に歩調を合わせたかのように見える

何が問題か

Object.observe が動くこと自体は何も問題はない。僕も心待ちにしていた。 問題は、V8 の先行実装で他のブラウザで動かない、Chromeの独断専行に見えるのが基本的にまずい。

API利用者としては、あくまでObject.observeはChromeのみの機能であって、他のブラウザと歩調を合わせてくれないと怖くて使えない。 Object.observeはプリミティブな値の監視というその性質上、処理系レベルでないと正確なpolyfillが書けない。生のArray監視してる限り、Array.prototype.lengthの監視なんて出来ない。 AngularはObject.observeの代わりにDirtyCheckの実装というフォールバックが機能があるが、他のクライアントサイドフレームワークはそこに開発リソースを割くことは難しい。

僕がモジュラリティの点でAngularを批判しているのは、DirtyCheckもおそらくは一つのライブラリとして独立できるパーツでもあるが現状ロックインしているというのもある。

このような現状で、KOBA789氏の言っていたように、「Chromeでのみ速く動く」ようにみえるのは、ちょっとまずいのではないかな、と。

AngularJSは今すぐ生まれ変わるか死ね - Write and Run

別に僕はWeb標準の信者ではないが、Googleの信者でもないし、今のGoogleが現代のMSみたいな扱いになる未来がないわけでもないわけで、ChromeがIE6になる未来を懸念しているわけです。 僕としては仕様が分裂 or MS Appleが追従せずにasm.js方向のJavaScriptバイナリ化、LLVM言語からJS生成する未来のほうが現実的だと思っています。

私信: 財布は見つかってないです。。。