世界を動かす技術を、日本語で。

基本原則から考えるDOMの再考

概要

  • DOM とその周辺APIは時代遅れで肥大化
  • Webアプリ開発 ではDOMの直接操作を避ける傾向
  • CSS は直感的でないレイアウトモデルと複雑な継承
  • SVG の統合は便利だが一貫性に欠ける
  • 新しい UIツールキット への転換が必要

DOMを原点から再考する

  • WebAssembly の普及でサーバー側は進化したが、クライアント側の DOM は10年前と大差ない現状
  • WASM からDOMアクセスが「解決済み」とされるが、そもそもDOMを使いたい理由自体が問われていない
  • DOMや関連APIを「引退」させるべき時期と主張
  • Chrome のdocument.bodyには350以上のプロパティやメソッドが存在、さらにCSSプロパティは660にも及ぶ現状
  • プロパティとメソッドの区別が曖昧で、getterがレイアウト計算を引き起こすことも
  • 古いイベントプロパティなど、レガシーな機能が多数残存
  • DOMは肥大化し続け、Webページ制作者とWebアプリ開発者で問題意識に差
  • 多くの開発者はDOMの直接操作を避け、JSフレームワークを利用
  • DOMの宣言的な機能(innerHTMLなど)は現代UIパターンに適合しない
  • 同じことを実現する方法が多すぎ、どれも洗練されていない

Web ComponentsとDOMの限界

  • Web Components はネイティブなコンポーネントモデルだが、普及せずAPIも扱いづらい
  • Shadow DOMは新たな入れ子・スコープ問題を導入
  • DOMの本質的な問題はSGML/XML由来の「文字列型」中心設計
  • React系フレームワークはこの問題を回避
  • 状態管理をDOMに持たせるのは不適切と認識
  • HTML自体は10年以上本質的な進化がなく、ARIAのみが目立つ変化
  • セマンティックHTMLの理想は未達成で、明確な設計指針が不在
  • HTMLの管理はWHATWG(ブラウザベンダー主体)に移行し、ビジョン不在のまま小手先の改良が続く
  • CSSもテンプレート言語的な方向に拡張され、複雑化
  • contentEditableの実用化は困難、Google DocsやNotion開発者も苦戦
  • プログレッシブエンハンスメントやマークアップとスタイルの分離という旧来の価値観は失われつつある
  • 現代のWebアプリはHTML/CSS/SVGを無理やりUIツールキット化しているが、巨大なオーバーヘッドと非効率

CSSの本質的な問題

  • CSS のレイアウトモデルは直感に反し、制約解決型と誤解されがち
    • 例: 親要素の高さが未定義の場合、子要素のheight: 50%は無効
  • CSSのレイアウトは「外から内(outside-in)」と「内から外(inside-out)」の2パス制約伝播
    • outside-in:アプリケーションフレーム等、親がサイズを決定
    • inside-out:テキストや段落など、子が親を伸ばす
  • CSSはデフォルトでinside-out、outside-inは明示的に指定が必要
  • flex box(display: flex)は自動レイアウトに便利だが、内部的には2回レイアウト計算が必要で複雑
    • contain: sizeやflex-basisで再帰的依存を回避可能
  • containやwill-changeなどの新機能はレイアウト最適化に寄与するが、DOM全体の制約伝播を部分的に断ち切る
  • CSSは本質的に「文書指向」であり、アプリケーションUIには不向きな設計

CSS・SVGの「良い部分」と設計上の問題

  • flex boxは理解すれば直感的で強力、グリッドレイアウトも同様だが記法が複雑
  • 本来なら「外から内」「内から外」を明示的なコンテナ・配置モデルで分けるべき
  • CSSは「リッチテキスト用の継承型スタイル」と「ブロック・インライン要素のレイアウトシステム」が混在
    • font-sizeなどは継承するが、borderなど大半のプロパティは継承しない
  • emスケーリングは論理ピクセル・デバイスピクセルの概念に置き換えられ、現代では重要性が低下
  • SVGはDOM統合で動的描画やアイコンスタイル調整に有用
    • ただしCSSと完全な互換性はなく、座標の文字列化など独自仕様あり
    • CSSもSVG的な機能(角丸、グラデーション、マスク等)を取り入れるが不十分
    • SVGはポリゴンヒットテスト等、CSSでは不可能な機能あり

