2 ポイント 投稿者 GN⁺ 2023-11-13 | 1件のコメント | WhatsAppで共有
  • ブラウザが標準で提供するネイティブ機能をまず使えば、Webアプリを作る際に追加の言語やツールチェーンに依存する範囲を減らせる
  • ReactはpropsstateコンポーネントのようなパターンでUI開発の信頼性を高めたが、開発の中心をHTMLからJavaScriptへ移した
  • その間にW3C、WHATWG、IETF、TC39はWebの基本言語に数千もの改善を加え、主要ブラウザがそれを統合したことで、Reactが必要とされた理由の一部は弱まった
  • HTML FirstはReactに満足している開発者を説得するというより、HTML中心のアプローチに関心のある人が考えを整理し、同僚と議論するための言葉を提供しようとする流れである
  • Webの基本言語とブラウザ機能だけでも、高速でアクセシブルなソフトウェアを作れるのかを改めて問い直そうという、実務的な問題意識に近い

HTML Firstが目指す開発スタイル

  • HTML FirstはWebソフトウェアを作るとき、HTML、CSS、JavaScriptとブラウザのネイティブ機能を優先する
  • 核心は、Webプラットフォームの上に追加される抽象化レイヤーを減らすことにある
    • 追加の言語やツールチェーンも、減らすべきレイヤーに含まれる
  • 目標は、ブラウザがすでに提供している機能を中心に据え、必要な場合にのみその上にツールを載せる開発スタイルである

React以後に複雑化したWeb開発

  • React以前は、インターフェースをHTMLで書き、HTMLが標準でサポートしていない部分をjQueryのようなツールで補うやり方が一般的だった
    • 代表的な例は非同期リクエストの送信とDOM更新である
  • Reactのようなライブラリは、従来のWeb開発におけるさまざまな問題を解決した
    • 親要素から子要素へデータを明示的に渡すpropsstateのパターンは、特定種類のバグを減らした
    • UI、スタイル、動作をコンポーネントとして束ねることで、他人が作ったものを自分のコードベースへ簡単に導入できるようにした
  • こうした利点を得るには、主にHTMLを書く方式から、主にJavaScriptを書く方式へ移行する必要があった
    • JavaScriptはより複雑な言語として扱われる
    • Reactが導入した多くの概念やツールも合わせて学ばなければならなかった
  • 業界は複雑さが増したにもかかわらずこのトレードオフを受け入れ、こうしたライブラリはWebアプリを作る基本的な方法になった
    • React以前の新規開発者はHTMLとCSSを先に学び、その後でJavaScriptを学んでいた
    • React以後はJavaScriptとReactを先に学び、その後に残りを学ぶ流れへ変わった

Webプラットフォーム改善がもたらした再検討の契機

  • W3C、WHATWG、IETF、TC39は、React型の手法が広がるあいだに、Webのネイティブ言語へ数千もの改善を追加した
    • これらの改善はChrome、Safari、Firefox、Edgeに統合された
    • その多くは、人々がReactを使っていた理由の一部を直接扱っている
  • ソフトウェア開発コストが上がり、ブラウザ改善が広く展開されるにつれて、追加されたレイヤーが今でも本当に必要なのかと問う人が増えている
  • HTML Firstの考え方は、まだ業界では少数派に属する
  • このアプローチは、すでにHTML中心の開発に関心を持つ人が、自分の考えを強固にし、同僚と意思疎通するための言葉と概念を得るのを助けることに焦点を当てている
  • 核心的なメッセージは、Webのネイティブ言語と機能を主に使うだけでも、美しく、高速で、使いやすく、アクセシブルなWebソフトウェアを作ることは可能であり、実用的で、合理的だということである

