Astroでogimageを設定するならフロントマターを使う
Astroフレームワークでogimage画像をpublicフォルダ以外から取得するのに手間取った。この記事では、md(x)ファイルのフロントマターで指定した画像と同じものを、ogimageに指定する方法を解説する。publicフォルダ以外にある画像というのは、./src/content/blog/post/thumbnail.jpg
を想定している。
プラグインを用いれば何とかなるが、使いたくなかった。コンテンツコレクションと画像で説明されているように、md(x)ファイルのフロントマターで指定したサムネイル画像と同じものを、ogimageで指定したかった。
わざわざ新しい画像を生成するのも、publicフォルダにそのまま画像を入れるのも避けたかったんだ。
しかし、開発環境と本番環境でImageMetadata
1の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
したときの型。 ↩