レイアウト・API設計の課題

  • HTML/CSS/SVGの使い分けは特有のトレードオフが多く、一貫したUI構築が困難
  • 例示される問題点:
    • text-ellipsisは段落全体の省略不可、テキスト計測APIも不十分
    • position: stickyは本来簡単なはずが、実際は複雑な入れ子構造が必要
    • z-indexは絶対値指定で、相対的なZ階層管理ができず「z-index戦争」が発生
  • いずれもv1仕様のまま本質的なプリミティブ提供に至っていない

まとめ:新しいUIツールキットへの転換

  • DOMは時代遅れ、CSSは部分的に有用だが設計上の限界
  • SVGは必要悪的存在
  • 全体として、現行のWeb UI基盤は抜本的な再設計が必要
  • 新しいUIツールキット・API設計への転換が求められる

Hackerたちの意見

うーん、この記事はDOMについての正しい事実を述べてるけど、結論はめちゃくちゃ間違ってるね。ほとんどの開発者は、ずっとDOMを扱うのが怖いと思ってる。こういう非合理的な感情は新しいものじゃない。理由は全然わからないけど、ツリーモデルが大学で学んだ開発者たちをめちゃくちゃ怖がらせてるのが不思議。コンピュータサイエンスの教育ではデータ構造やツリーモデルにたくさんのエネルギーを使ってるのにね。それに、WASMについての会話もさらに奇妙になる。ほとんどの大学卒の開発者はDOMを恐れてる。そう、感情としての恐怖で、完全に非合理的。これについては、15年以上フルタイムのJS開発者として見てきたから信じてほしい。開発者たちは、無駄な抽象化でDOMから逃れようとしてるけど、なぜそうするのか自分でもわからないことが多い。彼らはその非合理的なことを隠すために多くのエネルギーを注いでるんだ。他の開発者は、この感情の悪夢を受け入れずに、WASMがJSを置き換えてくれればいいのにと思ってる。これが問題なのは、WASMをデプロイするのにJSやDOMと関わる必要がないけど、WASMは含まれているウェブページを無視するサンドボックスだから、全くの置き換えにはならないってこと。WASMが置き換えになるためには、含まれているページへの完全なDOMアクセスを得る必要がある。ブラウザメーカーは明確なセキュリティ上の理由からそれを拒否してる。だから、開発者たちは無駄な抽象化でDOMから逃れようとし、他の開発者はまだ恐れていることに気づかずにそのものを受け入れようとしてる。これって本当に変だけど、ソフトウェアがどうなってるのか不思議に思う非開発者にとっては面白い話になるね。

ブラウザメーカーは明確なセキュリティ上の理由からそれを拒否してる。だって、あくまでJavaScriptだけがそんなにひどくやらかすべきなんだから。

DOMを直接扱うのが難しい理由は、ある状態から別の状態に移行するために任意のパッチを実装しなきゃいけないから。Reactのようなフレームワークの全てのポイントは、その問題を避けるために自動的にパッチを作成して適用してくれることなんだ。これは非合理的じゃないよ。むしろその逆だね。

3年前にウェブ開発のビジネスを閉じたんだ。ウェブに関わる多くの人が、どうやって全てが機能するのか理解するための努力をしたくないと感じてるのに気づいた。彼らは「それ」をやるためのライブラリがどこかにあるはずだと思ってるけど、実際には標準のコンポーネントや機能を使えば簡単にできることなんだ。もう一つの問題は、過去のことに基づいて恐れを抱いている人たちがいること。確かに、ウェブで派手なことをするのはもっと難しかったけど、彼らは往々にして、昔はできなかったことをウェブにやらせようとしてる。今は基本的な組み込み機能を使えばできるし、その方が簡単なことが多いよ。

WASMがDOMアクセスを持たない理由は、多くの最近のDOM APIがJavaScriptオブジェクトやクラス(イテレータなど)を返したり期待したりするから。だから、DOMとWASMの間には薄いJSのグルーラッパーが必要になる。セキュリティは関係ないよ。パフォーマンスを除けば、WASM+最小限のJSグルーで、JSができることはすでに何でもできるから。