1件のコメント

 
GN⁺ 2023-11-13
Hacker Newsの意見
  • ここのアイデアは気に入っているが、正直 例が弱い
    「可能ならスタイルと動作をインラインのHTML属性で定義せよ」という部分の例は、実際には動かなさそうだし、スタイルをさらに追加しようとすると、ClassList.addに渡す文字列パラメータだけがどんどん大きくなる構造になる
    個人的には button:active { background: green; } のほうがずっと読みやすいが、筆者は「動作の局所性(Locality of Behaviour)」というアプローチのために、これを複雑だと見ているようだ
    「ライブラリが必要なら、JavaScriptやカスタム構文中心ではなくHTML属性を活用するライブラリを使え」という話には同意するが、推奨例の「on input put me into #output」は、悪い例として挙げられているライブラリよりも不自然で、単にフレームワークなしのJavaScriptでも十分に見える
    「HTMLにコンパイルされる隠れたレイヤーより『生の』HTMLを好め」という例としてRailsのERBタグヘルパーを使うなと言っているが、これらのヘルパーは、最小限のテンプレートで直接書くとかなり汚くなるものをいろいろ処理してくれる。例では、一意なDOM ID、Turboタグ、繰り返し処理のような現実的な部分が抜け落ちている

    • 「可能ならスタイルと動作をインラインのHTML属性で定義せよ」という部分は自分も引っかかった
      スタイル設定と動作は分離されるべきで、両者は参照だけでつながるのが、意味のある規模では唯一筋が通る
      技術的には1つのPythonアプリにすべてのSQLデータベース接続とハードコードされたSQLを長い1ファイルに入れることはできるが、それが悪い習慣であるのと同じように、この原則も似て見える
  • この部分が混乱する: 「ライブラリが必要なら、JavaScriptやカスタム構文中心ではなくHTML属性を活用するライブラリを使え」
    ところが推奨例として _hyperscript [0] を示している。これは カスタム構文中心のライブラリであり、HTML属性の中に新しく覚える必要のある言語のスクリプトを入れているだけだ。本気なのか分からない
    [0] https://hyperscript.org

    • これは hyperscriptの宣伝用Tips一覧として書かれたように見える
      例もかなり弱い。素朴な解決策、つまり最初のTipsだけでも同じようにうまくいく
    • 同意。_ という属性に難解なDSL文を値として入れる例は、本当に奇妙で分かりにくく見える
      むしろ明示的な onclick や他のイベント属性の中に素のJavaScript文を入れて、何が起きるのかすぐ分かるほうがよさそうだ
    • 筆者の助言に従うなら、Alpine.js のほうがより良い推奨だったはずだ。HTML属性と直感的なJavaScriptを使うからだ
    • hyperscriptはHTMXと関連しているので持ち上げたい人たちがいるようだが、自分の考えでは 面白いおもちゃ に近い
    • 筆者が推奨例と非推奨例を取り違えて入れた可能性もある
  • 趣旨は分かる。HTMLの 組み込み機能 を使うのはきれいで単純だ
    だが10年前も実用的ではなかったし、今もそうだ。htmxのようなものがReactのようなより重い解決策より特に優れているとも感じない
    こういうアプローチを見るたびに尋ねる質問はいつも同じだ。ドロップダウン、複数選択、日付ピッカーはどう見えるのか。ブラウザごとに日付ピッカーは存在するのか。はい。見た目と動作はブラウザ間で一貫しているのか。いいえ。スタイリングで揃えられるのか。これもいいえ
    複数選択も似ている。複数項目を選ぶためにShift/Ctrlクリックを要求するのは、ユーザー体験の観点では完全に駄目だ。標準要素はいまだにそう動作し、変更できない。複数選択だけでなく通常の選択要素も見た目がひどく、概して変更しにくい
    新しいフレームワークごとにこうした サードパーティ製コンポーネント が生まれるのには理由がある。組み込み要素だけでは十分ではないからだ。MDNのArrayページで組み込み機能が毎年増えても、自分のプロジェクトの90%がまだlodashに依存しているのと同じ理由だ。10年前より良くなったのは確かだが、まだ足りない

    • 日付ピッカーに限ってざっと考えると、Webサイトはユーザーのためにデザインするものだ
      ユーザーは異なるブラウザを使うかもしれないが、1人のユーザーは訪問するすべてのWebサイトで同じブラウザを使う可能性が高い
      だから自分の考えでは、日付ピッカーが1つのWebサイト内で全ブラウザにわたって一貫していることよりも、1つのブラウザ内で全Webサイトにわたって一貫していること のほうが重要だ。もちろんカスタム機能が必要なら話は別だ
    • 「複数項目を選ぶためにShift/Ctrlクリックを要求するのはUX観点で完全に駄目だ」というのは、複数選択をそうしてはいけないという意味なのか。そうなら、どうすべきなのか気になる
      リストから連続した10個や15個の項目を選びたいとき、現時点では Shift+クリック より良いUIをあまり知らない
    • 「見た目と動作はブラウザ間で一貫しているのか。いいえ」とは、昔は ネイティブのルック&フィール がデスクトップアプリの必須条件と見なされていたことを考えると妙だ
      すべてのWebサイトのUIコンポーネントがそれぞれ間抜けなスタイルを新しく発明するより、実際のサイトデザインを除けばブラウザのネイティブなルック&フィールに従ってくれたほうがずっと良い。もちろんブラウザ側も、それを見栄えよくすることに気を配る必要がある
    • 残りの議論を見ると、input 要素はインタラクション方式がブラウザごとに大きく異なることで悪名高く、ほとんどの他のHTML要素は代表的な動作が1つに定まっている
  • ほとんどの主張には同意するが、この記事は少し矛盾しているように感じる。Tailwindを勧めながら、同時に「ビルド段階を避けよ」と言っているからだ
    巨大な CSS/JS リソースを配布するのは、包摂性の原則にも反する。高速なインターネットや十分に高性能なコンピュータを持たない人も多い

    • 今は Tailwind を使っていないが、自分の経験では Tailwind が巨大な CSS/JS リソースを配布させることはなかった
      実のところ、Tailwind が出力するクライアント側 JavaScript についてはまったく知らない。最後に触ったのは 2.x なので、変わった点があるかは確かではない
      CSS のサイズについても自分の経験は逆で、Tailwind の出力は手書きの CSS よりたいていずっと小さかった
      もちろん素の CSS にも反対ではないが、それも少なくとも同じくらい簡単にひどい状態にできる
    • ビルド段階が不要なアトミック CSS ライブラリを作った。欲しい人がいればここにある。もちろんネタバレすると、誰も欲しがっていない: https://casscss.github.io/cass/
    • Deno Fresh は Twind を使ってビルド段階を避けている: https://twind.dev/
      ただし記憶では、完全な Tailwind が提供するすべての機能を提供しているわけではない。全体として Fresh は実質的に Preact と Twind の上に大きく構築されていて、まずそれらのライブラリを受け入れる必要があることを率直に示していない点がもどかしかった
    • Tailwind にはビルド段階として使えるスタンドアロン CLI がある
      この記事の文脈で勧めるには少し変だという点にはある程度同意するが、ビルド段階は極めてミニマルにできるし、成果物が依然として中身を確認できる CSS である点も良い
      個人サイトで Tailwind を使っているが、それ以外はすべて素の HTML だ。スタイルを書くときに CLI を監視モードで動かすのは、特に気にならない
    • ノービルドの選択肢としては 2 つが良い: Tailwind v3 CDN を自前でホストするか、https://github.com/gnat/css-scope-inlineを使うこと
      どちらも驚くほど速く、10,000 個以上でもパースできる
  • 理論や単純な例では面白いが、これを適用した大きなプロジェクトと、実際にどのような違いを生んだのかを見てみたい
    記事の前半にある目標は素晴らしいが、助言そのものには少し失望した。ごく基本的な状況以外でどう機能するのかがあまり見えず、その目標をどう達成するのかはなおさら分からない
    Web プラットフォームを最大限活用することには賛成だし、複雑さをできるだけ減らすことにも完全に賛成だ。しかし、これらの原則がそれを達成するかどうかにはかなり懐疑的で、むしろ同じことをする複数の方法を作って複雑さを増やす可能性もあるように見える
    善意で言えば、この原則を実際に検証したのか、それとも期待どおりに機能すると仮定しているだけなのか、このリストだけでは分からない

    • なぜ大きなプロジェクトに向いていなければ良い実践にならないのか分からない
      本気で尋ねている。人々はこの主張をよく持ち出すが、いつも理解できなかった
      自分の見方では、Web の 95% は小規模から中規模のプロジェクトだ。ほとんどの技術はここに焦点を当てるべきだ。単純なプロジェクトには単純な解決策を使い、複雑さは後から追加すればよい
    • 職場で HTML ファーストなスタイルのフロントエンドを推そうとしたが、普通のフロントエンド開発者を採用すると基本的に理解してもらえず、すべてを div で作り、VueJS にすべてのロジックとコンテンツを制御させたがった
      私たちが失った半ば客観的なものの一つはアクセシビリティだ。リンクをクリックイベントリスナー付きの div で不用意に再実装したせいで、サイトの大部分をキーボードで操作できない
      これはかなり心配だ。規制が来れば、私たちが捨てたものを取り戻すために慌てふためくことになる
      それでも、有名な「HTML ファースト」サイトの事例を見つけにくいという点にはある程度同意する。信じてはいるが、実際にうまく展開された事例は見たことがない。ただ、その理由は純粋に教育にあるのかもしれない。HTML が強力になった頃には、フロントエンド開発教育はすでにフレームワーク中心に深く固まっていた
    • jQuery より若いフロントエンド開発者なら、この助言どおりにプロジェクトを始めてみるのは、なぜ私たちがビルド段階のようなものを使うのか、そして HMR 以前の開発がどれほど大変だったのかを学ぶ良い機会になるだろう
      著者が実際に 2 人以上が参加し、現行ブラウザの 99% をサポートするプロジェクトでこれをやったようには見えない。また、自分のコードも実行していないようだ。私の画面が味わい深くないだけかもしれないが、onlick は div のハンドラではない
    • 私たちは古い教訓を忘れてしまった。バックエンドファーストは、目に見えるものだけを信じ、専門家を信じない人たちへの防御機構だった
      動いているように見えるが実際には動いていない製品を作ると、彼らは理解しない。すると、過大に約束して過小に提供する道へ追い込まれる
      単体テストのあまり知られていない利点の一つは、経営陣には見えないコードが接続される前に、より多くの品質保証を受けられるようにすることだ。最初の画面が出てからリリースまでの気まずい期間を縮めてくれる
    • 同意する
      1999 年に素の HTML、CSS、素の JS で最初の Web サイトを作り、Geocities でホストした
      その後、PHP/WordPress/Yii/Laravel、Ruby/Rails/Sinatra/Jekyll、React/Typescript、ClojureScript でサイトやアプリを作ってきた
      今では React、TSX コンポーネント、CSS-in-TS、Effects、Context が居心地のよい家のように感じる。ついに Web/フロントエンドのための完全なプログラミング言語が手に入った感覚だ。関数型・リアクティブプログラミングのような現代的原則の上に、フロントエンドのために明示的に作られた言語だ
      ようやくソフトウェア開発ができるようになった。それ以前の HTML、CSS、素の JS、PHP は、ただのハックに近かった。Rails はフルスタックには良かったが、フロントエンドで輝いたわけではない
      Web スタックがアプリにも対応できるようになったら、フレームワークを飛ばすつもりだ。今はサイトには十分かもしれないとは認める
  • 今年は諦めた。もはや、バンドラーやトランスパイラ、そして付随してくるありとあらゆるガラクタを抱えた React、Vue、Angular の怪物たちと戦い続けるのは不可能になった
    Node と npm は、作ってから数秒しか経っていないプロジェクトにさえ「深刻な脆弱性 7 件と致命的な脆弱性 8 件」があると投げつけてくる。何千ものファイルをダウンロードしなければならず、その中には boolean 値のラッパーみたいなものまで入っていることがある
    Python のバックエンドサーバーがフロントエンドも一緒に配信していた時代は、自分にとっては終わったように思う

    • 怒れ!機械に対して怒れ!
      実際のところ、あなたにも、ほかの誰にも、重たい JavaScript フロントエンドの肥大化は本当に必要ない。単に拒否すればいい
      バックエンドやキャッシュから軽量なページを配信し、どうしても必要なら気の利いた処理は CSS でやればいい
      高速なレンダリング時間と、世界中からのアクセシビリティを手に入れられる
    • 脱出ボタンを押そう。Web の良い点のかなりの部分は Phoenix Liveview にある。いかれた React/Node のお遊びなしでも、セクシーでリアクティブな Web サイトを作れる
      ただ正直に言うと、この記事の例は変だ。エラーやさまざまな便利機能を自動で出力してくれる Phoenix のフォームヘルパーではなく、なぜ素のタグを手書きしなければならないのか分からない。精神は理解できる
    • できる。単に htmx を使ってみればいい
  • 核心的な論点は、ユーザーが View Source を押して何が起きているのか理解できるべきだ、ということのように思う。Web サイトなら同意する
    Web アプリ、少なくとも 50 行を超えるものなら、型のある言語を使いたくなる可能性が高い。技術的には、特殊コメントによる型注釈と TypeScript コンパイラを付けた .js を使うこともできるが、あまり楽しくはなかった
    以前はこの考えにかなり強く惹かれていたし、最近のほとんどのサイトが読めない HTML の 1 行の塊になっているのは悲しい。依存関係なしに単一の HTML ファイル 1 つで全部をデプロイすることには、美しさと優雅さがある。ネットワークリクエストは 1 回で済む
    結局、編集を楽にするために「ビルドシステム」を作りはしたが、自分のビルドシステムは cat だ。人間が読める 1 つのファイルに入った、自己完結型のポータブルソフトウェアになるわけだ
    同じ文脈で、Web 開発のいちばん素晴らしい点は、Notepad と標準ブラウザだけで最初の対話型プログラムを作れることだ。HTML ファイルをブラウザにドラッグ&ドロップするだけでいい。魔法のようだ
    追記:自己完結型 HTML の予想外の利点を見つけた。ソフトウェアがビット腐敗に強くなる。昔のプロジェクトを Web Archive で開いてみたら、外部 JS ファイルが保存されていなかった。悲しい。一方これは、すべての JS が HTML の中にあるのでちゃんと読み込まれる。勝利だ
    https://web.archive.org/web/20210508133239id_/https://andai....
    これは昔の SodaPlay Constructor へのオマージュだ。エディタは作れなかった。ソースを見るのは自由だ

    • この部分には懐疑的だ。今では開発者パネルで「カーテンの裏側」をのぞく方法がたくさんある
      DOM ビュー、ネットワークタブ、ヒープビュー、組み込み JavaScript の整形表示機能がある
      もちろん「ソースを表示」は今でも重要だが、HTMX の人たちが言うほど、その重要性が今も絶対的なのかは疑問だ
    • 「依存関係なしに単一の HTML ファイル 1 つで全部をデプロイすることには、美しさと優雅さがある。ネットワークリクエストは 1 回で済む」
      今は data: URL があるので、これはさらに簡単になった。HTTP サーバーさえ不要な file:// URL の問題を避けるのにも役立つ
    • 追記:JavaScript に型注釈を拡張しようという提案があり、TypeScript の「かなり大きな部分集合」をブラウザで直接実行できるようになるかもしれない。良い!
      https://github.com/tc39/proposal-type-annotations
    • 筆者が単一ファイルシステムを主張しているわけではないと思う。代わりに言っておきたくはないが
  • 「動作の局所性」は、あまりにも大雑把に定義されたルールです。関心の分離に反するものを新しい名前で呼んでいるだけです
    CSSを遠隔の不気味な作用と呼ぶのも大げさすぎます。良い原則はいくつかありますが、論証はかなり弱く、もっとずっと単純に言えたはずです

    • インターフェースが多すぎるC#組織から来た立場としては、過度に抽象化されたシステムへの自然な反作用だと見ています
      「赤くて弾むボタンを青くて揺れるボタンに変える」ために、どのクラスに新しい実装が必要で、どれを再利用できるのかを探して、3〜7個のインターフェースやクラスの迷路をたどらなければならないなら、10分で済みそうだった変更が、半日かけてコンパイラや以前の開発者を心の中で罵る作業になります
      もちろん抽象化はすべきですが、1つのコンポーネントを修正するために6つのファイルを触らなくてもいいように、動作を一か所にまとめる方法も必要です
      https://htmx.org/essays/locality-of-behaviour/#conflict-with...
    • Tailwindもビルドステップであり、同じように「遠隔の不気味な作用」がたくさんあります。そうでなければ、単にインラインCSSを使っていたはずです
      Tailwindを使うということは、サードパーティライブラリがCSS仕様を代わりに抽象化し、その抽象化された準仕様がビルド設定に従って守られると信じることになります
    • 「動作の局所性」が大雑把に定義されたルールだというなら、関心の分離は違うのでしょうか?
      何を分離すべきなのか? どの線に沿って分けるのか? その線はどう決めるのか? どの関心事を別のクラス、フレームワーク、マークアップなどへ切り出すのがいつ妥当なのか? いつは一緒に置いておくほうがよいのか?
      答えは「状況による」です
      何も分離しなければスパゲッティになり、いつでもどこでも最大限に分離すれば、スパゲッティと同じくらい保守しにくい過剰抽象化コードになります
    • 明示されている主な目標は「Webソフトウェアのコードベースで作業できる人のプールを大きく広げること」です。一般的なプログラマー向けの助言とはかなり異なります
      デフォルトがうまく機能するなら、カスタマイズは必須ではありません。そのためCSSなどによる効率面の利点は、単純さより後回しになります
    • 問題は多次元的です
      HTMLを文書/表現言語と見るなら、スタイリングを否定することはできません。CSSはスタイリングだけでなくアニメーションも追加します
      いずれにせよCSSはアスペクト指向プログラミングと見ることもできます
      ここで描写されている本当の問題は、言語やフレームワークをまたぐ優れたツールが不足していることです
  • 可能なときにより単純なフレームワークに頼るのは理にかなっています。しかし、ビルドステップをなくそうという発想は、ほとんど完全な冗談に近いものです
    ビルドステップをより効率的にし、必要なら本番環境に含めなければよいのです
    また、なぜHTMLに属性を追加することを優先すべきなのかも分かりません。文書を作ってWebサイトとしてホスティングするのでしょうか? それ以外のどんな世界で、それが好まれるのでしょうか? CSSは探索しにくいものではなく、むしろより良いCSSの慣行を促すべきです
    フロントエンドのスクリプトがスタイリングを曖昧にすることはありますが、必要なければそのやり方に依存しなければよいだけです。JavaScriptで属性を入れるよりスタイルシートに入れるほうが簡単なので、これはすでに当然の話です
    必要なものだけを使えという類の助言の一部は筋が通っていて明白です。しかし残りは混乱しているか、露骨にばかげています。HTMLページ全体をコピーできることがなぜ良いことだと仮定されているのかも分かりません。正直どうでもよく、いくつかのページのHTMLを見られなくても、HTMLを学ぶためのリソースは文字通りすでに何百万とあります
    全体として首をかしげます

    • こうした内容のかなりの部分は、Web開発業界の複雑性崇拝への反応です
  • この記事全体がアンチパターンであり、悪い助言です。複雑なWebサイトを作る中で成長痛を経験したことのない人が書いたように読めます
    最初は私たちもこのようにWebサイトを作っていましたが、副作用、衝突するクラス名、ひどい内部可観測性のせいで壊れ始め、Reactが救いに来ました
    望ましいパターンはプログレッシブエンハンスメントであり、出力はきれいで圧縮されたHTMLであるべきで、JavaScriptがそれを補強するべきです。つまりビルドステップが必要です。この記事の助言とは正反対です

    • ReactでWebサイトを作ることにも落とし穴があり、Reactを使うということは多くの複雑性を導入するという意味です
      バックエンドですでにNodeJSを使っていないなら、本当に必要なときでない限りReactJSは避けたほうがよいです