Astroでogimageを設定するならフロントマターを使う
Astroフレームワークでogimage画像をpublicフォルダ以外から取得するのに手間取った。この記事では、md(x)ファイルのフロントマターで指定した画像と同じものを、ogimageに指定する方法を解説する。publicフォルダ以外にある画像というのは、./src/content/blog/post/thumbnail.jpgを想定している。
プラグインを用いれば何とかなるが、使いたくなかった。コンテンツコレクションと画像で説明されているように、md(x)ファイルのフロントマターで指定したサムネイル画像と同じものを、ogimageで指定したかった。
わざわざ新しい画像を生成するのも、publicフォルダにそのまま画像を入れるのも避けたかったんだ。
しかし、開発環境と本番環境でImageMetadata1のsrcプロパティの値が異なったため手間取った。
【結論】プラグインなしでogimageを設定するコード
<meta property="og:image" content={new URL(Astro.props.image.src, Astro.site).href} />することは以下の3つ。
- md(x)ファイルのフロントマターでサムネイル画像への相対パスを指定する
- コンテンツコレクションスキーマで画像用のフロントマターを定義する
- ogimageのパスを
new URL()でつくって設定する
関連するのはastro・config.ts・md(x)・画像ファイルの4つ。
src├─components│ ogImage.astro│└─content │ config.ts │ └─blog └─post index.mdx thumbnail.jpg作業フォルダの構造
---thumbnail: "./thumbnail.jpg"---
## 記事がつづくmd(x)ファイルのフロントマターで画像への相対パスを指定するコード
import { defineCollection, z } from "astro:content";
const blogCollection = defineCollection({ schema: ({ image }) => z.object({ thumbnail: image(), }),});
export const collections = { blog: blogCollection,};コンテンツコレクションスキーマで画像用のフロントマターを定義する
---import type { ImageMetadata } from "astro";
interface Props { image: ImageMetadata;}
const { image } = Astro.props;const ogImagePath = new URL(image.src, Astro.site).href;---
<meta property="og:image" content={ogImagePath} />ogimageのパスをつくって設定するコード
9行目でパスをつくっている。
Astro.siteにhttps://{ホスト名}、image.srcに_astro/thumbnail.{ハッシュ値}.jpgといった文字列がある。
new URL(…).hrefでそれぞれの文字列をつなげたURLの値を取得している。以下のように出力される。
<!-- 開発環境で出力されるコード --><meta property="og:image" content="https://playlogic.pages.dev/@fs/C:/Users/…/src/content/blog/post/thumbnail.jpg?origWidth=960&origHeight=480&origFormat=jpg"/>
<!-- 本番環境で出力されるコード --><meta property="og:image" content="https://playlogic.pages.dev/_astro/thumbnail.BtEdEmGp.jpg"/>開発環境と本番環境で出力されるコードの違い
ビルド時の画像ファイルの扱い
npm run buildすると./dist/フォルダにファイルがビルドされる。
そのとき、./public/にあるファイルと、./src/にあるファイルで処理が異なる。
./public/にある画像ファイルは、./dist/フォルダの直下に出力される。
./public/とは異なり、./src/にある画像ファイルは最適化されて./dist/_astro/に出力される。
まとめ
npm run buildでビルドしたあと、./dist/_astro/にcssやjs、画像ファイルが生成されると知っていたら、手間取らなかったかもしれない。ImageMetadata.srcが、本番環境で_astro/下の画像ファイルパスを持つと気づけてよかった。
Astro.siteを使うには、astro.config.mjsでsiteを指定しておく必要がある。
import { defineConfig } from "astro/config";
export default defineConfig({ site: "https://{本番環境のホスト名}",});脚注
-
ImageMetadataは、画像をAstroファイルで直接
importしたときの型。 ↩