WASMが置き換えられるためには、含まれているページへの完全なDOMアクセスを得る必要がある。完全な置き換え、つまり全くJavaScriptが必要ない状態になるには、WASMがDOMにアクセスできる必要がある。でも、JavaScriptの代わりに書く言語として置き換えるためには、DOMバインディングを簡単に生成できるから、JavaScriptを介してトランポリンすることができる。これをWASMが登場して以来、みんなやってることだよ。WASMに直接DOMアクセスを与えることは新しいことを可能にするわけじゃなくて、単にJSバインディングをスリム化して、時間やメモリのパフォーマンスを改善する可能性があるだけ。> ブラウザメーカーは明確なセキュリティ上の理由からそれを拒否してきた。実際、彼らはそれを実現するためにかなりの道のりを進んでいる。正しく行うために時間をかけているだけで、これまでに少なくとも3つの異なる方向に進んできた。でも、最初からそれが最終的な目標であることは明らかだった。

なぜかわからないけど、ツリーモデルは大学教育を受けた開発者を怖がらせる。ツリーモデルを「怖がる」人はほとんどいないよ。DOMを扱う問題は、以下のようなことがあるから。 - 90年代のJAVAのように冗長で扱いにくいAPIで、最も簡単なことをするのに大量のボイラープレートが必要 - 自分のことを簡単にできるほど低レベルでもなく、既存のビルディングブロックから必要なものを作るには高レベルすぎる非常に貧弱なAPI - 完全に非合成的なAPI - 何かをするのを妨げるレンダリングシステムで、要素のボーダーを変更するだけでページ全体の再レイアウトを引き起こす可能性がある数百の落とし穴やコーナーケースに気を配らなければならない - 静的なウェブページ以上の複雑なものには非常にパフォーマンスが悪いレンダリングシステム(それすらもかろうじてこなしている)。人々が示す「驚くべきパフォーマンスの偉業」は、非常に注意深くコーディングされたものか、他のツールキット(例えば、canvasやwebgl)と同じ技術を使っているか、他の何かにとっては絶対的な基本条件だよ。先週のフロントページの記事では、3つの長方形をアニメーションさせるのに60%のCPUと25%のGPUが必要だったって書いてあった。https://www.granola.ai/blog/dont-animate-height > だから、DOMから逃げるために無駄な抽象化を使ってキャリアを投資する人が出てくる。過去15年ほどの抽象化は、DOMが非常にパフォーマンスが悪く、母親ですら愛さないようなAPIだから、DOMから逃げようとしてきたんだ。

よくみんながDOM、HTML、CSSがどんどん複雑になってるって嘆いてるよね。垂直センタリングや仮想化のような簡単なタスクでさえ難しいし、600以上のCSSプロパティ、たくさんのJavaScriptメソッド、漏れ出る抽象化、{ contain: size }。多くの問題には同意するけど、現実的にどうやって複雑じゃなくなるのか想像するのも難しい。もしそれが一つの非常に良く考えられたビジョンの結果で、開発者たちが最新のAPIに従うことを期待されていたら(AppleのiOSランタイムみたいな)、タグの使い方が一つに決まって、無駄がすぐに削ぎ落とされて、機能が非推奨から消えるのも早いかもしれない。でも、実際には多くの委員会によって設計された製品で、数十年にわたって後方互換性を維持してきたし、基本的にはハイパーリンクされたドキュメントレイアウトエンジンから成長した無料のランタイムで、今ではネイティブアプリに匹敵する完全にダイナミックなアプリケーションを動かしてる。それでも新しい開発者にとってはかなりの敷居が低いから、驚くほど頑丈なんだ。確かに、簡単そうな機能に対して大量のマークアップが必要なアプリもあるけど(Slackの入力ボックスの例とか)。でも、代わりにブラウザベンダーがすべてを組み込んでしまったら、すべてのアプリが彼らが正しいと思う方法に縛られてしまう。ある程度の混沌は健康的かもしれないね。

