My Blog Just Got Faster: Cloudflare Workers and AVIF Support

Matthias Endler

ブログがさらに高速に:Cloudflare WorkersとAVIF対応

このサイトが速いって話、しましたっけ? そうそう、しました何度も

その理由はいくつかあります(普通のものから、じわじわと正気を失い始めた兆候まで):

  • 📄 静的サイト
  • ☁️ Cloudflare CDNでキャッシュ
  • 🔗 ️HTTP/2とHTTP/3に対応
  • 🚫 Webフォントなし(残念ながら)
  • エッジワーカーで動くアクセス解析(Google Analyticsなし)
  • 🌸 可能な限りJavaScriptを避ける。用途の90%はCSSでまかなえます。
  • 🖼️ ページの再レイアウトを防ぐため、HTMLで画像の幅と高さを指定
  • 👍🏻 インライン化して最適化したSVGグラフィックと、手書きのCSS
  • 🚅 静的WASM検索(遅延読み込み)
  • 🏎️ トップページ全体が、グラフィックを含めても10K未満(Brotli圧縮時)。そのため最初のHTTPラウンドトリップに収まるはずです。
  • 💟 なんと、ファビコンまでサイズを最適化しています。追記:この記事のおかげで、今はSVGアイコンを使っています。

とはいえ、2020年ですよ。誰もがファビコンを最適化しているんですよね? ……ですよね?

ところが、ほかの多くのサイトは、私ほどユーザーのデータ通信量について考えていないようです。というより、控えめに言っても過ぎた表現ですね。まったく気にしていません。でも私にとっては、軽さこそ美しさです!

待って、画像はどうするの?

図やイラストにはSVGを使うのが好みです。写真の場合だけ、JPEGかWebPを使います。

正直に言うと、私はWebPがあまり好きではありません。要するに、MozJPEGで圧縮したJPEGより小さくなるとは限らないのです。詳しく読みたければ、Mozillaのバグトラッカーで長く続いている議論があります。現在でも、SafariはWebPに対応していません

AVIFの登場 👋

新世代の画像圧縮フォーマット、AVIFを紹介しましょう。これを見てください:

[ReachLightSpeed.com](https://reachlightspeed.com/blog/using-the-new-high-performance-avif-image-format-on-the-web-today/)
出典:ReachLightSpeed.com

すでにChrome 85とFirefox 80が対応しています。
そして私は、ハリケーンに襲われたような衝撃を受けました 🌪️:

😲 なんてこった、AVIFがもう主要ブラウザーで使えるの!?
私のブログでも使いたい!

ええ、そうとも言えますし、そうとも言えません。

私のブログにはZolaを使っていますが、ZolaのAVIF対応はまだありません。でも今すぐ欲しい! そこで、古いJPEGやPNG画像からAVIF画像を作成する不格好なRustスクリプトを急ごしらえしました(そういうものですよね)。念のため、元の生ファイルも残してあります。

内部では、Kornel Lesińskiによるcavifを呼び出しています。

データ通信量の削減

ブログでAVIFを使った結果は、まさに驚くべきものでした:

[endler.dev/2020/sponsors](https://endler.dev/2020/sponsors)の画像合計サイズ
endler.dev/2020/sponsorsの画像合計サイズ

ブラウザーを確認する

ただ、ちょっと待ってください……あなたのブラウザーは、本当にAVIFを表示できますか?

「はい」と表示されたなら、準備完了です。
「いいえ」と表示されたなら、いくつか選択肢があります:

  • Firefoxの場合:アドレスバーにabout:configと入力して、avifを検索します。
  • Chromeの場合:最新版に更新されていることを確認してください。
  • Safariの場合:あなたが人生で何をしているのか、私にはよく分かりません。代わりに本物のブラウザーを試してください。😏

回避策I:古いブラウザー向けのフォールバック

HTMLの素晴らしいところは、ブラウザーが未知の新しい構文を無視してくれることです。そこで<picture>要素を使って、適切なフォーマットを配信できます。(見て、お母さん、JavaScriptなし!)

<picture>
  <source srcset="fancy_browser.avif" />
  <source srcset="decent_browser.webp" />
  <img src="meh_browser.jpg" />
</picture>

実際のコードはもう少し複雑ですが、考え方は分かるでしょう。

回避策II:Github Pagesで間違ったContent-Typeが返される問題

ただし、GithubとAVIFには厄介な問題が1つありました。GithubのサーバーがContent-Type: application/octet-streamヘッダーを返していたのです。

そのため、Firefoxでは画像が読み込まれませんでした

私のページはGithubがホスティングしているので、こちら側で直す方法はありません。今までは! 以前からCloudflareのWorkers Sitesを試してみたいと思っていたのですが、このバグをきっかけに移行することにしました。基本的には、ウェブサイト全体をCDN上でエッジワーカーとして実行します。自前のウェブサーバーは必要ありません。何が素晴らしいかというと、これでサイトがどこでも高速になったことです。遠隔地であっても、サーバーへの往復はもう必要ありません。

エッジワーカーを実行することで、リクエストオブジェクトとレスポンスオブジェクトを完全に制御できるようにもなりました。ワーカーのレスポンスをインターセプトするために、この小さな逸品を追加しました:

if (/\.avif$/.test(url)) {
  response.headers.set("Content-Type", "image/avif");
  response.headers.set("Content-Disposition", "inline");
}

これで万事解決です。Firefoxもご機嫌です。レスポンスオブジェクトの変更についてはこちらで詳しく読めます。

Workers Sitesのもう1つの副作用として、本番デプロイにかかる時間が、今では1分になりました。

Cloudflare移行後のパフォーマンス結果

移行前のウェブサイトの応答時間
移行前のウェブサイトの応答時間
出典:KeyCDN
移行後のウェブサイトの応答時間
移行後のウェブサイトの応答時間
出典:KeyCDN
移行前のページサイズと評価
移行前のページサイズと評価
出典:Pingdom.com
移行後のページサイズと評価
移行後のページサイズと評価
出典:Pingdom.com

よく知られたサイトとの比較から逃げる必要もありません:

私が読んでいるほかのブログとの比較
私が読んでいるほかのブログとの比較
出典:Speedcurve

さらに読む

原文は Matthias Endler により に公開されました。

この記事は「gpt-5.6-luna」を使用して翻訳されました。