Astro + microCMSの画像を最適化して高速で表示する。

画像をたくさん載せたら、表示スピードが落ちた。

microCMSの画像編集機能ページ(https://blog.microcms.io/microcms-with-image-editing/)では、画像のリサイズ、フォーマット変更などを行うAPIパラメータについて説明している。

このページをもとに、画像を最適化して表示する。

まず src > lib フォルダの中に新しいjsファイルを作成して新しい関数を作成する。

export function replaceImageTagsWithWebP(content) {
  return content.replace(/<img(.*?)src="(.*?)"(.*?)>/g, (match, p1, src, p3) => {
    const srcset = `
      ${src}?w=400 400w,
      ${src}?w=800 800w,
      ${src}?w=1200 1200w,
      ${src}?w=1600 1600w
    `;

    const webpSource = `
      <source srcset="${src}?fm=webp&w=400 400w,
                      ${src}?fm=webp&w=800 800w,
                      ${src}?fm=webp&w=1200 1200w,
                      ${src}?fm=webp&w=1600 1600w" 
              type="image/webp">
    `;

    const imgTag = `<img${p1}src="${src}?w=800"${p3} 
                    srcset="${srcset.trim()}" 
                    sizes="(max-width: 600px) 400px, 
                           (max-width: 900px) 800px, 
                           (max-width: 1200px) 1200px, 
                           1600px">`;
                           
    return `<picture>${webpSource}${imgTag}</picture>`;
  });
}

このコードは、HTML コンテンツ内の <img> タグを <picture> タグに変換し、WebP 形式の画像を優先して使用するための関数である。WebP 画像形式は、通常のJPEGやPNGよりもファイルサイズが小さいため、画像の読み込みを高速化し、Webサイトのパフォーマンスを向上させる目的で使用される。

[blogId].astroでは、記述したjsファイルを読み込む。

取得したpostのcontentを事前にサーバーサイドで画像を最適化した状態に変換してから、HTMLに表示する。

---
import Layout from '../layouts/Layout.astro';
import { replaceImageTagsWithWebP } from '../lib/replaceImage.js';

const { blogId } = Astro.params;
let post = await fetchContent(`blogs/${blogId}`);

post.content = replaceImageTagsWithWebP(post.content);
---
<Layout>
  <div set:html={post.content} />
</Layout>