現実的にどうやって複雑じゃなくなるのか想像するのも難しい。簡単だよ。2つの標準が必要だった。1つは「アプリケーションのためのウェブ」で、VM、標準ライブラリ、バイトコード、RPC、UIフレームワーク、コントロールの標準ライブラリに基づいて構築されているもの。そしてもう1つは「ウェブページのためのウェブ」で、これはHTML5以前の時代には解決済みの問題だった。JavaやFlash(セキュリティの観点からは非常に問題があるけど)は、「アプリケーションのためのウェブ」を構築するための基盤としてHTML5+/CSS3+/JS/WASMよりも良かったかもしれないけど、GoogleやMicrosoft、MozillaがOracleやAdobeにその鍵を渡すのは耐えられなかったんだ。すべてが政治的なもので、結果的にすべてが悪化して、より複雑で非効率的になってしまった。

ウェブは複雑なアプリケーションに合わせて成長してきたけど、プラットフォーム自体も無駄に膨れ上がってるよね。新しい機能(例えば、Canvas提案のHTMLみたいな)を、すでにバラバラなパズルに無理やり押し込まなきゃいけないから。後方互換性は、技術的な成果というより理想的な名誉のバッジになっちゃった。この記事は、ウェブの有機的な成長にもかかわらず、実際にはそれほど頑丈じゃない技術的な部分に触れていて、いい仕事してると思う。盆栽も時々剪定が必要だしね。正しい方法が一つだけってことはないけど、Flashの時代からインターフェースの設計方法はかなり収束してきたから、少なくとも「大体合意された方法」で会話を進められるようになった。

確かに、いくつかのアプリケーションは、シンプルな機能に対して大量のマークアップを持つ傾向がある(Slackの入力ボックスの例みたいに)。でも、代わりにブラウザベンダーが全てを組み込んじゃうと、すべてのアプリが彼らが正しいと思う意見に縛られちゃう。ある程度の混沌は健康的かもしれない。あるいは、すぐに使える機能を提供するコントロールのセットを用意して、便利なAPIを提供して、みんながそのコントロールを拡張したり、自分のものを作ったりできるようにすればいい。ウェブプラットフォームはどちらも提供してない。これを、太陽の下にある他のすべてのUIツールキットと比べてみて。90年代のTurbo Visionは、ウェブが提供するものよりもずっと優れたツールキットだったよ。

垂直センタリングについては、20年前にこれを試したときは本当に面倒だった。レイアウト全般が過去20年で大幅に簡素化されたことを考えると、当時はすべてがテーブルに詰め込まれていたことを思い出すよ。だから、「DOM、HTML、CSSがどんどん難しくなっている」と言われても、そのアマチュアで根拠のない意見は無視していいと思う…ハハ!

問題は、DOMがページレイアウトを記述するには全く不十分で、Webアプリケーションにはさらに不十分だってこと。DOMへの段階的な変更は、この目標により適したものにするために意図されていたけど、根本的に悪い基盤があったから、あまり助けにはならなかったと思う。ページレイアウトを記述するには、何らかの制約言語の方がずっと良かっただろうし、Webアプリケーションのようなものは存在すべきじゃない。これらは、データの移動にはインターネットを利用しながら、ネイティブUIツールキットを使うアプリケーションであるべきだ。ユーザーは、ブラウザが便利な機能を制限するため、Webアプリケーションに不満を持つことが多いし、プログラマーは簡単なことを達成するために回避策やブラウザの膨張に苦労している。

同意。最初からプリミティブがちゃんと考えられてれば、もっと良かったと思う。HTML5の入力やフォームのバリデーションは、今でも壊れた悪夢で、たくさんのJavaScriptを追加してもほとんど修正できないよ。

この複雑さの多くは、プリミティブがウェブアプリのユースケースにはあまりにも原始的すぎるからだと思う。ドキュメントには問題ないけど、ウェブアプリでは砂粒から建物を作ろうとしてるみたいなもんだよ。ルーブ・ゴールドバーグマシンは避けられないよね。ブラウザは、最小限のテーマで機能的なウィジェットを提供して、ほとんどJavaScriptを必要とせず、CSSで完全にスキンできるようにするべきだと思う。それだけで信じられないほどの複雑さがなくなるし、うまくやればウェブ開発の体験がずっと快適になるよ。

