CMSの画像を静的サイト(SSG)で表示する3つの方法
Contentful やWordPressなどのCMSを利用して静的サイト(SSG)を構築する際、意外と悩むポイントが画像の表示方法です。
CMS側に画像用のリソースを提供していることもありますが(例:res.example.com/123456/images/sample.jpeg)、帯域制限ありでアクセスが多いと画像が表示されなくなったり、画像配信元とパス(URL)が違うことで都合が悪いこともあったりします。
また、 WordPressをバックエンドとしてだけ使う 場合、画像の配信元がそのドメインになってしまうので(例:blog.example.com/wp-content/uploads/2023/12/sample.jpeg)、故意にその構成にしている場合は別として、スマートさに欠ける側面もあります。
そのため、サイト構成や規模によってどの形での画像配信が最適か判断する必要があるのですが、主に3つの方法があるので、簡単な順にご紹介します。
外部リソースを利用する
Headless CMSの代表格である Contentful や日本製の MicroCMS を始め、サービスとして提供されているCMSを使う場合は、画像用のリソースも利用することができるため便利ですが、画像の表示はリソースを大量に消費するため、何らかの制限を設けているCMSがほとんどです。そのため、無料プランで規模が大きいサイトを稼働させる場合は後述する他の方法を利用するのがベターです。
一方、自分でホスティングするタイプの Strapi やWordPressをCMSとして利用する場合、上記のような制限はありませんが、アップロード容量や帯域がホスティングサービス(レンタルサーバー)に依存するため、料金が安くてスペックが弱いサーバーだと、画像がアップロードできない、表示に時間がかかるなど、また違った問題が発生する可能性があります。
そのため、どちらにしても外部リソースから直接画像を配信するのは避けた方が無難です。
WordPressには便利なプラグインもある
WordPressには Cloudinary のプラグインがあるのですが、これは同名のサービスをWordPress上で簡単に利用できるようにしたものです。無料で使えます。
このプラグインは、WordPressの管理画面上でアップロードした画像をCloudinaryの画像リソースに変換して配信してくれるため、静的サイト側でもCloudinaryのリソースを利用することができます。
拡張機能(モジュール)を利用する
いくつかの静的サイトジェネレーターには、外部リソースの画像をビルド時にダウンロードして静的サイトに含めてくれる拡張機能があります。
Gatsby.jsの gatsby-plugin-image 、Nuxt.jsの @nuxt/image 、Astroの @astrojs/image などがそうです。Next.jsにも next/image の機能がありますが、静的サイト自身に画像を含めることはできません。
そのため、利用する静的サイトジェネレーターに指定がない場合は、Gatsby.js、Nuxt.js、Astroのいずれかを利用すると画像周りで苦労しません。
Gatsby.jsに関しては、開発時に画像をローカルにキャッシュしてくれる気の利いた仕様になっているのでおすすめです。
ビルド時に外部リソースの画像を静的生成する
静的サイトジェネレーターにモジュールがない場合やカスタマイズしたい場合、手間はかかりますが、自分で同様の機能を実装することもできます。
例えば、執筆時点で Nuxt3のモジュールには画像の静的生成がない のですが、リリースが待てず 同様の機能を自作 した経緯があります。
一連の流れは 画像を静的生成する方法 でサンプルコードと共に詳しくご紹介しているので、ぜひご覧ください。