ファイルを置く第13章 ・ 読むのにかかる時間 約9分

速くする:軽い画像を届ける

元は大きいまま、届けるときだけ小さく

スマホで撮った写真は、1枚で3MBを超えることがあります。それを一覧に20枚並べたら、60MBです。開くたびに60MB。これは遅いというより、失礼な作りです。この章で直します。

この章でできるようになること

  • なぜ画像一覧が重くなるのかを説明できる
  • ドメインが無くてもできる、軽くする手当てを入れる
  • Cloudflareの画像変換の仕組みと、無料枠の数字を知る

なぜ重いのか

原因は単純です。4000ピクセルの写真を、200ピクセルの枠に押し込んでいるからです。表示は小さくなりますが、送られてくるデータは元のままです。20分の1の大きさで表示するために、20倍のデータを運んでいます。

横にスクロールできます

元の画像と、必要な大きさ 元の写真は大きく重いのに、一覧で必要なのは小さな画像です。変換して小さくしてから届けます。 元の写真 4000px 約3MB R2に大事に保管 変換 小さくする 形式も軽いものに 一覧に必要な分 400px 約30KB 100分の1で足りる
元の写真は消しません。届けるときだけ小さくします。

手当て1:そもそも小さい版も保存しておく(ドメイン不要)

一番確実で、誰でも今すぐできる方法です。アップロードのときにブラウザ側で縮小した小さい版も作って、2つ保存します。一覧では小さい版、拡大表示では元の版を使います。

Claude Codeにこう頼みます

画像アップロードを、一覧表示が軽くなるように改良してください。 ・送信する前に、ブラウザ側で長辺600pxくらいに縮小した版を作る ・元の画像は images/ に、小さい版は thumbs/ に、対応が分かるキーで保存する ・一覧では thumbs/ の画像を表示し、クリックしたら元の画像を表示する ・縮小に失敗した場合は、元の画像だけを保存して、一覧でもそれを使う 作ったら、実際にどれくらい軽くなったかを数字で教えてください。

この方法の良いところは、ドメインが無くても動くことと、追加料金がかからないことです。欠点は、あとから「もっと小さくしたい」と思っても、保存済みの分は作り直しになることです。

手当て2:Cloudflareに変換させる(ドメインが必要)

Cloudflareには、画像を届ける瞬間に加工する仕組みがあります。R2には元の写真だけを置いておいて、URLで大きさを指定すると、その場で縮小されたものが返ってきます。あとから何度でもサイズを変えられるので、こちらのほうが本来は筋がいいです。

ただし前提が1つあります。この機能は、Cloudflareに追加したドメイン(ゾーン)に対して、自分で有効にする必要があります。第7章でドメインをつないでいない人は、まだ使えません。飛ばして構いません。

有効にする場所は、管理画面のメディア → Images → Transformations です。ゾーンの一覧に自分のドメインが「無効」と並んでいるので、右端のメニューから「有効にする」を選びます。押すだけで、待ち時間はありません。

この画面には「ユニークな変換 0 / 5,000」というカウンタも出ています。今月あと何回変換できるかが、ここで一目で分かります。不安なら、ときどき覗いてください。

実際に測った結果

  • 元画像(1200×800のPNG)… 122,539バイト
  • 幅400・形式おまかせに変換 … 1,713バイト(AVIFという新しい形式で返ってきました)
  • つまり、約1.4%。70分の1以下です

透過のあるPNGは、透過を保ったまま返ってきました。ロゴやアイコンが黒く潰れる心配はありません。

お金の話もはっきりさせます。公式の料金ページによると、無料プランでも月5,000回までのユニークな変換が無料です。そして超えたときの挙動が親切で、新しい変換はエラーになりますが、すでに変換済みでキャッシュされているものは、そのまま表示され続けます。サイトが真っ白になるわけではありません。

さらに、写真をR2に置いたまま変換だけ使う場合は、保管料や配信料はかかりません(それらはCloudflare Imagesに画像を預ける使い方のときの料金です)。この教科書の構成なら、変換の回数だけを見ていれば十分です。

ユニークな変換

「同じ画像を、同じ設定で変換したもの」は1回と数えます。1枚の写真を400pxにする変換が1回。それを1万人が見ても、変換の回数は増えません。2回目以降はキャッシュから返るからです。月5,000回というのは組み合わせの数であって、閲覧数ではありません。ここを誤解すると、必要以上に怖がることになります。

ドメインをつないである人向け

R2に置いてある画像を、Cloudflareの画像変換で小さくして配りたいです。 ・まず、私のドメインで画像変換が有効になっているかを確認する方法を教えてください ・有効なら、一覧では幅400px、拡大表示では幅1200pxで配信する形に変更してください ・対応している場合は、より軽い形式(WebPなど)で配信されるようにしてください 無料枠を超えないように、変換の種類は増やしすぎない形にしてください。

手当て3:キャッシュを効かせる

第2章で出てきたキャッシュです。一度届けた画像を、Cloudflareが世界各地に持っておいて、2回目からはそこから返します。変換の回数を減らす意味でも、ここは効きます。

写真は、あとから中身が変わることがほとんどありません。だから長めに覚えさせて構いません。逆に、同じキーで画像を差し替える運用をしていると、古いものが表示され続けます。第9章で「同じキーは上書きされる」と書いたのは、ここにつながっています。差し替えるときは、キーごと変えるのが安全です。

うまくいったか確認する

  • 一覧ページの表示が、体感で明らかに速くなった
  • Claude Codeに「一覧ページで読み込まれている画像の合計サイズ」を計測してもらい、前より小さくなっている
  • 拡大表示では、元のきれいな画像が出る
  • スマホのモバイル回線でも、待たされずに開く

よくあるつまずき

サムネイルがぼやけている
縮小しすぎです。画面上の表示幅の2倍くらいを目安にしてください。スマホは画面の密度が高いので、200pxで表示するなら400pxくらい必要です。
変換が効かず、元のサイズのまま届く
ドメインで画像変換が有効になっていない可能性が高いです。管理画面のメディア → Images → Transformations を開いて、自分のドメインが「有効」になっているか確認してください。
PNGで上げたのに、JPEGで返ってくる
不具合ではありません。透過を使っていない画像は、より軽い形式に自動で置き換えられます。透過のある画像は、透過を保ったまま返るので安心してください。
画像を差し替えたのに、古いものが出続ける
キャッシュが効いています。同じキーで上書きしたときに起きます。キー自体を変えて保存し直すのが確実です。
一部の画像だけ表示されない
変換できない形式(HEICなど、iPhoneの標準形式)が混ざっている可能性があります。アップロード時にJPEGやPNGに変換してから保存するのが無難です。

この章のまとめ

元の写真は大事に保管したまま、届けるときだけ小さくする。これが基本の考え方です。ドメインが無ければアップロード時に小さい版を作り、あればCloudflareの変換に任せます。どちらでも、一覧は見違えるほど軽くなります。

次はいよいよ最終章です。ここまで作ってきた部品を1つの作品にまとめて、世界に公開します。

章末チェックリスト