うん、個人的にはDOMは結構良いと思うよ。APIの表面的な部分に関する不満もあるけど…例えば、プロパティとメソッドの境界が曖昧で悪用されてるとかね。でも、これらは本当に表面的なポイントだと思う。DOMは宣言的なアプリケーションを作るためだけのものだとは考えられないし、命令的な機能もサポートする必要があるよね。個人的には、カスタムWebコンポーネントAPIが宣言的な問題をすごくうまく解決してると思う。Reactや他の宣言的なフレームワークよりもずっとスッキリしてるし。DOM APIがユーザーのニーズに合わせてゆっくり進化してきたのは素晴らしいことで、下から上に再設計すればもっと良くなるなんて考えるのは愚かだと思う。文句を言ってる人たちは、ユートピア的な考え方に囚われてるんじゃないかな。彼らは特定の視点を持っていて、自分たちに関連する限られたユースケースのレンズを通してDOMを見てる。彼らは「関数型プログラミング、サイドエフェクト、リアクティビティ」みたいな概念に対して固い信念を持ってるけど、これらの信念はそれぞれの概念に孤立してる。複数のアプローチの交差点が問題を変革し、方程式を根本的に変えることができるって事実を無視してるんだよね。例えば、Webコンポーネントのモジュール化や関連するライフサイクルメソッドは、コンポーネントの境界内での命令的プログラミングの危険を大幅に減らしてくれる。強酸と強アルカリ溶液がそれぞれ危険なのは知っておくべきだけど、混ぜることでその事実が完全に変わる可能性があることも認識すべきだよ。

30年前のVisual Basicは、もっとシンプルな開発環境だったよね。WASMで似たようなものが出てくると思ってたけど、まだ待ってるところ。

僕は埋め込みデバイスでUIレイアウトやアニメーションをCで手書きすることが多いんだ。HTMLやCSSもよく使うけど、時々は自分でレイアウトコードを書くシンプルさが好きだな。そうすると、基本的にX/Y座標、アンカーポイント、画面や要素のサイズだけあればいいから、あとは簡単な算数で済むんだよね。これの良いところは、CSSでやることの95%を、一貫した方法でできるってこと。初心者には座標系で考えることを教える必要があるけど、そのシンプルさは新鮮だよね。一方でCSSは、自然に成長した複雑な機能があって、時には簡単なはずのことが難しくなることもある。スタイルを当てるべき要素には、知らないうちに微妙な違いを持つデフォルト属性があるからね。display: inline、block、inline-block、contents、flex、grid、table、table-column-groupなどの違いを教えられる人は少数派だと思う。でも、要素にはデフォルトでそれが設定されてることもあるんだよね。CSSを後方互換性の理由で簡素化するのが難しいのはわかるけど、時々は誰かが上に追加するのではなく、エレガントで一貫性のある解決策を考えてくれたらいいのになって思う。

著者とは逆の立場を取りたくなるね。ウェブというプラットフォームは大成功を収めていて、その理由を考えるのは面白い。確かに「緩い」標準が素晴らしいハックを促進して、それがいつの間にかベストプラクティスとして定義されて、標準化されたんだろうね。もしかしたら、無駄を省きたいと思わせるかもしれないけど、a) 人々は以前にも何度もそう考えたかもしれないし、b) 後方互換性は思っている以上に価値があるかもしれない。

ウェブをプラットフォームとして「大成功」と言うのは控えめすぎるよ。あまりにも成功しすぎて、ウェブ開発をしている95%の人は、こういった議論に興味がなかったり、意見を持っていなかったりすると思う。「沈黙の」ユーザーの規模は、積極的な開発者と比べて最も驚くべき数字になるだろうね。「最初の原則からDOMを再考する」っていう人に対して、eコマースのHTMLテンプレートを編集したり、結果をテーブルやデータビジュアライゼーションにエクスポートしたり、内部システムのために小さなUIを作ったりしているランダムな人たちが1万以上いるんじゃないかな。

