余白

https://blog.lacolaco.net/ に移転しました

「やはりHTML/DOMは再発明されるべきじゃないか」に対する感想

mizchi.hatenablog.com

エモにはエモ。

わかる

だいたいわかる。そもそも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をどうするのかわからない今だと「だから何だ」という感じだと思うけど、この違いは認識しておいたほうがいい。投影する際の次元の落とし方が違う。

f:id:lacolaco:20171002093153p:plain

何がいいたいかって言うと、現代におけるブラウザ上でまともなアプリケーション作る場合、Virtual DOMないしそれに類する「DOMを知らなくて済む層」というのは現実的に必須で、それがVirtual DOMかHTMLパーサ+レンダラかどうかは瑣末な問題で、結局ブラウザ上にレンダリングエンジンを無理やり増設している。どうやっても歪になる。Webフロントエンドはそんなもんだ。

なので、ブラウザが再実装されるべきじゃないか、に対しての僕の意見は完全に同意である。今月Chrome Dev Summit行くので、アプリケーションプラットフォームとしてのWebブラウザに限界を感じていることを誰かChromeの人と話せればいいと思っている。以上。