First CH Appsサーバー処理を伴う小さなアプリ置き場

EN

First CH Apps / ページ内画像診断

ページ内画像診断

URLを入れると、そのページの img / picture を1枚ずつ診断します。フォーマット(JPEG のままか・WebP / AVIF になっているか)・loading="lazy" の有無・width / height の指定・alt を並べ、先頭30枚は HEAD リクエストで実ファイルサイズと実際の形式まで実測します。

画像の変換そのものは tools.first-ch.com の WebP / AVIF 変換(端末内で完結・アップロードなし)が担当します。ここは「どの画像を直すべきか」を決めるための診断で、直す作業はブラウザ内のツールへ渡します。

対象は入力した1ページだけです(サイト全体は巡回しません)。実測は先頭30枚までで、超過分は「未検査」と明示します。

直し方

JPEG / PNG は WebP か AVIF へ変換します。写真は AVIF、透過やイラストは WebP が扱いやすく、どちらも主要ブラウザが対応済みです。古い環境も残したい場合は <picture> で元の形式を fallback に置きます(source に type="image/avif" と type="image/webp" を並べ、最後の img が fallback)。

変換は tools.first-ch.com の「画像→WebP一括変換」「画像→AVIF一括変換」で行えます。ブラウザ内で処理が完結するため画像はアップロードされません(AVIF 側は <picture> のコード片も出力します)。

width / height は「元画像の実寸」をHTMLに書きます。CSS で width:100% にしていても、属性があればブラウザが縦横比から場所を先に確保するため、画像が現れた瞬間のガタつき(CLS)が消えます。

loading="lazy" は、最初の画面に映らない画像だけに付けます。先頭の大きな画像(LCPの対象になりやすい)には付けず、必要なら fetchpriority="high" を付けて優先して読ませます。

表示寸法より大きな画像をそのまま置かないでください。600px幅で表示する画像に3000px幅の元データを使うと、転送量の大半が無駄になります。srcset と sizes で表示幅ごとの候補を用意すると、端末に合った1枚だけが読み込まれます。

alt は「その画像が伝えている情報」を短く書きます。装飾だけの画像は alt="" と書いて読み上げ対象から外します(属性ごと省略すると、スクリーンリーダーはファイル名を読み上げます)。

判定の基準

対象は入力された1ページのHTMLだけです。サイト全体は巡回しません。CSS の背景画像・JavaScript が後から差し込む画像は見えません。

実ファイルサイズは HEAD リクエストで実測します(先頭30枚まで・同じURLは1件にまとめます)。無料枠のサブリクエスト上限に収めるための線引きで、超過分は「未検査」と明示します(黙って落としません)。

HEAD に対応していないサーバーと、HEAD に Content-Length を付けないサーバー(Cloudflare Pages など)には、GET(Range: bytes=0-0)で1回だけ測り直します。本文は読まずに捨てるので、画像そのものはダウンロードしません。それでもサイズが分からない場合は「サイズ不明」と表示します。

形式は Content-Type を優先し、返らない場合だけ拡張子で判定します。拡張子が .jpg でも WebP が返る(Accept ヘッダーによる出し分け)構成は、変換済みとして扱います。

重さの線引きは1枚あたり 200 KB で「要確認」、500 KB で「要修正」です。

width / height は数値で両方書かれている場合のみ「指定あり」とみなします(% や auto は場所を確保できません)。style 属性に aspect-ratio がある場合は指摘しません。CSSファイル側の指定は見えません。

loading="lazy" は2枚目以降に無ければ指摘し、逆に先頭の1枚に付いていれば指摘します(LCPが遅れるため)。data-src だけの画像(JavaScript の遅延読み込み)は lazy の指摘対象から外します。

picture の中の img は、同じ picture 内に type="image/webp" / type="image/avif" の source があれば「変換済み」として扱います。

一覧は120件までで、超過分は件数のみ表示します。走査するのはHTMLの先頭512KBまでです(無料枠のCPU上限に収めるため)。

SERVER PROCESSING — サーバーへ送るもの・保存するもの

送るもの: 入力されたURLだけ。当社サーバー(Cloudflare Workers)がそのURLを公開GETで1回取得し、見つかった画像のうち先頭30枚に HEAD リクエストを送ります(画像の中身はダウンロードしません)。Cookieもログイン情報も送りません。

保存するもの: ありません。検査はリクエストの中だけで完結し、URL・結果ともデータベース(KV/D1)へ書き込みません。処理が終わった時点でメモリから消えます。

返すもの: 抽出した画像のURL・属性・実測したサイズと形式・判定だけです。取得したページの原文も画像そのものも再配信しません(このアプリは他サイトの画像を中継するためには使えません)。

注意: 取得は公開GET / HEADのみで、社内ネットワーク・localhost・プライベートIP宛のURLは受け付けません。

APIとして使う

POST /image-audit/api/inspect に JSON({"url": "https://example.com/"})またはフォームを送ると、同じ診断結果が JSON で返ります。抽出だけなら /image-audit/api/extract、URL一覧のサイズ実測だけなら /image-audit/api/head(1回10件まで)が使えます。ページ側のJavaScriptは、この2本と判定文を組み直す /image-audit/api/notes を使って段階表示しています。