基本的に何でもできるシステムとして、HTMLはかなりよく設計されてると思う。そして、そんなに長い間後方互換性を保ってるのは大きな成果だし、いいことだよね。もし時間を巻き戻して、今の知識を持ってたら、固定要素やユーザーエージェントスタイリング、ハードコーディングされた制限の代わりに、修飾子を重ねられる任意のノードのシステムを作ってたと思う。だから、.を使う代わりに、を使う感じ。これで、基本的には同じだけどかなり違うCSSプロパティを最小限に抑えられるし、HTMLタグもかなり減らせる。具体的には、をで囲むんじゃなくて、ReactやVueがコンポーネントシステムで始まったのと似たような感じだけど、UnityのGameObject & Componentシステムみたいなことを考えてる。

要素に任意のタグを作れるし、CSSで見た目を定義するまでスパンのように扱われるよ。特徴 { display: block; padding-left: 1.5em; list-style-type: disc; } 特徴 { display: list-item; } 技術的には、名前空間の問題を避けるためにカスタム要素にはダッシュを付けるべきなんだけど、もしそうなったら簡単に検索して置き換えられると思う。これ、XMLではすごく役立つよ。

開発者たちは、ドキュメントに状態を保持するのが不十分だってことを学んだんだよね。ウェブ開発者たちは状態をドキュメントからJSの変数に移して、それ以来、膨れ上がった短命なゴミをその変数の上に積み上げてきた。実際にドキュメントに状態を保持すると、かなりシンプルになるよ。スクリプト自体はステートレスになって、お互いに直接依存しなくてもよくなる。データはCSSセレクタを使ってページ全体でクエリできるし、データに対する多くの視覚的変換もCSSで処理できる。インタラクションを処理するためのイベントのシステムもちゃんと整備されていて、ユーザーの変更やAJAX、WebSocketを別々に扱う必要がなくなる。F12を押して要素タブで状態を動的に確認したり変更したりできるようになるんだ。ドキュメントやレイアウトの扱い方についてもっと良い方法を想像するのは確かに可能だけど、JSフレームワークが状態を扱うのを見ていると、この面での「改善」が怖くなるよ。

プレゼンテーションとデータを混同するのは、古典的な悪手って感じだね。プレゼンテーションの変更がビジネスロジックを壊しちゃうから。

同意だね。状態をドキュメントから移すっていう考え方は、ちょっとイライラする。データの木構造の目的は、状態をデータとして保存することじゃなかったの?

みんな状態を文字列化してるの?

最初に取り組んだAjax/jqueryアプリは、DOMに状態を保存し始めたら、すごくシンプルになってバグも減ったよ。トグル操作で状態の変化を見逃すのが簡単すぎて、UIがAPIとは正反対の状態になっちゃうことがあるからね。

DOMが好きなんだよね。みんな、レスポンシブデザイン(モバイルとデスクトップで動くこと)やプライバシー、使いやすさに関する小さな詳細を忘れがちだと思う。IMEや辞書、スペルチェックとか…これらはすべてテキストエリアで起こることなんだ。もし自分で実装するなら、ウェブページのキャンバスでやることになるけど、これらを提供することはできない。例えば、何かをスペルミスしたら、ブラウザはユーザーの辞書でその単語を調べられるけど、あなたのページはユーザーの辞書を覗くことがプライバシーの問題になるから無理なんだよね。とはいえ、非DOMフレームワークが欲しいなら、驚くことにGoogleがすでに提供してるよ。それがFlutterで、キャンバスを使うオプションがあって、DOMは使わない。大きな複雑な例はhttps://earth.google.comで見られるよ。そこに行ってNYCを入力してみて。地球の上にテキストや画像がポップアップするのが見えるから。ツールバーやメニュー、ステータスバーも見えるよ。設定をクリックしてみて。表示されるものはすべてキャンバスだよ。データレイヤーのアイコンをクリックしても、表示されるものはすべてキャンバス。上記の理由から、検索入力ボックスを入力要素にしたのはやっとだけど、残りはキャンバスだね。また、キャンバスベースの入力があるからこそ、Google Docsが絵文字や非英語入力に苦労してるのもあるんだ。

Flutterは、現代のハードウェアの動物園のような環境で、モダンなクロスプラットフォームアプリを作る問題への応答として素晴らしい。80年代のテキスト組版エンジンは、明らかにそれには適してないよね。過去20年間の開発者の大多数がHTML/JS/CSSスタックからキャリアをスタートさせたのは間違いないし、彼らがそれを好む理由も理解できる。でも、どんなに抽象化を重ねても、このスタックがアプリ作りに向いているわけじゃないよ。

また、キャンバスベースの入力があるからこそ、Google Docsが絵文字や非英語入力に苦労しているのもあるんだ。これは問題があるのはそれだけじゃないよ。地球の地図ビューを開いて数クリックしただけで、明らかに壊れたUIパターンを見つけたことがある:- 右クリックがどこでも機能しない(入力ボックスを除いて)、他のGoogleサイトで直接対応する要素(アカウントスイッチャーなど)があるにもかかわらず、- アカウントスイッチャーをクリックすると、それが開いている間はサイトの他の部分がマウスイベントを無視する。マップ画面をドラッグしようとしてもスイッチャーは閉じないし、ボタンにホバーしてもカーソルが変わらない。

Flutterは、初めからHTMLと同じくらいアクセスしやすいの?それともWin32やMacOSのAPIと比べてどう?

しばらくの間、ネイティブ開発(WPF/WinUI/SwiftUI、Win32やAppKitから始めて)を見てきたけど、正直ウェブ技術の方がずっと良いよ。クロス互換性があるっていうのは、ただのオマケみたいなもんだね。もしWASMがDOMを操作するための安くて簡単な方法を手に入れたら、もっと多くのものがElectronや将来的にはTauriのようなウェブ技術に移行すると思う。

全く同意だよ。ネイティブアプリが優れていると感じる人たちの気持ちがわからない。私たちが持っているウェブ技術は、開発者の体験とUXの観点から見ても素晴らしい。みんなElectronアプリを嫌うけど、これは主にElectronの膨張のせいだと思う。Tauriがそのギャップを埋めてくれることを願ってる、今のところは最高だよ。

DOM自体は、要素の木構造としてはそんなに悪くないよ。CSSも全体的には悪くない。問題はAPIだと思う。モジュール化されてないから、混乱を招いてる。モジュール化する選択肢としては、DOMやインターフェース/ビヘイビアの概念を使うべきだね。相続ではなくて、巨大なマップを避けるために。例えば、別の「textarea」インターフェースを持つことができるかも。element.tagName ... あとはDOMの木構造メソッド ... element.textarea // 挙動の特定インターフェース element.textarea.select(startEnd) // インターフェースメソッド element.textarea.selectionStart // インターフェースプロパティ element.textarea.selectionEnd // インターフェースプロパティ element.textarea.rows // インターフェースプロパティ element.textarea.columns // インターフェースプロパティ ... CSSのあの巨大なフラットテーブルは悪夢だよ。サイズだけじゃなくて、拡張性の問題もあるからね。例えば、すべてのCSSグリッド関連のプロパティは、自分の名前空間に入れるべきだと思う。section { color: red; // ... あと基本的なCSS 2.1プロパティ display: grid( rows: ...; columns: ...; align-items: center; justify-items: start ); } だから、異なるレイアウト(例えばdisplay:flex()やdisplay:waterfall())はそれぞれ独自の行や列を持てるようにするべきだね。早くそうするほど良いよ。APIは崩壊寸前だし、組み合わせの爆発が起きそうだね。

それが重要なの?Elementオブジェクトに対してfor..inループを回してるわけじゃないし。

DOMは大きすぎて複雑すぎる。APIや概念が多すぎるんだ。でも、新しいAPIを追加して新しい概念をたくさん作っても、問題は解決しないよ。単に大きくて複雑になるだけ。新しい、クリーンでモダンなAPIの中で完全に生きられるものもあるかもしれないけど、他のほとんど(ほぼすべて以前のものを含む)は、新しいものを無視するか、取り入れる必要がある。そうすると、うまく連携できないものを橋渡ししたり、組み合わせたりするコストがかかる。新しいものを追加する前に、古い悪いものを実際に取り除く方法を考えた方がいいと思う。

これって、実際にやってみると、現状がどうしてこうなってるのかがすごくわかるリライトの一つみたいだね。HTMLやDOM、SVG、CSSは好きなんだけど、ちょっと粗い部分もある。半分は、前に誰かが全体をリライトしようとした時に残ったもの(名前空間を意識したDOMメソッドとか)だね。