PlayLogic
記事一覧 タグ一覧
Astroでogimageを設定するならフロントマターを使うのサムネイル
もくじ

Astroでogimageを設定するならフロントマターを使う

Astroフレームワークでogimage画像をpublicフォルダ以外から取得するのに手間取った。この記事では、md(x)ファイルのフロントマターで指定した画像と同じものを、ogimageに指定する方法を解説する。

publicフォルダ以外にある画像というのは、./src/content/blog/post/thumbnail.jpgを想定している。

プラグインを用いれば何とかなるが、使いたくなかった。コンテンツコレクションと画像で説明されているように、md(x)ファイルのフロントマターで指定したサムネイル画像と同じものを、ogimageで指定したかった。
わざわざ新しい画像を生成するのも、publicフォルダにそのまま画像を入れるのも避けたかったんだ。

しかし、開発環境と本番環境でImageMetadata1srcプロパティの値が異なったため手間取った。

【結論】プラグインなしでogimageを設定するコード

conclusion.astro
<meta property="og:image" content={new URL(Astro.props.image.src, Astro.site).href} />

することは以下の3つ。

  1. md(x)ファイルのフロントマターでサムネイル画像への相対パスを指定する
  2. コンテンツコレクションスキーマで画像用のフロントマターを定義する
  3. ogimageのパスをnew URL()でつくって設定する

関連するのはastro・config.ts・md(x)・画像ファイルの4つ。

tree.txt
src
├─components
ogImage.astro
└─content
config.ts
└─blog
└─post
index.mdx
thumbnail.jpg

作業フォルダの構造

index.mdx
---
thumbnail: "./thumbnail.jpg"
---
## 記事がつづく

md(x)ファイルのフロントマターで画像への相対パスを指定するコード

config.ts
import { defineCollection, z } from "astro:content";
const blogCollection = defineCollection({
schema: ({ image }) =>
z.object({
thumbnail: image(),
}),
});
export const collections = {
blog: blogCollection,
};

コンテンツコレクションスキーマで画像用のフロントマターを定義する

ogImage.astro
---
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.sitehttps://{ホスト名}image.src_astro/thumbnail.{ハッシュ値}.jpgといった文字列がある。

new URL(…).hrefでそれぞれの文字列をつなげたURLの値を取得している。以下のように出力される。

post.html
<!-- 開発環境で出力されるコード -->
<meta
property="og:image"
content="https://playlogic.pages.dev/@fs/C:/Users/…/src/content/blog/post/thumbnail.jpg?origWidth=960&amp;origHeight=480&amp;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/cssjs、画像ファイルが生成されると知っていたら、手間取らなかったかもしれない。ImageMetadata.srcが、本番環境で_astro/下の画像ファイルパスを持つと気づけてよかった。

Astro.siteを使うには、astro.config.mjssiteを指定しておく必要がある。

astro.config.mjs
import { defineConfig } from "astro/config";
export default defineConfig({
site: "https://{本番環境のホスト名}",
});

脚注

  1. ImageMetadataは、画像をAstroファイルで直接importしたときの型。

ブログのホームに移動する ホームのアイコン この記事の最上部までスクロールする 上方向の矢印のアイコン