Astroには前処理など任意のタイミングで何らかの処理を実行したいとき、フックを使って処理を差し込むことができます。
この記事ではAstroでフックを使う方法を説明します。
フックは、Astro側であらかじめ定義されたタイミングで開発者が任意の処理を差し込める仕組みです。
フックにはビルド開始直前を表す astro:build:start やconfigの設定完了直後を表す astro:config:done などがあります。
詳細は下記の公式ドキュメントをご覧ください。
例えば astro:build:start フックを使って何らかの処理を実装したとき、インテグレーションを定義して処理を記述します。
インテグレーションを定義するために src/integrations ディレクトリを作成します。
ここでは記事ごとのOG画像を事前にアップロードする og-image-uploader インテグレーションを例に説明します。
src/integrations/og-image-uploader.ts を下記のように作成しました。
import type { AstroIntegration } from 'astro'
import { getAllPosts } from '../lib/notion/client'
import { uploadImageWithKey } from '../lib/cloudinary/client'
export default (): AstroIntegration => ({
name: 'og-image-uploader',
hooks: {
'astro:build:start': async () => {
const posts = await getAllPosts()
await Promise.all(posts.map(post => {
if (post.FeaturedImage) {
return uploadImageWithKey(post.FeaturedImage, post.PageId)
}
return Promise.resolve()
}))
},
},
})
インテグレーションは AstroIntegration インターフェイスを満たしている必要があります。
AstroIntegration インターフェイスは下記ページに説明があります。
name には任意の名前を設定し、hooks に任意にフックを定義します。
今回はビルド直前を表す astro:build:start を定義しています。
戻り値は void | Promise<void> である点に注意しましょう。必要な処理は return なしに実行します。
上記の例では Promise.all() で並列に処理を実行しています。
定義したインテグレーションは astro.config.mjs で設定します。
下記は公式ドキュメントです。
下記のようにして defineConfig の integrations に渡してあげることで設定できます。
// ...
import OGImageUploader from './src/integrations/og-image-uploader'
// ...
export default defineConfig({
site: '...',
integrations: [
OGImageUploader(),
],
})
正しく設定できていれば、ビルド実行時に下記のようなログが見つかるはずです。
Waiting for the og-image-uploader integration...
以上です。この記事ではAstroでフックを使う方法を説明しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます