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

HTMLファーストのサイトを構築したことで、ユーザー数が一晩で倍増しました

2026年6月10日原文(mohkohn.co.uk)

概要

  • HTMLファースト開発 でユーザー数が一夜で倍増した事例紹介
  • 公共サービス のため、どんな環境でも動作することが重視された
  • フォームデータの損失防止 やアクセシビリティ対応を徹底
  • バリデーション強化 と軽量なWebコンポーネント導入
  • 結果として、 利用完了率が劇的に向上 し、長期的な信頼性も確保

HTMLファースト開発でユーザー数倍増の実話

  • クライアントは 公共ユーティリティ企業、顧客満足度が96%以下で巨額の罰金リスク
  • 2度の高額な失敗後、 Reactアプリ も顧客苦情で3日で撤去
  • 既存のフォームは ローカルストレージ5MB制限 やアクセシビリティ欠如など問題山積
  • Astro を用い、HTMLファーストで再構築
    • JavaScript はWebコンポーネントでプログレッシブエンハンスメント
    • JavaScript未対応でも全機能が利用可能
  • 開発方針
    • 誰でも使える公共サービス を目指す
    • 低速回線や古いブラウザ でも動作保証
    • フォームデータの損失防止 を徹底
  • GOV.UKのような 軽量HTML設計 から着想
    • PSPなど旧世代端末でも情報取得可能な設計思想

要件と実装戦略

  • 各フォームセッションに ユニークID 付与
  • 各ステップごとに バックエンドへデータ保存 (アップロード含む)
  • JavaScript不要 でフォーム完了可能
  • 古い・低機能ブラウザ 対応
  • WCAG AAレベル のアクセシビリティ基準を厳守
  • モダンCSS・JavaScript は体験向上のため限定利用
    • 各フォームステップを 個別ページ
    • フォーム送信→APIバリデーション→リダイレクト のシンプルな構成
    • クライアントサイドでの過剰なロジック・リソース配布を排除

バリデーションとユーザー体験

  • Reactバリデーションの複雑さ を回避
    • HTML標準のバリデーション を活用
    • 独自Webコンポーネント( validation-enhancer)で
      • HTMLフォームをラップし、モダンなUIとアクセシビリティを両立
      • バリデーションエラーは aria-errormessage 等で視覚的に明示
      • 1KB未満の軽量実装
      • JavaScript失敗時は ブラウザ標準バリデーション へフォールバック
      • さらに失敗時は バックエンド側で最終バリデーション
  • 早期かつ多重のエラーハンドリングで ユーザー離脱を最小化
  • validation-enhancer は一般利用向けにも公開

効果と反響

  • リリース直後、フォーム完了者数が2倍に増加
    • JavaScript障害で離脱していたユーザー層を獲得
  • セッション管理によるデータ保持 で、1ヶ月後にフォーム完了した事例も
  • 後任エンジニアから「工数が増える」との懸念もあったが
    • 全ユーザー対応の重要性 を強調
  • 公共サービス として、古い環境や支援技術利用者も排除しない設計を徹底

技術的・文化的提言

  • モノポリー的公共サービス は全ユーザーに平等な体験を提供すべき
  • Webアプリは30年後も動作する堅牢性 が重要
  • ソフトウェア開発の「ワイルドウェスト」的な拡張志向を見直し
  • PlayStation Portable+3G回線 でも動作する設計こそ普遍的価値
  • HTMLファースト+プログレッシブエンハンスメント の再評価を推奨

Hackerたちの意見

Reactを使ってクソみたいなウェブサイトを作った人は、AstroやHTMLファーストアプローチ、他の技術を使っても同じようにクソみたいなウェブサイトを作るよ。

いや、そうじゃないよ。Astroはクライアントサイドレンダリングを選択しないといけないけど、React(サーバーコンポーネントとか使うと)は選択しないといけない。こういうシナリオではデフォルトが重要で、クソウェブサイトを作る平均的な開発者は、Astroの方がReactよりも速いサイトを作れると思うよ。

どんなツールでも悪い仕事はできるけど、どんなツールでも良い仕事はできないよ。

少なくとも速くてクソみたいなウェブサイトにはなるね。

その通り。クソな開発者は技術に関係なくクソなウェブサイトを作るよ。この記事は明らかに、クソじゃない開発者やユーザーのためにもっと良いことをしたい開発者を対象にしてる。良い開発者が作ったHTMLファーストの選択肢が、JS必須の選択肢よりもはるかに優れていたという経験談も提供してるしね。

その論理なら、どんな技術についても話す必要ないじゃん?

確かにそうだけど、Reactが必要な最小限の機能的なウェブサイトってどこで見つけられるの?

それには反対だな。リンクやフォーム、ボタン、入力を使っているHTMLサイトは、デフォルトで以下のことができるよ: * 戻る/進むボタンが機能する * ブラウザが提供する進行状況インジケーターが機能する * ユーザーにエラーメッセージを表示する - たとえそれが醜くても * キーボードナビゲーションに対応している SPAsでは、これらはすべて開発者が正しく実装しなきゃいけないことなんだ。SPAを使っていると、ボタンをクリックするとスピナーが出て、その後何も起こらないことがよくある。まだ処理中なのか、わからない。最終的には開発者コンソールを開いて、ネットワークリクエストを追跡して「ERR_BAD_EMAIL」と返ってきたJSON HTTPリクエストを見つけて、入力した内容を修正することになる。普通のフォーム送信なら、少なくともユーザーはエラーメッセージを見て、戻って修正できるからね。

HTMLファーストのアプローチより、クソみたいなReactアプリを作る方がずっと簡単だと思う。テンプレートやいつものGET/POSTフォームがある「オールドスクール」なRuby on Rails/Symfony/Djangoアプリは、基準に従わせて、ブラウザのデフォルトの動作に頼るように仕向けてくれる。JSが多いアプリでは、普通のbutton要素をコーディングするのも、クリック可能なdiv要素を作るのも同じくらい簡単。でも、divを使うと、キーボードナビゲーションや正しい要素の役割を忘れちゃうんだよね。aタグを使わずにフェイクリンクを作るのも簡単だし、内部のJSルーターを使ってURLを見せず、特に理由もなくミドルクリックのマウスも扱わないことがある。JSが少ない環境では、ちゃんとしたHTMLを使うのが一番簡単だから、ミスをしにくくなる。Next.jsみたいなちゃんとしたフレームワークを使っているコードベースでも、正しいセマンティクスや標準的な動作の利点に気づいていない人が多いのをよく見るし、結局UXが悪いウェブアプリになっちゃうことが多い。

ユーザーへの共感とリスペクトが、プロダクトマネージャーがやるべきことだよ。1ページあたり数十メガバイトを送るのは失礼だし、ユーザーに対して無礼だよ。

彼らはメガバイトが何か知らないんだよ。

「もしユーザーがビットを買えないなら、必要ない!」

Hacker Newsで議論の続きを見る