エモにはエモ。
わかる
だいたいわかる。そもそもSPAの必須パーツであるクライアントサイドルーティングなんてブラウザ機能の再実装の極致だし、ブラウザ上でアプリケーション作るとなるとブラウザに足りてない部分はラップして、アプリケーションプラットフォームにしたてる必要がある。
Angularはアプリケーションフレームワークとして、HTMLの限界をカバーするために独自にHTMLのパーサーを積んでいる。 テンプレート構文をサポートするためでもあるが、おそらく中途半端にブラウザの機能に頼ってデータモデルからビューへの投影にノイズが含まれるよりは、 Angularという世界に閉じた一気通貫なフローを採用して、ブラウザとのコミュニーケーションを最小限にしたかったのも大きいと思う。 というか、Native ScriptとかWeb WorkerとかSSRとか、クロスプラットフォームにビューエンジン作ろうとするとそうなるしかない。
一応Angular贔屓の人間として言っておくと、AngularがVirtual DOMではなくDOMを直接使っているのは、この記事でも触れられているセマンティックの問題へのアプローチでもある。 Reactは今のところ、すべてのコンポーネントは最終的にHTML標準の要素に行き着くので、生成されるDOMにセマンティックは残らない。次元がいくつか落ちた写像になる。 しかしAngularの場合は、コンポーネントはそのままDOMに直結するので、カスタム要素(Web ComponentsのCustom Elementsではない)が残る。ブラウザ標準の機能を使ってないけども、結果的にWeb Componentsと同等のセマンティックなビューが得られる。吐き出されたDOM上にセマンティックが残る。クローラがWeb Componentsをどうするのかわからない今だと「だから何だ」という感じだと思うけど、この違いは認識しておいたほうがいい。投影する際の次元の落とし方が違う。
何がいいたいかって言うと、現代におけるブラウザ上でまともなアプリケーション作る場合、Virtual DOMないしそれに類する「DOMを知らなくて済む層」というのは現実的に必須で、それがVirtual DOMかHTMLパーサ+レンダラかどうかは瑣末な問題で、結局ブラウザ上にレンダリングエンジンを無理やり増設している。どうやっても歪になる。Webフロントエンドはそんなもんだ。
なので、ブラウザが再実装されるべきじゃないか、に対しての僕の意見は完全に同意である。今月Chrome Dev Summit行くので、アプリケーションプラットフォームとしてのWebブラウザに限界を感じていることを誰かChromeの人と話せればいいと思っている。以上。